搭建 Containerd + K8S 环境(v1.30.6)
K8S v1.30.6 集群搭建记录:用 kubeadm-config.yaml 声明式初始化(附完整配置),Calico v3.28.2 的镜像离线处理,以及节点状态、DNS 与命名空间的验证清单。
目录27 节
一、环境准备
1.1 服务器硬件配置
| 名称 | 操作系统 | CPU | 内存 | 内网IP | 公网IP | 集群角色 |
|---|---|---|---|---|---|---|
| 阿里云ECS实例 | Alibaba Cloud Linux 3.2104 LTS 64位 等保2.0三级版 | 2核 | 4GB | 192.0.2.142 | 203.0.113.21 | Master |
| 阿里云ECS实例 | Alibaba Cloud Linux 3.2104 LTS 64位 等保2.0三级版 | 2核 | 4GB | 192.0.2.143 | 203.0.113.22 | Node |
| 阿里云ECS实例 | Alibaba Cloud Linux 3.2104 LTS 64位 等保2.0三级版 | 2核 | 4GB | 192.0.2.144 | 203.0.113.23 | Node |
1.2 版本说明
| 名称 | 版本 | 备注 |
|---|---|---|
| Containerd | 1.7.23 | – |
| RunC | 1.1.14 | – |
| K8S | v1.30.6 | – |
| Calico | v3.28.2 | – |
| ingress-nginx | 1.11.3 | – |
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.142 k8s-master
192.0.2.143 k8s-node1
192.0.2.144 k8s-node2
# 保存
wq
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 配置网桥
配置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
vm.swappiness = 0
EOF
配置生效
modprobe br_netfilter
lsmod | grep 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.9 安装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.23/cri-containerd-1.7.23-linux-amd64.tar.gz
安装:
tar -xf cri-containerd-1.7.23-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
# 启动containerd并配置开机自启
systemctl start containerd && systemctl enable containerd
# 查看containerd版本
containerd -version
# 查看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.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
配置Setenforce:
setenforce 0
3.2 安装工具
3.2.1 安装kubectl
yum install -y kubectl-1.30.6
3.2.2 安装kubeadm
yum install -y kubeadm-1.30.6
3.2.3 安装kubelet
yum install -y kubelet-1.30.6
设置开机启动:
systemctl enable kubelet
3.2.4 合并安装kubectl、kubeadm、kubelet
# 合并
yum install -y kubectl-1.30.6 kubeadm-1.30.6 kubelet-1.30.6
3.2.5 初始化集群镜像准备
拉取镜像:
# 查看镜像
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
# 拉取镜像到本地
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
3.2.6 初始化集群配置准备
打印生成初始化配置:
kubeadm config print init-defaults > kubeadm-config.yaml
参考查看配置:
cat kubeadm-config.yaml
标准kubeadm-config.yaml文件内容如下:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.0.2.142
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s-master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.30.6
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}
3.3 初始化集群(主节点)
初始化集群:
# 旧版本初始化集群命令
kubeadm init --kubernetes-version=v1.30.5 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.0.2.142 --cri-socket unix:///run/containerd/containerd.sock
# 新版本根据配置文件初始化集群
kubeadm init --config kubeadm-config.yaml
3.4 加入集群(从节点)
加入集群:
kubeadm join 192.0.2.142:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0000000000000000000000000000000000000000000000000000000000000000
3.5 初始化集群网络(主节点)
Calico版本兼容说明: https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements
安装Calico:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/tigera-operator.yaml
# 查看组件运行状态
kubectl get ns
下载:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/custom-resources.yaml
更新网段:
vi custom-resources.yaml
cidr=10.244.0.0/16
wq
拉取custom-resources.yaml所需镜像:
docker.io/calico/kube-controllers:v3.28.2
docker.io/calico/pod2daemon-flexvol:v3.28.2
docker.io/calico/cni:v3.28.2
docker.io/calico/node:v3.28.2
docker.io/calico/typha:v3.28.2
docker.io/calico/csi:v3.28.2
docker.io/calico/node-driver-registrar:v3.28.2
ctr -n k8s.io images pull quay.io/calico/kube-controllers:v3.28.2
ctr -n k8s.io images tag quay.io/calico/kube-controllers:v3.28.2 docker.io/calico/kube-controllers:v3.28.2
ctr -n k8s.io images pull quay.io/calico/pod2daemon-flexvol:v3.28.2
ctr -n k8s.io images tag quay.io/calico/pod2daemon-flexvol:v3.28.2 docker.io/calico/pod2daemon-flexvol:v3.28.2
ctr -n k8s.io images pull quay.io/calico/cni:v3.28.2
ctr -n k8s.io images tag quay.io/calico/cni:v3.28.2 docker.io/calico/cni:v3.28.2
ctr -n k8s.io images pull quay.io/calico/node:v3.28.2
ctr -n k8s.io images tag quay.io/calico/node:v3.28.2 docker.io/calico/node:v3.28.2
ctr -n k8s.io images pull quay.io/calico/typha:v3.28.2
ctr -n k8s.io images tag quay.io/calico/typha:v3.28.2 docker.io/calico/typha:v3.28.2
ctr -n k8s.io images pull quay.io/calico/csi:v3.28.2
ctr -n k8s.io images tag quay.io/calico/csi:v3.28.2 docker.io/calico/csi:v3.28.2
ctr -n k8s.io images pull quay.io/calico/node-driver-registrar:v3.28.2
ctr -n k8s.io images tag quay.io/calico/node-driver-registrar:v3.28.2 docker.io/calico/node-driver-registrar:v3.28.2
ctr -n k8s.io images pull quay.io/calico/apiserver:v3.28.2
ctr -n k8s.io images tag quay.io/calico/apiserver:v3.28.2 docker.io/calico/apiserver:v3.28.2
安装自定义资源:
kubectl create -f custom-resources.yaml
查看命名空间:
kubectl get ns
查看POD状况:
kubectl get pods -n calico-system
查看集群节点状态:
kubectl get nodes
查看K8S所有命名空间PODS状态:
kubectl get pods --all-namespaces
安装验证工具:
yum install -y bind-utils
配置DNS解析验证DNS功能:
# 获取网络组件DNS安装信息
kubectl get svc -n kube-system
# 尝试解析域名到DNS服务的ClusterIP上
dig -t a www.baidu.com @10.96.0.10