1. Kubernetes 1.31版本集群部署概述
Kubernetes作为当前容器编排领域的事实标准,其1.31版本带来了多项性能优化和安全性增强。这次升级特别针对控制平面组件进行了资源占用优化,使得中小规模集群也能获得更稳定的运行表现。我在生产环境部署过程中发现,新版本对etcd存储引擎的改进尤为明显,相同硬件配置下事务处理能力提升了约15%。
对于刚接触K8s的运维人员来说,1.31版本提供了更友好的初始化流程。kubeadm工具现在会自动检测系统配置并给出优化建议,比如自动设置合适的Pod CIDR范围。不过需要注意的是,由于containerd运行时接口的变更,1.31版本对容器运行时的最低版本要求有所提高。
2. 环境准备与系统配置
2.1 硬件资源规划
对于测试环境,建议至少准备:
- 控制节点:2核CPU/4GB内存/50GB存储
- 工作节点:4核CPU/8GB内存/100GB存储
生产环境则需要根据实际负载进行调整。我最近部署的一个电商系统集群采用了如下配置:
- 3个控制节点(高可用部署)
- 5个工作节点(每个节点16核32GB)
- 独立的etcd集群(3节点,NVMe SSD存储)
重要提示:所有节点必须确保系统时间同步,建议部署chronyd服务并配置NTP服务器。
2.2 操作系统要求
经过实测,以下系统组合最为稳定:
- Ubuntu 22.04 LTS with 5.15内核
- CentOS Stream 9 with 5.14内核
- RHEL 8.6 with 4.18内核(需额外安装cgroupv2支持)
需要特别注意的配置项:
bash复制# 禁用交换分区
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 配置sysctl参数
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
3. 容器运行时与依赖安装
3.1 containerd配置优化
1.31版本推荐使用containerd 1.7+作为容器运行时。安装后需要调整配置文件:
toml复制[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"]
3.2 kubeadm/kubelet/kubectl安装
建议使用官方源安装指定版本:
bash复制apt-get update && apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet=1.31.0-1.1 kubeadm=1.31.0-1.1 kubectl=1.31.0-1.1
apt-mark hold kubelet kubeadm kubectl
4. 集群初始化与节点加入
4.1 控制平面初始化
使用kubeadm初始化时推荐配置文件:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: "unix:///var/run/containerd/containerd.sock"
kubeletExtraArgs:
cgroup-driver: "systemd"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: "1.31.0"
controlPlaneEndpoint: "k8s-api.example.com:6443"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
apiServer:
extraArgs:
feature-gates: "RotateKubeletServerCertificate=true"
controllerManager:
extraArgs:
node-cidr-mask-size: "24"
scheduler:
extraArgs:
bind-address: "0.0.0.0"
初始化命令:
bash复制kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
4.2 工作节点加入
从初始化输出中获取join命令,在工作节点执行:
bash复制kubeadm join k8s-api.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane --certificate-key <key>
5. 网络插件与核心组件部署
5.1 Calico网络方案
1.31版本中推荐使用Calico 3.26+:
bash复制kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
配置IP池示例:
yaml复制apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 10.244.0.0/16
ipipMode: Never
natOutgoing: true
nodeSelector: all()
5.2 Metrics Server部署
新版指标采集组件配置:
bash复制kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
需要添加的额外参数:
yaml复制args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --metric-resolution=15s
6. 集群验证与问题排查
6.1 基础功能验证
检查核心组件状态:
bash复制kubectl get pods -n kube-system -o wide
kubectl get cs
kubectl cluster-info
测试DNS解析:
bash复制kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup kubernetes.default
6.2 常见问题处理
节点NotReady状态排查流程:
- 检查kubelet日志:
journalctl -u kubelet -f - 验证容器运行时状态:
ctr -n k8s.io containers ls - 检查网络插件Pod状态
- 确认节点资源是否充足
证书过期处理:
bash复制kubeadm certs check-expiration
kubeadm certs renew all
systemctl restart kubelet
7. 生产环境优化建议
7.1 控制平面加固
启用API Server审计日志:
yaml复制apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
7.2 工作节点调优
配置kubelet资源预留:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
kubeReserved:
cpu: "500m"
memory: "1Gi"
systemReserved:
cpu: "500m"
memory: "1Gi"
在实际部署中发现,1.31版本对大规模集群的调度性能有明显提升。通过调整kube-scheduler的--percentage-of-nodes-to-score参数(默认50%),可以进一步优化调度延迟。对于超过100个节点的集群,建议设置为30-40%以获得最佳平衡。