使用的主机信息如下:
角色 | HOSTNAME | IP | CPU | 内存 | 系统盘 | CPU 架构 | 操作系统 |
---|---|---|---|---|---|---|---|
控制平面 | k8s-master | 192.168.0.101 | 2 | 4G | 64G | x86_64 | openSUSE Leap Micro 6.1 |
工作平面 | k8s-worker-1 | 192.168.0.102 | 2 | 4G | 64G | x86_64 | openSUSE Leap Micro 6.1 |
工作平面 | k8s-worker-2 | 192.168.0.103 | 4 | 8G | 64G | x86_64 | openSUSE Leap Micro 6.1 |
transactional-update shell
1) 更新软件源元数据
zypper ref
2) 更新主机操作系统
zypper up -y
zypper install -y wget
vim /etc/hosts
192.168.0.101 k8s-master
192.168.0.102 k8s-worker-1
192.168.0.103 k8s-worker-2
sed -i '/swap/d' /etc/fstab
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
1) 编辑配置文件
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
2) 更新系统设置
sysctl --system
exit
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-worker-1
hostnamectl set-hostname k8s-worker-2
reboot
1) 检查主机名
hostnamectl hostname
2) 检查 SWAP 分区是否禁用
free -h
Swap 部分显示为 0 表示禁用
swapon --show
返回为空时表示已禁用
3) 查看 SELinux 是否关闭
getenforce
返回为
Permissive
表示关闭
transactional-update shell
1) 安装
zypper install -y containerd
2) 锁定(防止误升级)
zypper addlock containerd
1) 生成配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
2) 设置 SystemdCgroup 为 true
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
编辑
/etc/containerd/config.toml
文件,找到[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
下的SystemdCgroup
将其设置为true
3) 设置镜像(部分地区需要)
sed -i 's#registry.k8s.io/pause:3.8#registry.aliyuncs.com/google_containers/pause:3.10#' /etc/containerd/config.toml
编辑 /etc/containerd/config.toml 文件,找到 [plugins."io.containerd.grpc.v1.cri"] 下的 registry.k8s.io/pause 将其设置为可用的镜像(比如 registry.aliyuncs.com/google_containers/pause)
systemctl enable --now containerd
1) 退出 shell 环境
exit
2) 重启生效
reboot
1) 检查启动状态
systemctl status containerd
注意返回的 Active
是否为 running
,同时查看日志中是否存在报错(error
)信息,启动正常时的示例如下:
● containerd.service - containerd container runtime
Loaded: loaded (/usr/lib/systemd/system/containerd.service; enabled; preset: disabled)
Active: active (running) since Fri 2025-04-25 16:15:22 CST; 20s ago
Docs: https://containerd.io
Process: 846 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 858 (containerd)
Tasks: 7
CPU: 60ms
CGroup: /system.slice/containerd.service
└─858 /usr/sbin/containerd
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466206701+08:00" level=info msg="Start subscribing containerd event"
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466238781+08:00" level=info msg="Start recovering state"
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466286930+08:00" level=info msg="Start event monitor"
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466295325+08:00" level=info msg="Start snapshots syncer"
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466303130+08:00" level=info msg="Start cni network conf syncer for default"
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466310874+08:00" level=info msg="Start streaming server"
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466742444+08:00" level=info msg=serving... address=/run/containerd/containerd.sock.ttrpc
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.466877173+08:00" level=info msg=serving... address=/run/containerd/containerd.sock
Apr 25 16:15:22 k8s-master containerd[858]: time="2025-04-25T16:15:22.467231530+08:00" level=info msg="containerd successfully booted in 0.085232s"
Apr 25 16:15:22 k8s-master systemd[1]: Started containerd container runtime.
2) 查看版本
containerd
命令containerd --version
返回值根据安装的版本有所不同,示例如下:
containerd github.com/containerd/containerd v1.7.21 472731909fa34bd7bc9c087e4c27943f9835f111
transactional-update shell
1) 配置软件源
zypper ar -f https://pkgs.k8s.io/core:/stable:/v1.32/rpm/ kubernetes
2) 导入密钥
rpm --import https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
zypper install -y kubelet-1.32.3 kubeadm-1.32.3 kubectl-1.32.3
systemctl enable --now kubelet
1) 退出 shell 环境
exit
5) 重启生效
reboot
systemctl status containerd.service
正常情况应该为
active (running)
systemctl status kubelet.service
正常情况初始化集群前应该为
Active: activating (auto-restart)
;初始化集群成功后应该为active (running)
kubeadm init --kubernetes-version=v1.32.3 --apiserver-advertise-address=192.168.0.101 --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///run/containerd/containerd.sock --image-repository=registry.aliyuncs.com/google_containers
其中:
--kubernetes-version=1.32.3
指定部署的 Kubernetes 版本--apiserver-advertise-address=192.168.0.101
指定 API 服务器 IP--pod-network-cidr=10.244.0.0/16
指定 Pod 使用的网段--cri-socket=unix:///run/containerd/containerd.sock
指定容器运行时 sock 文件--image-repository=registry.aliyuncs.com/google_containers
指定容器镜像仓库,默认使用 registry.k8s.io(部分地区需要)其他可选参数:
--apiserver-bind-port=[端口号]
指定 API 服务绑定端口,默认为 6443
--control-plane-endpoint=[IP:端口号]
指定控制平面共享 IP:端口,用于高可用集群--service-dns-domain=[域名]
指定服务 DNS 域,默认为 cluster.local
--cert-dir=[目录]
指定证书存储目录,默认为 /etc/kubernetes/pki
--certificate-key=[密钥]
指定证书加密密钥,用于高可用集群控制平面之间传输证书--upload-certs
指定将证书至集群,用于高可用集群--dry-run
指定不实际执行,只打印日志kubectl 默认使用 $HOME/.kube/config
配置文件,需要手动配置该文件后才能使用 kubectl 管理集群。
可直接复制 admin.conf
文件(默认路径为 /etc/kubernetes
)后配置权限:
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
在部署 Pod 网络插件(CNI)之前,Pod 、 Service 无法通信,CoreDNS Pod 会处于 Pending 状态,集群功能不完整。
使用的 CNI 必须和 kubeadm init 时 --pod-network-cidr 参数指定的网段一致,通常 Calico 使用 192.168.0.0/16 、 Flannel 使用 10.244.0.0/16 ,因此本集群使用 Flannel
1) 创建相关目录
mkdir -pv /opt/kubernetes/flannel
2) 下载 Flannel 的 yaml 文件
cd /opt/kubernetes/flannel
wget https://github.com/flannel-io/flannel/releases/download/v0.26.7/kube-flannel.yml
3) 部署 Flannel
kubectl apply -f kube-flannel.yml
4) 检查 Flannel 部署状态
kubectl get nodes
检查节点状态是否正常,正常示例如下:
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 21m v1.32.3
kubectl get pods -n kube-system
检查 coredns 相关 Pod 状态是否正常,正常示例如下:
NAME READY STATUS RESTARTS AGE
coredns-6766b7b6bb-4mlcz 1/1 Running 0 21m
coredns-6766b7b6bb-kr2fz 1/1 Running 0 21m
etcd-k8s-master 1/1 Running 0 21m
kube-apiserver-k8s-master 1/1 Running 0 21m
kube-controller-manager-k8s-master 1/1 Running 0 21m
kube-proxy-khfz9 1/1 Running 0 21m
kube-scheduler-k8s-master 1/1 Running 0 21m
systemctl status containerd
systemctl status kubelet
kubectl get nodes
kubectl cluster-info
kubectl get pods -n kube-system
kubectl get componentstatuses
kubectl run busybox --image=busybox:1.28 -- sleep 3600
kubectl exec -it busybox -- nslookup kubernetes.default
kubectl get --raw='/healthz'
kubectl -n kube-system exec -it etcd-<控制面节点名称> -- etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint health
控制平面初始化成功后,会生成 join 命令,建议直接使用此命令将工作平面加入集群
kubeadm join 192.168.0.101:6443 --cri-socket /opt/containerd/run/containerd.sock --token=123456 --discovery-token-ca-cert-hash=sha256:123456
其中:
192.168.0.101:6443
为控制平面地址--token=123456
为 token,由控制平面自动生成--discovery-token-ca-cert-hash=sha256:123456
为证书 hash 值,由控制平面自动生成其他可选参数:
--node-name=[名称]
指定节点名称,默认为主机名--control-plane
指定此节点以控制平面身份加入--certificate-key=[密钥]
指定证书解密密钥,和 kubeadm init
的 --certificate-key
相同--apiserver-advertise-address=[IP:端口号]
指定控制平面共享 IP:端口,用于高可用集群--dry-run
指定不实际执行,只打印日志openSUSE Leap Micro
是一个基于事务性更新的不可变操作系统,因此需要使用 transactional-update
命令来进行相关操作transactional-update
命令操作的内容,需要重启生效containerd
作为容器运行时,如使用其他容器运行时,请参考相关文档 kubeadm reset
和 kubeadm reset -f
命令重置,并在删除 $HOME/.kube/config
后重新初始化