Home
Softono

K8s

Open source MIT Jinja
240
Stars
129
Forks
0
Issues
12
Watchers
2 months
Last Commit

 About K8s

Deploy a Production Ready Kubernetes High Availability Cluster with Binary

Platforms

Web Self-hosted Docker Kubernetes

Languages

Shell Jinja

Need Help Installing K8s?

We provide expert installation service for this software. Our team will install, configure, and secure K8s on your server. plans start at just $30.

支持发行版

  • AlmaLinux 8,9,10
  • RockyLinux 8,9,10
  • Ubuntu Server 20.04,22.04,24.04,26.04
  • Debian 12,13
  • TencentOS Server 3
  • Kylin Server v11

支持平台

  • amd64
  • arm64

支持kubernetes版本

  • 1.26.x ~ 1.36.x

支持组件

开始配置

本脚本向前兼容,拉取最新代码,根据需求调整group_vars/all.ymlinventory中相关参数即可。

如需更新本地代码至最新,建议备份group_vars/all.ymlinventory并更新代码至最新,然后将原group_vars/all.ymlinventory中需要的配置添加到最新的group_vars/all.ymlinventory文件即可。

对于Kubernetes >=1.32.0版本,推荐使用4.19+以上内核,也支持5.x或6.x版本内核。对于cgroups v2支持,最低内核版本为4.15,推荐版本为5.8+。

从Kubernetes 1.35.0版本开始,移除 cgroup v1 支持,全面买入 cgroup v2 版本。kube-proxyipvs模式标记废弃,推荐迁移至 nftables 模式。1.35.x是支持 containerd v1.x 系列的最后一个版本,在升级到下一个Kubernetes版本之前,必须切换到 containerd 2.0 或更高版本。

配置Ansible控制端

建议根据下表安装合适的Python版本和Ansible版本

组件 版本
Control Node Python >=3.9
Target Python >=3.6
Ansible >=2.14.0

安装Ansible

pip3 install "ansible>=7.0.0,<10.0.0" -i https://mirrors.ustc.edu.cn/pypi/web/simple
pip3 install "netaddr>=0.10.1" -i https://mirrors.ustc.edu.cn/pypi/web/simple
  • 不同Python版本Anisble支持矩阵详情,请参考:https://docs.ansible.com/ansible-core/devel/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix

开启双栈网络

group_vars/all.yml配置中将ipv4_stack和ipv6_stack设置为true表明开启IPv4和IPv6双栈网络,将ipv4_stack设置为true表明开启IPv4单栈网络,将ipv6_stack设置为true表明开启IPv6单栈网络。使用IPv6网络之前请务必确认集群节点所在网络已开启支持IPv6。

⚠️:在云平台使用Calico IPIP时,请勿开启双栈网络,Calico IPv6网络不支持IPIP,参考

修改 inventory

请按照inventory模板格式修改对应资源

  • 当haproxy和kube-apiserver部署在同一台服务器时,请确保端口不冲突。

配置 group_vars

编辑 group_vars/all.yml 文件,根据自己的实际环境进行配置。

请注意:

  • Kubernetes 的最低版本要求为 v1.26

  • 请尽量将etcd安装在独立的服务器上,不建议跟master安装在一起。数据盘尽量使用SSD盘。

  • Pod 和Service IP网段建议使用保留私有IP段,建议(Pod IP不与Service IP重复,也不要与主机IP段重复,同时也避免与docker0网卡的网段冲突)从以下网段及子网选择:

    • Pod 网段
      • A类地址:10.0.0.0/8
      • B类地址:172.16.0.0/12
      • C类地址:192.168.0.0/16
    • Service网段
      • A类地址:10.0.0.0/16-24
      • B类地址:172.16-31.0.0/16-24
      • C类地址:192.168.0.0/16-24

挂载数据盘

如已经自行格式化并挂载目录,可以跳过此步骤。

ansible-playbook fdisk.yml -i inventory -e "disk=sdb dir=/data"
  • 可选变量-e "disk=sdb dir=/data num=1"

如果是NVME的磁盘,请使用以下方式:

ansible-playbook fdisk.yml -i inventory -e "disk=nvme0n1 dir=/data num=p1"

