基于kubeadm和containerd搭建k8s
前言
因宿主机内核版本限制和垂直伸缩特性的需要,安装的k8s版本为1.25,runtime为containerd,cni为calico。
containerd、kubeadm、kubelet也可以用包管理器来安装,因为不想配repo,也不想校验repo版有哪些区别,所以这几个都是用原生二进制方式安装的。
环境信息
IP | Hostname | OS Version | Kernel Version | Comment |
---|---|---|---|---|
192.168.0.11 | node1 | centos 7.9 | 3.10 | control panel |
192.168.0.12 | node2 | centos 7.9 | 3.10 | worker node |
192.168.0.13 | node3 | centos 7.9 | 3.10 | worker node |
用到的组件版本信息
- containerd: 1.7.21
- k8s: 1.25.16
系统初始化
系统初始化步骤要求每个节点都要操作,一些主机名等信息需要根据实际修改。
- 修改hostname,k8s要求每个节点的hostname不一样
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
- (可选)如果没有dns可以让hostname之间直接访问,需要配置
/etc/hosts
192.168.0.11 node1
192.168.0.12 node2
192.168.0.13 node3
- (可选)如果要长时间使用,最好配置一下时间同步。
- 关闭swap。默认情况下,k8s检测到swap就会异常退出,导致node上的k8s启动失败。
# 临时关闭。永 久关闭需要修改 /etc/fstab
swapoff -a
- 装载内核模块。如果不装载
br_netfilter
,下一步配置系统参数会报错。
# 添加配置
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# 立即装载
modprobe overlay
modprobe br_netfilter
# 检查装载。如果没有输出结果说明没有装载。
lsmod | grep br_netfilter
- 配置系统参数。编辑
/etc/sysctl.conf
文件或/etc/sysctl.d/
目录下的文件,添加或修改以下配置。编辑完成后执行sysctl -p
使配置生效。(如果修改的是/etc/sysctl.d
目录下的文件,sysctl -p
需要指定文件名才能生效)
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
- (可选)内核版本若高于4.1,可考虑使用ipvs来增强网络通信性能
- 安装依赖,否则安装containerd时,
runc
组件会有问题
# conntrack-tools的版本为1.4.4-4.el7,如果低了可能会导致runc异常
# 如果安装提示缺少依赖,而依赖在centos 7的repo源里没有,可从高版本centos、alma等发行版下载rpm包再安装
yum install -y conntrack-tools
安装containerd
- 从 https://github.com/containerd/containerd/releases下载二进制包
- 解压压缩包到根目录。压缩包里面的文件路径都已经按照根目录组织好了,所以直接解压到根路径就行了。
tar xf cri-containerd-cni-1.7.21-linux-amd64.tar.gz -C /
- 生成containerd的配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
- 编辑containerd的配置文件
/etc/containerd/config.toml
,主要修改container的数据目录,并启用systemd的cgroup
# 修改数据存储目录
root = "/home/apps/containerd"
# 对于使用systemd作为init system的linux发行版,官方建议用systemd作为容器cgroup driver
# false改成true
SystemdCgroup = true
- 重加载systemd配置,启动containerd
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd
- 简单验证下containerd是否正常
# 查看systemd status
systemctl status containerd
# 查看image,正常情况下还没有image
crictl images
# 验证runc是否正常,如果输出有报错,可以参考"系统初始化"的第8步"安装依赖"
runc --version