搭建 Containerd + K8S 环境(v1.28.5)
K8S v1.28.5 集群搭建记录:改用二进制方式安装 containerd 与 runc(含 libseccomp 编译),并附 Calico 镜像拉取与节点重新加入的排查过程。
On this page28 sections
This page has not been translated yet — showing the original Chinese.
一、环境准备
1.1 服务器硬件配置
| 名称 | 操作系统 | CPU | 内存 | 内网IP | 公网IP | 集群角色 |
|---|---|---|---|---|---|---|
| ECS | CentOS 7.8 64位 | 2核 | 2GB | 192.0.2.18 | 203.0.113.11 | Master |
| ECS | CentOS 7.8 64位 | 2核 | 2GB | 192.0.2.11 | 203.0.113.12 | Node |
| ECS | CentOS 7.8 64位 | 2核 | 2GB | 192.0.2.20 | 203.0.113.13 | Node |
1.2 版本说明
| 名称 | 版本 | 备注 |
|---|---|---|
| Containerd | 1.7.11 | – |
| RunC | 1.1.11 | – |
| K8S | v1.28.5 | – |
1.3 主机配置
1.3.1 HOSTNAME配置
Master节点配置:
hostnamectl set-hostname k8s-master
Node1节点配置:
hostnamectl set-hostname k8s-node1
Node2节点配置:
hostnamectl set-hostname k8s-node2
1.3.2 HOSTS配置
集群所有节点服务器上编辑/etc/hosts文件配置集群节点IP和主机映射:
# 编辑
vi /etc/hosts
# 追加
192.0.2.18 k8s-master
192.0.2.11 k8s-node1
192.0.2.20 k8s-node2
# 保存
wq
# 或者
cat >> /etc/hosts << EOF
192.0.2.18 k8s-master
192.0.2.11 k8s-node1
192.0.2.20 k8s-node2
EOF
1.3.3 IP地址配置
Master节点配置:
# k8s-master节点IP地址为:192.0.2.18/24
#
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.0.2.18"
PREFIX="24"
GATEWAY="192.0.2.2"
DNS1="119.29.29.29"
Node1节点配置:
# k8s-node1节点IP地址为:192.0.2.11/24
#
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.0.2.11"
PREFIX="24"
GATEWAY="192.0.2.2"
DNS1="119.29.29.29"
Node2节点配置:
# k8s-node2节点IP地址为:192.0.2.20/24
#
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.0.2.20"
PREFIX="24"
GATEWAY="192.0.2.2"
DNS1="119.29.29.29"
1.3.4 防火墙配置
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
1.3.5 SELINUX配置
关闭selinux:
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
1.3.6 SWAP配置
关闭swap:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
1.3.7 时间同步
# crontab -l
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
yum list --showduplicates | sort -r | grep kernel-lt.x86_64
yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-lt.x86_64
yum --enablerepo="elrepo-kernel" install -y kernel-lt.x86_64
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
1.3.8 升级操作系统内核
查看操作系统当前内核:
uname -r
导入Public Key:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
安装CentOS-7的ELRepo:
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
查看ELRepo中的kernel:
yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-lt.x86_64
安装kernel:
yum --enablerepo="elrepo-kernel" install -y kernel-lt.x86_64
设置Grub2默认引导顺序为0:
grub2-set-default 0
重新Grub2生成引导文件:
grub2-mkconfig -o /boot/grub2/grub.cfg
重启:
reboot
1.3.9 配置网桥
配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙。
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
配置生效
modprobe br_netfilter
modprobe overlay
sysctl -p /etc/sysctl.d/k8s.conf
vi /etc/sysconfig/modules/br_netfilter.modules
配置开机生效
cat >> /etc/sysconfig/modules/br_netfilter.modules <<EOF
#!/bin/bash
modprobe br_netfilter
EOF
授权配置:
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
1.3.10 安装ipset及ipvsadm
安装:
yum -y install ipset ipvsadm
配置:
cat >> /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
授权、运行、加载:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
二、容器运行时准备
2.1 Containerd准备
下载:
wget https://github.com/containerd/containerd/releases/download/v1.7.11/cri-containerd-1.7.11-linux-amd64.tar.gz
安装:
tar -xf cri-containerd-1.7.11-linux-amd64.tar.gz -C /
# 配置环境变量
cat >> /etc/profile << EOF
export PATH=$PATH:/usr/local/bin:/usr/local/sbin
EOF
source /etc/profile
配置:
mkdir -p /etc/containerd/ && containerd config default > /etc/containerd/config.toml
vi /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
wq
systemctl start containerd && systemctl enable containerd
2.2 RunC准备
2.2.1 Libseccomp准备
下载:
wget https://github.com/opencontainers/runc/releases/download/v1.1.11/libseccomp-2.5.4.tar.gz
解压:
tar -xf libseccomp-2.5.4.tar.gz
切换目录:
cd libseccomp-2.5.4
安装gperf:
yum install -y gperf
配置:
./configure
编译、安装:
make && make install
验证:
find / -name "libseccomp.so"
2.2.2 Runc准备
查看:
which runc
下载:
wget https://github.com/opencontainers/runc/releases/download/v1.1.11/runc.amd64
授权:
chmod +x runc.amd64
删除旧的:
rm -rf `which runc`
替换:
mv runc.amd64 /usr/local/sbin/runc
验证:
runc --version
三、K8S集群部署
3.1 配置镜像源
配置镜像源:
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
配置Setenforce:
setenforce 0
3.2 安装工具
3.2.1 安装kubectl
yum install -y kubectl-1.28.5
3.2.2 安装kubeadm
yum install -y kubeadm-1.28.5
3.2.1 安装kubelet
yum install -y kubelet-1.28.5
设置开机启动:
systemctl enable kubelet
3.3 初始化集群(主节点)
初始化集群:
kubeadm init --kubernetes-version=v1.28.5 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.0.2.18 --cri-socket unix:///run/containerd/containerd.sock
3.4 加入集群(从节点)
加入集群:
kubeadm join 192.0.2.18:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0000000000000000000000000000000000000000000000000000000000000000
3.5 初始化集群网络(主节点)
安装Calico:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
下载:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml
更新网段:
vi custom-resources.yaml
cidr=10.244.0.0/16
wq
安装自定义资源:
kubectl create -f custom-resources.yaml
查看命名空间:
kubectl get ns
查看POD状况:
kubectl get pods -n calico-system
kubectl drain k8s-master --delete-emptydir-data --force --ignore-daemonsets
# 加入集群
kubeadm join 192.0.2.18:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0000000000000000000000000000000000000000000000000000000000000000
kubeadm join 192.0.2.18:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:0000000000000000000000000000000000000000000000000000000000000000
kubectl describe pod -n calico-system |grep 'Events' -A 10 |grep -Eo '"docker.io/calico/.\*"' |sort |uniq
"docker.io/calico/cni\:v3.23.0"
"docker.io/calico/kube-controllers\:v3.23.0"
"docker.io/calico/node\:v3.23.0"
"docker.io/calico/pod2daemon-flexvol\:v3.23.0"
"docker.io/calico/typha\:v3.23.0"
ctr -n k8s.io images pull quay.io/calico/pod2daemon-flexvol:v3.27.0
ctr -n k8s.io images pull quay.io/calico/typha:v3.27.0
ctr -n k8s.io images pull quay.io/calico/kube-controllers:v3.27.0
ctr -n k8s.io images pull quay.io/calico/node:v3.27.0
ctr -n k8s.io images pull quay.io/calico/node-driver:v3.27.0
ctr -n k8s.io images pull quay.io/tigera/operator:v1.32.3
ctr -n k8s.io images pull quay.io/calico/cni:v3.27.0
ctr -n k8s.io images pull quay.io/calico/node-driver-registrar:v3.27.0
ctr -n k8s.io images pull quay.io/calico/csi:v3.27.0
ctr -n k8s.io images pull m.daocloud.io/docker.io/calico/pod2daemon-flexvol:v3.27.0
ctr -n k8s.io images pull m.daocloud.io/docker.io/calico/typha:v3.27.0
ctr -n k8s.io images pull m.daocloud.io/docker.io/calico/kube-controllers:v3.27.0
ctr -n k8s.io images pull m.daocloud.io/docker.io/calico/node:v3.27.0
ctr -n k8s.io images pull quay.io/tigera/operator:v1.32.3
ctr -n k8s.io images pull quay.io/ingress-nginx/controller:v1.9.5
registry.k8s.io
ctr -n k8s.io images pull m.daocloud.io/registry.k8s.io/ingress-nginx/controller:v1.9.5
ctr -n k8s.io images pull m.daocloud.io/docker.io/calico/cni:v3.27.0
ctr -n k8s.io images rm sha256:d2cab59bf301e59034a80c4374360cab1aab5fa86b8dbe1f4d74fd437acec121