⚠️:

  • 此脚本会格式化{{disk}}指定的硬盘,并挂载到{{dir}}目录。
  • 同时会将/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 etcd -e "disk=sdb dir=/var/lib/etcd" --skip-tags=bind_dir

如已经格式化并挂载过数据盘,可以使用以下命令将数据目录绑定到数据盘

ansible-playbook fdisk.yml -i inventory -l master,worker -e "disk=sdb dir=/data" -t bind_dir

安装GPU驱动

当集群节点为GPU节点时,请先参考nvidia完成驱动安装。

下载离线包

# 如从自建文件服务器下载,请修改 group_vars/all.yml 文件中的默认下载地址
ansible-playbook download.yml
  • 请确保Ansible控制端可以访问Internet,否则无法下载离线安装包。
  • 或在其他Internet节点下载后,按照对应目录结构拷贝到{{ download.dest }}目录中也可。

同步镜像

# 建议将 group_vars/all.yml 中定义的镜像自行同步至私有镜像仓库中,并将地址修改为私有镜像仓库地址
# 目前会自动将 group_vars/all.yml 中定义的镜像同步到阿里云镜像仓库,可能不稳定或失效。

部署集群

# 执行之前,请确认已经进行过磁盘分区
# 执行之前,请确认已经执行 ansible-playbook download.yml 完成安装包下载
ansible-playbook cluster.yml -i inventory

如是公有云/私有云环境,使用公有云/私有云的负载均衡即可(需提前配置好负载均衡),无需安装haproxy和keepalived。

ansible-playbook cluster.yml -i inventory --skip-tags=haproxy,keepalived
  • 默认会对节点进行初始化操作,集群节点会取主机名最后两段和IP作为集群节点名称。

如果想让master节点也进行调度,可以使用以下参数

ansible-playbook cluster.yml -i inventory --skip-tags=create_master_taint

扩容节点

扩容master节点

扩容时,在inventory文件master组中依次添加新增服务器信息(执行时请务必使用-l参数指定IP)。

格式化挂载数据盘

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

扩容worker节点

扩容时,在inventory文件worker组中依次添加新增服务器信息(执行时请务必使用-l参数指定IP)。

格式化挂载数据盘

ansible-playbook fdisk.yml -i inventory -l ${SCALE_WORKER_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://10.43.75.201:2379,https://10.43.75.202:2379,https://10.43.75.203: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
  • 如calico、metrics-server等服务也使用了集群证书,请记得一起更新相关证书。
  • -l参数更换为具体节点IP。

重启网络插件

kubectl get pod -n kube-system | grep -v NAME | grep cilium | awk '{print $1}' | xargs kubectl -n kube-system delete pod
  • 更新证书可能会导致网络插件异常,建议重启。
  • 示例为重启cilium插件命令,请根据不同网络插件自行替换。

升级集群版本

请先编辑group_vars/all.yml,修改kubernetes.version为新版本。

下载新版本安装包

ansible-playbook download.yml

升级etcd(升级会自动重启etcd,可根据需求自行选择是否升级)

ansible-playbook cluster.yml -i inventory -l ${IP} -t install_etcd,dis_etcd_config
  • -l参数更换为具体节点IP。

安装kubernetes组件

ansible-playbook cluster.yml -i inventory -l ${IP} -t install_kubectl,install_master,install_worker
  • -l参数更换为具体节点IP。

更新配置文件

ansible-playbook cluster.yml -i inventory -l ${IP} -t dis_master_config,dis_worker_config
  • -l参数更换为具体节点IP。
  • 使用v7.x之前版本部署的集群,因v7.x之后调整节点名称,不建议执行

节点排水,并设置为不可调度

kubectl drain --ignore-daemonsets --force <节点名称>

升级containerd组件(升级会自动重启containerd,可根据需求自行选择是否升级)

ansible-playbook cluster.yml -i inventory -l ${IP} -t install_runc,install_cni,install_containerd,install_critools,containerd_config
  • -l参数更换为具体节点IP。

然后依次重启每个kubernetes组件。

ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
  • -l参数更换为具体节点IP。

恢复调度

kubectl uncordon <节点名称>

清理集群节点

ansible-playbook reset.yml -i inventory -l ${IP} -e "flush_iptables=true"

项目支持

  • 如果你觉得本项目还不错,可以通过 Star 来表示你的喜欢
  • 在公司或个人项目中使用,并帮忙推广给伙伴使用