Deploy a Production Ready Kubernetes High Availability Cluster with Binary
建议根据下表安装合适的Python版本和Ansible版本
Python | Ansible |
---|---|
>=3.9 | >=2.11.12 |
安装Ansible示例
pip3 install ansible -i https://mirrors.ustc.edu.cn/pypi/web/simple
pip3 install netaddr -i https://mirrors.ustc.edu.cn/pypi/web/simple
请按照inventory模板格式修改对应资源
编辑group_vars/all.yml文件,根据自己的实际环境进行配置。
请注意:
Kubernetes 的最低版本要求为 v1.26
请尽量将etcd安装在独立的服务器上,不建议跟master安装在一起。数据盘尽量使用SSD盘。
Pod 和Service IP网段建议使用保留私有IP段,建议(Pod IP不与Service IP重复,也不要与主机IP段重复,同时也避免与docker0网卡的网段冲突。):
如是离线环境,提前将相关包下载放到内网下载服务器,然后将groups/all.yml替换为内网下载地址即可(确保可以使用yum/apt/dnf等安装系统依赖包)
如已经自行格式化并挂载目录,可以跳过此步骤。
ansible-playbook fdisk.yml -i inventory -e "disk=sdb dir=/data"
如果是NVME的磁盘,请使用以下方式:
ansible-playbook fdisk.yml -i inventory -e "disk=sdb dir=/data type=nvme"
⚠️:
/var/lib/etcd
、/var/lib/containerd
、/var/lib/kubelet
、/var/log/pods
数据目录绑定到此数据盘{{dir}}/containers/etcd
、{{dir}}/containers/containerd
、{{dir}}/containers/kubelet
、{{dir}}/containers/pods
目录,以达到多个数据目录共用一个数据盘,而无需修改kubernetes相关数据目录。如需不同目录挂载不同数据盘,可以使用以下命令单独挂载
ansible-playbook fdisk.yml -i inventory -l master -e "disk=sdb dir=/var/lib/etcd" --skip-tags=bind_dir
如已经格式化并挂载过数据盘,可以使用以下命令将数据目录绑定到数据盘
ansible-playbook fdisk.yml -i inventory -l master -e "disk=sdb dir=/data" -t bind_dir
# 如从自建文件服务器下载,请修改roles/download/defaults/main.yml文件中的默认下载地址
ansible-playbook download.yml
# 如集群节点可以连接公网,可以跳过此步骤。
# 如不能连接公网或需使用私有镜像仓库,请自行同步group_vars/all.yml中定义的镜像至私有镜像仓库。
# 也可以使用 https://github.com/AliyunContainerService/image-syncer/releases 同步
当集群节点为GPU节点时,请先按照以下步骤安装驱动
# 查看显卡信息(若找不到lspci命令,可以安装 yum install pciutils)
lspci | grep -i nvidia
# 查看内核版本
uname -r
# 查看可以安装的kernel-devel版本
yum list | grep kernel-devel
# 安装kernel-devel(安装的版本要和当前内核版本一致)
yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)
# 安装gcc dkms
yum -y install gcc dkms
# 查看nouveau加载情况
lsmod | grep nouveau
# 阻止 nouveau 模块加载
cat > /etc/modprobe.d/blacklist.conf << EOF
blacklist nouveau
options nouveau modeset=0
EOF
# 重新建立initramfs image文件(此步骤操作完成之后,需重启机器)
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut /boot/initramfs-$(uname -r).img $(uname -r)
# 安装驱动
bash NVIDIA-Linux-x86_64-470.199.02.run
# 验证驱动是否安装成功
nvidia-smi
# 添加nvidia-container-toolkit软件源
# 企业内部建议使用nexus配置nvidia-container-toolkit软件源的代理,并将group_vars/all.yml中repo修改为nexus代理地址,即可实现自动安装
# 其他操作系统请参考: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#linux-distributions
cat > /etc/yum.repos.d/nvidia-container-toolkit.repo << EOF
[nvidia-container-toolkit]
name=nvidia-container-toolkit
baseurl=https://nvidia.github.io/libnvidia-container/stable/rpm/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://nvidia.github.io/libnvidia-container/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF
# 安装nvidia-container-toolkit
yum -y install nvidia-container-runtime nvidia-container-toolkit
# 执行之前,请确认已经进行过磁盘分区
# 执行之前,请确认已经执行`ansible-playbook download.yml`完成安装包下载
ansible-playbook cluster.yml -i inventory
如是公有云/私有云环境,使用公有云/私有云的负载均衡即可(需提前配置好负载均衡),无需安装haproxy和keepalived。
ansible-playbook cluster.yml -i inventory --skip-tags=haproxy,keepalived
如果想让master节点也进行调度,可以使用以下参数
ansible-playbook cluster.yml -i inventory --skip-tags=create_master_taint
扩容时,建议注释inventory文件master组中旧服务器信息,仅保留扩容节点的信息。
格式化挂载数据盘
ansible-playbook fdisk.yml -i inventory -l ${SCALE_MASTER_IP} -e "disk=sdb dir=/data"
执行生成节点证书
ansible-playbook cluster.yml -i inventory -t cert
执行节点初始化
ansible-playbook cluster.yml -i inventory -l ${SCALE_MASTER_IP} -t verify,init
执行节点扩容
ansible-playbook cluster.yml -i inventory -l ${SCALE_MASTER_IP} -t master,containerd,worker --skip-tags=bootstrap,create_worker_label
扩容时,建议注释inventory文件worker组中旧服务器信息,仅保留扩容节点的信息。
格式化挂载数据盘
ansible-playbook fdisk.yml -i inventory -l ${SCALE_MASTER_IP} -e "disk=sdb dir=/data"
执行生成节点证书
ansible-playbook cluster.yml -i inventory -t cert
执行节点初始化
ansible-playbook cluster.yml -i inventory -l ${SCALE_WORKER_IP} -t verify,init
执行节点扩容
ansible-playbook cluster.yml -i inventory -l ${SCALE_WORKER_IP} -t containerd,worker --skip-tags=bootstrap,create_master_label
先备份并删除证书目录{{cert.dir}},重新创建{{cert.dir}},并将token、sa.pub、sa.key文件拷贝至新创建的{{cert.dir}}(这三个文件务必保留,不能更改),然后执行以下步骤重新生成证书并分发证书。
ansible-playbook cluster.yml -i inventory -t cert,dis_certs
然后依次重启每个节点。
重启etcd
ansible -i inventory etcd -m systemd -a "name=etcd state=restarted"
验证etcd
etcdctl endpoint health \
--cacert=/etc/etcd/pki/etcd-ca.pem \
--cert=/etc/etcd/pki/etcd-healthcheck-client.pem \
--key=/etc/etcd/pki/etcd-healthcheck-client.key \
--endpoints=https://172.16.90.101:2379,https://172.16.90.102:2379,https://172.16.90.103:2379
逐个删除旧的kubelet证书
ansible -i inventory master,worker -m shell -a "rm -rf /etc/kubernetes/pki/kubelet*"
-l
参数更换为具体节点IP。逐个重启节点
ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
-l
参数更换为具体节点IP。重启网络插件
kubectl get pod -n kube-system | grep -v NAME | grep cilium | awk '{print $1}' | xargs kubectl -n kube-system delete pod
请先编辑group_vars/all.yml,修改kubernetes.version为新版本。
下载新版本安装包
ansible-playbook download.yml
安装kubernetes组件
ansible-playbook cluster.yml -i inventory -t install_kubectl,install_master,install_worker
更新配置文件
ansible-playbook cluster.yml -i inventory -t dis_master_config,dis_worker_config
然后依次重启每个kubernetes组件。
ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
-l
参数更换为具体节点IP。ansible-playbook reset.yml -i inventory -l ${IP} -e "flush_iptables=true enable_dual_stack_networks=false"