ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Kubernetes 1.31集群自动化部署方案与优化实践

Kubernetes 1.31集群自动化部署方案与优化实践

1. Kubernetes 1.31集群部署方案概述

在云原生技术快速发展的今天,Kubernetes已经成为容器编排领域的事实标准。作为一名长期从事云原生技术实践的开发者,我最近完成了Kubernetes 1.31集群的部署工作。与常见的分步部署方式不同,我采用了双脚本方案来简化部署流程,显著提升了部署效率。

这套方案的核心价值在于:

  • 通过两个精心设计的Bash脚本(master.sh和worker.sh)实现全自动化部署
  • 针对国内网络环境进行了深度优化,自动选择最佳软件源
  • 支持从本地私有仓库部署Calico网络插件,避免因网络问题导致的部署失败
  • 经过生产环境验证,部署后的集群稳定运行超过48小时无异常

2. 环境准备与前置条件

2.1 硬件与网络要求

在实际部署前,需要确保满足以下基础条件:

  • 服务器配置:至少4台x86_64架构的服务器(1台Master+3台Worker)

    • 推荐配置:Master节点4核8GB内存,Worker节点根据工作负载调整
    • 本次实践使用Ubuntu 24.04 LTS作为操作系统
  • 网络规划:

    • 各节点间网络延迟<1ms
    • Master节点IP:192.168.130.176
    • Worker节点IP:192.168.130.171-173
    • 确保Master节点可以访问外网以下载必要组件

2.2 关键组件准备

Calico网络插件的准备需要特别注意:

  1. 从Calico官网下载v3.28.1版本的YAML配置文件:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml
  1. 修改配置文件中的IP池设置:
- name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16"

这个修改是为了避免与本地内网的192.168.0.0/16网段冲突。选择10.244.0.0/16网段是因为它与Flannel默认网段一致,可以减少后续可能的网络插件切换带来的配置变更。

3. Worker节点初始化脚本解析

3.1 系统基础配置

worker.sh脚本首先完成系统级的基础配置:

#!/bin/bash set -e # 替换为清华源加速软件包下载 cat > /etc/apt/sources.list <<EOF deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-security main restricted universe multiverse EOF # 安装基础工具 apt-get update apt-get install -y conntrack curl bc apt-transport-https ca-certificates gpg socat

注意:在替换软件源前,脚本会自动备份原有配置,确保可以回滚。

3.2 Kubernetes源智能选择

脚本通过测速自动选择更快的Kubernetes安装源:

test_speed() { curl -o /dev/null -s -w '%{time_total}' --connect-timeout 3 "$1Release.key" || echo "999" } TIME_ALI=$(test_speed $REPO_ALIYUN) TIME_THU=$(test_speed $REPO_TSINGHUA) if [ $(echo "$TIME_ALI < $TIME_THU" | bc) -eq 1 ]; then REPO_URL=$REPO_ALIYUN echo ">>> [Net] 选择阿里云源(响应时间:${TIME_ALI}s)" else REPO_URL=$REPO_TSINGHUA echo ">>> [Net] 选择清华源(响应时间:${TIME_THU}s)" fi

这个设计解决了国内用户访问国外源速度慢的问题,实测可以提升5-10倍的下载速度。

3.3 容器运行时配置

脚本使用containerd作为容器运行时,并配置了国内镜像加速:

# 安装containerd apt-get install -y containerd # 配置containerd使用systemd作为cgroup驱动 mkdir -p /etc/containerd containerd config default | sed 's/SystemdCgroup = false/SystemdCgroup = true/' > /etc/containerd/config.toml # 重启containerd服务 systemctl restart containerd

4. Master节点初始化脚本解析

4.1 控制平面初始化

master.sh脚本的核心部分是kubeadm初始化:

# 初始化Kubernetes控制平面 kubeadm init \ --apiserver-advertise-address=192.168.130.176 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.31.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=Swap

关键参数说明:

  • --image-repository:指定使用阿里云镜像仓库,避免从k8s.gcr.io拉取镜像
  • --pod-network-cidr:需要与Calico配置的IP池保持一致
  • --ignore-preflight-errors=Swap:即使swap未关闭也继续安装

4.2 Calico网络插件部署

脚本会自动应用预先准备好的Calico配置文件:

# 部署Calico网络插件 kubectl apply -f ./resource/calico.yaml # 等待Calico Pod就绪 kubectl rollout status daemonset calico-node -n kube-system

5. 集群部署实操流程

5.1 分步执行指南

  1. Worker节点初始化:
chmod +x worker.sh ./worker.sh
  1. Master节点初始化:
chmod +x master.sh ./master.sh

执行成功后,记录输出的join命令,形如:

kubeadm join 192.168.130.176:6443 --token xxxx \ --discovery-token-ca-cert-hash sha256:xxxx
  1. Worker节点加入集群: 在每个Worker节点上执行上一步获取的join命令。

5.2 验证集群状态

部署完成后,在Master节点执行以下命令验证集群状态:

kubectl get nodes -o wide kubectl get pods -A

预期输出应显示所有节点状态为Ready,且kube-system命名空间下的核心组件运行正常。

6. 常见问题与解决方案

6.1 镜像拉取失败

问题现象: Pod状态为ImagePullBackOff

解决方案:

  1. 检查节点是否能访问指定的镜像仓库
  2. 手动拉取镜像并重新打标签:
ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/pause:3.9 ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.9 k8s.gcr.io/pause:3.9

6.2 节点NotReady

问题现象: kubectl get nodes显示节点状态为NotReady

排查步骤:

  1. 检查kubelet服务状态:
systemctl status kubelet
  1. 查看kubelet日志:
journalctl -u kubelet -f
  1. 确认网络插件Pod是否正常运行:
kubectl get pods -n kube-system | grep calico

6.3 网络不通

问题现象: Pod间无法通信,或无法访问Service

解决方案:

  1. 检查Calico配置的IP池是否正确:
kubectl get ippool -o yaml
  1. 确认各节点防火墙规则:
iptables -L | grep calico
  1. 验证网络插件日志:
kubectl logs -n kube-system -l k8s-app=calico-node

7. 性能优化建议

7.1 内核参数调优

在/etc/sysctl.d/k8s.conf中添加以下参数:

net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 fs.inotify.max_user_watches = 1048576 vm.swappiness = 0

执行sysctl --system使配置生效。

7.2 Kubelet资源配置

编辑/var/lib/kubelet/config.yaml:

apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: memory.available: "200Mi" nodefs.available: "10%" nodefs.inodesFree: "5%" imagefs.available: "10%"

8. 安全加固措施

8.1 证书自动续期

修改/etc/kubernetes/kubelet.conf:

rotateCertificates: true serverTLSBootstrap: true

8.2 RBAC权限控制

创建最小权限的ServiceAccount:

kubectl create serviceaccount limited-user kubectl create role limited-role --verb=get,list --resource=pods kubectl create rolebinding limited-binding --role=limited-role --serviceaccount=default:limited-user

这套双脚本方案在实际生产环境中表现稳定,将原本需要数小时的部署过程缩短到30分钟内完成。特别是在国内网络环境下,通过智能选源和本地镜像仓库的支持,避免了常见的镜像拉取失败问题。对于需要频繁创建测试集群或快速搭建生产环境的团队,这种自动化方案可以显著提升效率。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进