2022.8.14补充:sealos3.0原部署方式已下线,4.0可以参照官方文档,笔记待补充
Sealos离线部署K8s集群
准备工具
xshell,xftp,centos 7.9,k8s 1.18.9离线安装包
开始安装:
一、安装系统
1. 选择最小安装
2. 分区
3. 设置账户
二、系统设置
1. 网络设置
集群内服务器设置为静态IP,使用vim
修改 /etc/sysconfig/network-scripts/ifcfg-ensxxx
# 修改配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ensxxx
# 配置静态IP
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=192.168.5.130
GATEWAY=192.168.5.2
NETMASK=255.255.255.0
DEVICE=eth0
MTU=1500
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
ZONE=public
DNS1=8.8.8.8
修改保存之后重启网络
systemctl restart network
2. 设置hostname
hostname统一格式为 ==节点名.k8s==
如:master.k8s,node1.k8s,node2.k8s
# 修改hostname
hostnamectl set-hostname master.k8s
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1 $(hostname)" >> /etc/hosts
3. 更换yum源
# 备份原配置文件
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 下载阿里云yum
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 两条命令任选其一
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理缓存
yum clean all
# 生成新的缓存
yum makecache
添加epel源(如果已存在,同理执行备份替换)
# 查看一下系统是否已有epel
rpm -qa |grep epel
# 如果已存在,卸载以前的epel以免受影响
rpm -e epel-release
# 更换为阿里的epel源
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
# 清理缓存
yum clean all
# 生成新的缓存
yum makecache
4. 挂载数据硬盘
无需挂载则跳过此步骤
(1)运行fdisk -l
查看硬盘详细信息
(2)初始化分区
执行fdisk /dev/sdc
输入p打印分区表,查看分区情况,可以看到,标记处无任何分区信息
输入n新建分区
输入p再次查看分区表
输入w保存退出
执行fdisk -l
查看已创建的分区
(3)创建物理卷
执行partprobe /dev/sdc
,在不重启系统的情况下重新读取分区表信息
# 安装lvm2工具
yum install lvm2
# 创建物理卷
pvcreate /dev/sdc1
格式化磁盘
# ext4、xfs格式按需选择
mkfs.xfs /dev/sdc1
(4)创建挂载点,并挂载磁盘
mkdir /data
mount /dev/sdc1 /data
执行df -Th
可查看挂载情况
(5)设置系统开机自动挂载磁盘
执行blkid /dev/sdc1
查看磁盘的uuid
编辑/etc/fstab
文件,在末尾添加新增的磁盘信息
# UUID [挂载点] [磁盘类型] defaults 0 0
# 二者任选其一
# /dev/sdb1 /data xfs defaults 0 0
执行mount -a
检查配置
注:添加配置文件保存后一定要mount -a检查通过再执行reboot重启
5. 同步集群时间
执行crontab -e
,在末尾添加以下cron定时任务,集群中的每个节点都必须执行
# 每天零点零一分执行时间同步任务
01 00 * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1 &
保存后显示定时任务创建成功
执行contab -l
,可查看已创建的任务
6. 关闭防火墙
systemctl stop firewalld # 临时关闭,重启失效
systemctl disable firewalld # 永久关闭
7. /usr/local/bin 全局命令设置
执行vim ~/.bashrc
,在末尾添加
export PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:"
保存后执行刷新读取命令
source .bashrc
此项跟后续安装sealos
,kubens
,k8sreload
工具有关,若不使用该工具则跳过
三、准备环境
# 创建目录
# k8s 部署目录
mkdir -p /home/xxx/deploy
# 应用目录
mkdir /home/xxx/deploy/xxx
# 资源目录
mkdir /home/xxx/res
# 插件目录
mkdir /home/xxx/res/plugin
# 应用基础镜像目录
mkdir /home/xxx/res/images
# 应用业务镜像目录
mkdir /home/xxx/res/busi
mkdir /home/xxx/res/busi/service
# 目录结构
└── xxx
├── deploy # 项目部署文件
│ └── xxx
└── res # 资源目录
├── busi # 应用业务镜像目录
├── images # 基础镜像
├── kube1.18.9.tar.gz # k8s离线包
├── plugin # 插件
├── service # 服务端
└── web # 客户端
四、安装k8s
k8s版本选择1.18.9
1.安装sealos
sealos是k8s一键安装工具,官网地址:https://www.sealyun.com/
# 下载并安装sealos, sealos是个golang的二进制工具,直接下载拷贝到bin目录即可, release页面也可下载
wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos && chmod +x sealos && mv sealos /usr/local/bin/
# 上传离线资源包到主节点
2.初始化集群
sealos init 命令解释, https://www.sealyun.com/instructions
# 一主双从Kubernertes集群
sealos init --master 192.168.5.130 \
--node 192.168.5.131 \
--node 192.168.5.132 \
--user root \
--passwd '123456' \
--pkg-url /home/xxx/res/kube1.18.9.tar.gz \
--version v1.18.9
2.1检查集群状态
kubectl get nodes -o wide
2.2修改端口范围
k8s NodePort 端口范围设置为30000-39999
# 编辑kube-apiserver.yaml
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加端口配置到 spec.containers.command.kube-apiserver
- --service-node-port-range=30000-39999
2.3设置master支持部署pod
此项根据实际情况选择,如果不需要master支持pod则跳过
#允许master节点部署pod
kubectl taint nodes --all node-role.kubernetes.io/master-
#如果不允许调度
kubectl taint nodes master1 node-role.kubernetes.io/master=:NoSchedule
#污点可选参数
# NoSchedule: 一定不能被调度
# PreferNoSchedule: 尽量不要调度
# NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
2.4 node节点添加标签
格式要求:"xxx/role"=master,"xxx/role"=node1,"xxx/role"=node2
# 查看节点标签详细信息
kubectl get nodes --show-labels
# 设置标签
kubectl label nodes master.k8s "xxx/role"=master
kubectl label nodes node1.k8s "xxx/role"=node1
kubectl label nodes node2.k8s "xxx/role"=node2
2.5 修复子节点kubectl 命令不可用
此项按需选择,如果无需子节点支持kubectl命令则跳过
# 拷贝master节点/etc/kubernetes/admin.conf文件至node节点
scp /etc/kubernetes/admin.conf root@192.168.5.131:/etc/kubernetes/
# 在对应的node节点执行以下命令
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
2.6 k8s tab键修复
# 安装bash-completion
yum install -y bash-completion
# 编辑~/.bashrc
vim ~/.bashrc
# 在末尾添加以下行
source <(kubectl completion bash)
# 最后运行
source ~/.bashrc
source /etc/profile
# 对应的node节点也需运行上面2行命令或退出重新登录
2.7 更换docker根文件目录
docker文件默认路径是 /var/lib/docker
,检查该目录磁盘空间是否足够,根据实际情况修改。
注:如果docker根目录文件所处的磁盘空间较小,一定要将docker根文件目录更换至空间较大的数据盘下
修改docker文件目录
# 停止所有节点上的docker
systemctl stop docker
# 编辑 /etc/docker/daemon.json,修改data-root目录
vim /etc/docker/daemon.json
# 移动docker的数据文件到新目录
mv /var/lib/docker /data/docker
# 启动
systemctl start docker
注:所有节点依次执行,修改此项尽量不要使用 xshell发送输入命令到所有会话 功能,网络延迟对同时发送命令可能会产生较大的影响
3. 添加k8s拉取harbor镜像账户
3.1添加docker仓库地址
# 编辑daemon.json
vim /etc/docker/daemon.json
{
"insecure-registries": "harbor.xxx.com"
}
3.2 创建k8s登录harbo
a.命令行方式创建
kubectl create secret docker-registry approval-docker-harbor \
--docker-server=harbor.xxx.com \
--docker-username=xxx\
--docker-password='123456'
b.yaml方式创建
apiVersion: v1
kind: Secret
metadata:
namespace: xxx
name: approval-docker-harbor
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: xxxxxxxxx
4. 安装ingress
注:ingress官方建议将ingress部署至master节点,该部署手册中未开启master支持pod调度的功能,在执行部署命令之前需先执行
# 2.4节已执行过该命令,无需重复添加
kubectl label nodes master.k8s "xxx/role"=master
master节点添加标签后需编辑 ingress.yaml 文件,执行vim ingress.yaml
,添加nodeSelector标签,将该pod直接调度到master节点
最后执行部署
# 进入到ingress文件夹
cd /home/xxx/res/plugin/ingress
kubectl apply -f ingress.yaml
5. 安装Kuboard
此处安装Kuboard v2版本,Kuboard官网地址:https://kuboard.cn
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml
# 查看Kuboard运行状态
kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system
获取登录Token(注意保存token,切勿泄露)
# 在master节点执行以下命令
# 管理员
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
# 只读用户(无操作权限)
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-viewer | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
Kuboard管理地址:192.168.5.130:32567 (任意节点ip + 端口均可访问)
6. 安装NFS
nfs-client-provisioner.yml需要添加nodeSelector节点选择标签
6.1 安装NFS服务端
# 安装nfs相关工具
yum install -y nfs-utils
# 在文件/etc/exports中添加以下内容(vim /etc/exports)
#格式:[共享目录]:[共享主机](权限功能)
vim /etc/exports
/data/nfs 192.168.0.0/16(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501,fsid=0) localhost(rw)
# 创建nfs共享目录
mkdir /data/nfs -p
# 启动nfs
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server
exportfs -r
#检查nfs创建结果
exportfs
#输出结果如下
/data/nfs <world>
6.2 安装NFS客户端
yum -y install nfs-utils
# 启动
systemctl start nfs-utils
systemctl enable nfs-utils
#查看相关信息
rpcinfo -p
#测试挂载,单节点不需要这步
mount [nfs服务ip]:[nfs共享路径] [客户机挂载目录]
6.3 k8s部署NFS
添加nodeSelector节点选择标签(同理安装ingress)
# 添加node节点标签
# 若2.4节已执行过该命令,则此处无需重复执行
kubectl label nodes node1.k8s "xxx/role"=node1
# 进入到nfs文件夹
cd /home/xxx/res/plugin/nfs
# 修改nfs服务地址,同时添加nodeSelector节点选择标签,参考下图
vim nfs-client-provisioner.yml
# 执行部署
kubectl apply -f nfs-client-provisioner.yml
kubectl apply -f class.yml
kubectl apply -f rbac.yml
NFS部署在default
命名空间下,执行kubectl get pod
检查NFS状态
至此,k8s基础环境部署完毕
五、应用
1. 上传部署文件
将yaml配置文件上传至/home/xxx/deploy/xxx
2.执行对应服务的yaml文件
# 部署
kubectl apply -f xxx.yaml
# 或者执行
k8sreload xxx.yaml
# 以上命令二选一
# 删除pod
kubectl delete -f xxx.yaml
六、其他
1. 部署pod至指定节点
在具体的yaml文件中指定 nodeSelector
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
nodeSelector: #node节点标签选择器
"xxx/role": master #node节点标签内容
2. 设置容器使用secret
a. 在具体的xxx.yaml中设置
apiVersion: v1
spec:
template:
spec:
imagePullSecrets:
- name: approval-docker-harbor
b. 设置默认账户方式
此方式是设置给对应的namespace(命名空间)下的用户,添加 imagePullSecrets,无需在部署文件中再使用,注:namespace为空对应默认用户(default)
# 命令方式
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "docker-harbor-secret"}]}' -n kubernetes-dashboard
# yaml文件方式
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: #NAME_SPACE#
imagePullSecrets:
- name: docker-harbor-secret
评论 (0)