1. 项目概述
最近在Rocky Linux 9.7上部署Kubernetes v1.33集群时,发现大多数教程都基于包管理器安装,而二进制部署的资料相对零散。经过多次实践,我整理出一套完整的二进制部署方案,特别适合需要定制化环境或离线部署的场景。这次部署采用containerd作为容器运行时,Flannel作为网络插件,整个过程涉及系统调优、组件安装和集群初始化等多个环节。
2. 环境准备
2.1 系统要求
本次部署使用两台Rocky Linux 9.7最小化安装的服务器:
- 控制平面节点:192.168.182.11 (hostname: work)
- 工作节点:192.168.182.22 (hostname: node)
硬件配置建议:
- 控制平面:至少2核CPU、4GB内存、50GB磁盘
- 工作节点:根据实际负载需求配置
特别注意:Kubernetes 1.33对系统内核有特定要求,建议使用5.4以上内核版本。可以通过
uname -r命令验证。
2.2 基础环境配置
2.2.1 主机名与hosts配置
在所有节点执行:
bash复制hostnamectl set-hostname work # 控制平面节点执行
hostnamectl set-hostname node # 工作节点执行
cat >> /etc/hosts <<EOF
192.168.182.11 work
192.168.182.22 node
EOF
2.2.2 关闭Swap和SELinux
Kubernetes要求必须禁用Swap:
bash复制swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.2.3 防火墙配置
如果不需要防火墙,可以直接关闭:
bash复制systemctl stop firewalld && systemctl disable firewalld
或者放行必要端口:
bash复制firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --reload
2.3 内核参数调优
加载必要内核模块:
bash复制cat <<EOF > /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay br_netfilter
配置网络参数:
bash复制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
sysctl --system
3. 容器运行时安装
3.1 安装containerd
3.1.1 解压安装
bash复制cd /root
tar Cxzvf /usr/local containerd-2.0.3-linux-amd64.tar.gz
3.1.2 创建systemd服务
bash复制cat <<EOF > /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
After=network.target
[Service]
ExecStart=/usr/local/bin/containerd
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
3.1.3 生成配置文件
bash复制mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 启用SystemdCgroup
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
3.1.4 启动服务
bash复制systemctl daemon-reload
systemctl enable --now containerd
3.2 安装runc和CNI插件
bash复制# 安装runc
install -m 755 /root/runc.amd64 /usr/local/sbin/runc
# 安装CNI插件
mkdir -p /opt/cni/bin
tar -xzf /root/cni-plugins-linux-amd64-v1.5.1.tgz -C /opt/cni/bin/
4. Master节点部署
4.1 安装Kubernetes二进制文件
bash复制tar -xzf /root/kubernetes-node-linux-amd64.tar.gz
cp kubernetes/node/bin/{kubeadm,kubelet,kubectl} /usr/local/bin/
4.2 配置kubelet服务
bash复制cat <<'EOF' > /etc/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
After=network-online.target
[Service]
ExecStart=/usr/local/bin/kubelet
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
mkdir -p /etc/systemd/system/kubelet.service.d
cat > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf << EOF
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/local/bin/kubelet \$KUBELET_KUBECONFIG_ARGS \$KUBELET_CONFIG_ARGS \$KUBELET_KUBEADM_ARGS \$KUBELET_EXTRA_ARGS
EOF
systemctl daemon-reload
systemctl enable --now kubelet
4.3 预拉取控制平面镜像
bash复制K8S_VERSION=v1.33.3
ctr -n k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/kube-apiserver:v1.33.3
ctr -n k8s.io images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/kube-apiserver:v1.33.3 registry.k8s.io/kube-apiserver:v1.33.3
# 其他组件镜像同理...
4.4 初始化集群
bash复制kubeadm reset -f
rm -rf /etc/kubernetes /var/lib/etcd
kubeadm init \
--kubernetes-version=v1.33.3 \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint=192.168.182.11
4.5 配置kubectl
bash复制mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4.6 部署Flannel网络
bash复制kubectl apply -f /root/kube-flannel.yml
5. Worker节点部署
5.1 安装Kubernetes二进制文件
bash复制tar -xzf /root/kubernetes-node-linux-amd64.tar.gz
cp kubernetes/node/bin/{kubeadm,kubelet} /usr/local/bin/
5.2 配置kubelet服务
与Master节点配置相同,参考4.2节。
5.3 预拉取Node所需镜像
bash复制ctr -n k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.10
ctr -n k8s.io images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.10 registry.k8s.io/pause:3.10
# 其他必要镜像...
5.4 加入集群
在Master节点获取join命令:
bash复制kubeadm token create --print-join-command
在Worker节点执行join命令:
bash复制kubeadm join 192.168.182.11:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
6. 集群验证
6.1 检查节点状态
bash复制kubectl get nodes
应看到master和node节点状态均为Ready。
6.2 检查Pod状态
bash复制kubectl get pods -n kube-system
kubectl get pods -n kube-flannel
所有Pod应处于Running状态。
6.3 测试集群功能
部署测试应用:
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
访问NodePort验证服务是否正常。
7. 常见问题与解决方案
7.1 镜像拉取失败
如果遇到镜像拉取问题,可以尝试:
- 检查containerd服务状态
- 确认镜像地址是否正确
- 手动导入离线镜像包
7.2 节点NotReady
可能原因:
- 网络插件未正确部署
- kubelet服务异常
- 节点资源不足
排查步骤:
bash复制journalctl -u kubelet -f # 查看kubelet日志
kubectl describe node <node-name> # 查看节点详情
7.3 Flannel网络异常
常见表现:
- Pod间无法通信
- 跨节点网络不通
解决方法:
- 确认
--pod-network-cidr参数与Flannel配置匹配 - 检查各节点防火墙规则
- 重新部署Flannel
8. 维护与优化建议
8.1 日常维护
- 定期检查节点资源使用情况
- 监控关键组件(Pod)状态
- 及时备份etcd数据
8.2 性能优化
- 调整kubelet资源预留参数
- 优化Pod调度策略
- 根据负载调整网络插件配置
8.3 安全加固
- 定期轮换证书
- 启用RBAC访问控制
- 限制API Server访问
9. 扩展与升级
9.1 添加新节点
- 在新节点重复Worker节点的安装步骤
- 使用join命令加入集群
- 验证新节点状态
9.2 版本升级
- 备份关键数据
- 逐个节点升级组件
- 验证兼容性
10. 资源清理
如需重新部署,可执行:
bash复制kubeadm reset -f
rm -rf /etc/kubernetes/ /var/lib/kubelet/
11. 经验分享
在实际部署过程中,有几个关键点需要特别注意:
-
SystemdCgroup配置:containerd和kubelet的cgroup驱动必须一致,否则会导致Pod创建失败。这也是初学者最容易忽略的问题之一。
-
镜像预拉取:在初始化集群前预先拉取所有必要镜像,可以显著提高部署成功率,特别是在网络不稳定的环境中。
-
join命令时效性:kubeadm token默认有效期为24小时,如果过期需要重新生成。可以通过
kubeadm token create --ttl 0创建永不过期的token。 -
网络插件选择:Flannel虽然简单易用,但在大规模集群中性能可能不足。生产环境可以考虑Calico或Cilium等更强大的方案。
-
离线部署技巧:对于完全离线的环境,可以提前将所有镜像导出为tar包,然后使用
ctr images import命令导入。