——————选用containerd作为容器运行时
——————选用keda对HPA指标数据进行扩展
一、背景
Kubernetes社区在2020年7月就开始着手移除dockershim,这将意味着kubernetes不再将docker作为默认的底层容器工具,Docker和其他容器运行时将一视同仁,不会单独对待,进行内置支持,如果还想直接使用Docker这种容器运行时,可以将dockershim的功能单独提取出来单独维护一个cri-dockerd,或者docker官方社区将CRI接口内置到Dockerd中去实现。
Containerd自1.1版本就内置实现了CRI,而作为调用Containerd的docker也没必要去单独再内置CRI,在kubernetes1.24版本之后,由于不再支持开箱即用的Docker,最好的方式就是直接使用Containerd这种容器运行时,而且该容器运行时也已经经过生产环境实践,基于此背景,遂以Containerd作为底层容器运行时部署kubernetes。
二、kubernetes1.26.9高可用集群部署
2.1环境介绍
两台主机,信息如下:
主机名 |
Ip |
系统信息 |
Master1 |
192.168.102.6 |
Kylin.v10_x86_64 |
Master2 |
192.168.102.7 |
Kylin.v10_x86_64 |
Master3 |
192.168.102.8 |
Kylin.v10_x86_64 |
Worker |
192.168.102.9 |
Kylin.v10_x86_64 |
软件版本如下:
名称 |
版本号 |
Containerd |
1.6.24 |
Kubernetes |
1.6.29 |
Keda |
2.11.2 |
Metricserer |
v0.6.4 |
高可用虚拟ip:
VIP |
192.168.102.123 |
经查阅kubernetes和containerd官网,系统内核版本至少为4.x版本;且runc命令所依赖的libseccomp版本最好是2.5.1版本(经测试,centos自带的2.3.1版本和kylin_v10自带的2.4.3版本都无法支持runc -v命令——报错:seccomp_notify_respond)
本文基于keepalived和haproxy实现k8s集群高可用!
2.2基础配置(所有主机都执行)
2.2.1 yum仓库配置
#由于搭建环境无法接通外网,所以配置为私有yum源 Vim /etc/yum.repos.d/kylin_x86_64.rep [ks10-adv-cdrom] name = ks10-adv-cdrom baseurl = http://192.168.102.1/kylin-v10/Packages #yum仓库地址 gpgcheck = 0 enabled = 1 #如为外网环境,可配置阿里yum源 |
2.2.2 修改主机名
#修改主机名称,容器识别 hostnamectl set-hostname master1 #192.168.102.6主机执行 hostnamectl set-hostname master2 #192.168.102.7主机执行 hostnamectl set-hostname master3 #192.168.102.8主机执行 hostnamectl set-hostname worker #192.168.102.9主机执行 |
2.2.3 配置NTP服务
Yum -y install chrony ntpdate vim /etc/chrony.conf #修改为如下图配置 Systemctl enable chronyd && systemctl start chronyd |
2.2.3 关闭selinux及firewalld
sed -I ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config systemctl disable firewalld systemctl stop firewalld |
2.2.3 关闭swap
Kubernetes1.8开始要求关闭系统的swap,如果不关闭,默认配置下kubelet将无法启动
#关闭swap swapoff -a #注释掉swap挂载,如下图所示: vim /etc/fstab free -m #结果确保swap输出全为0 |
2.3导入containerd所需模块(所有主机都执行)
vim /etc/modules-load.d/containerd.conf overlay br_netfilter #执行如下命令 modprobe overlay modprobe br_netfilter |
2.4配置内核参数(所有主机都执行)
vim /etc/sysctl.d/99-sysctl.conf #亦可以在/etc/sysctl.d/新建文件输入如下内容 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 user.max_user_namespaces=28633 vm.swappiness = 0 vm.overcommit_memory = 0 #检查物理内存是否够用 vm.panic_on_oom=0 #开启oom fs.inotify.max_user_instances = 512 fs.inotify.max_user_watches = 1280000 sysctl -p /etc/sysctl.d/99-sysctl.conf |
2.5配置支持IPVS转发(所有主机都执行)
由于ipvs已经加入内核的主干,所以kube-proxy开启ipvs的前提需要加载一些内核模块.
vim /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack chmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack #安装必备的软件包:ipset、ipvsadm Yum -y install ipset ipvsadm |
2.6 升级libseccomp版本(所有主机都执行)
yum -y install libseccomp-2.5.1-1.el8.x86_64.rpm |
2.7部署containerd(所有主机都执行)
2.7.1从gihub拉取containerd的源码包
注意:在官网确定kubernetes版本和containerd的兼容性;kubernetes需要下载“”cri-containerd-xxx”命名的源码包。
Kubernetes 版本 |
Containerd版本 |
Cri版本 |
1.24 |
1.70+;1.6.4+ |
V1;v1alpha2 |
1.25 |
1.70+;1.6.4+ |
V1;v1alpha2** |
1.26 |
1.70+;1.6.15+ |
V1 |
1.27 |
1.70+;1.6.15+ |
V1 |
1.28 |
1.70+;1.6.15+ |
V1 |
2.7.2安装containerd
#直接解压在“/”目录下即可 tar xf cri-containerd-1.6.24-linux-amd64.tar.gz -C / |
2.7.3 配置containerd的配置文件
根据文档Containerd runtimes中的内容,对于使用systemd作为init system的linux的发行版,使用systemd作为容器运行的cgroup driver可以确保服务器节点在资源紧张的情况下更加稳定,所以要修改各个节点上的containerd的cgroup driver为systemd。
containerd config default | tee /etc/containerd/config.toml vim /etc/containerd/config.toml #125行 SystemdCgroup = true #这里将“false”改为“true” #61行 sandbox_image = "k8s.gcr.io/pause:3.9" #将此容器改为仓库中拉取到的pause镜像名称,否则初始化会过不去 #containerd定义仓库配置可参考其他网站(这里不作赘述) #修改关键行如下: [plugins."io.containerd.grpc.v1.cri".registry.auths] [plugin |