胡松的技术博客
站内搜索
切换语言中文
打开菜单

搭建 Containerd + K8S 环境(v1.28.5)

K8S v1.28.5 集群搭建记录:改用二进制方式安装 containerd 与 runc(含 libseccomp 编译),并附 Calico 镜像拉取与节点重新加入的排查过程。

目录28 节

一、环境准备

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

分享

微博XLinkedIn
二维码

扫码在手机上继续阅读

同一主题下的延伸阅读。

搭建 Containerd + K8S 环境(v1.26.15)

在 Alibaba Cloud Linux 上用 containerd 从零搭一套 K8S v1.26.15 集群:主机与内核准备、ipvs 与网桥参数、kubeadm 初始化与节点加入,以及 Calico 网络的镜像离线处理。

3 分钟阅读运维

搭建 Containerd + K8S 环境(v1.30.6)

K8S v1.30.6 集群搭建记录:用 kubeadm-config.yaml 声明式初始化(附完整配置),Calico v3.28.2 的镜像离线处理,以及节点状态、DNS 与命名空间的验证清单。

4 分钟阅读运维

评论