1. Kubernetes 1.31集群部署全景指南
刚接触K8s的朋友可能觉得集群部署像搭积木——看似简单实则暗藏玄机。作为从1.18版本一路跟过来的老运维,我经历过各种离奇的安装翻车现场。今天就用最直白的语言,带大家走通1.31版本的完整安装流程,重点讲解那些官方文档没写的实战细节。
这次我们选择containerd作为运行时、kubeadm作为部署工具、Calico作为网络插件,这个组合在社区经过大量生产验证。相比docker方案,containerd的资源占用减少40%以上;而Calico的BGP模式对网络性能的影响可以控制在3%以内,这些都是版本迭代中沉淀下来的最佳实践。
2. 基础环境准备
2.1 硬件资源配置建议
先看一组实测数据:在阿里云ecs.g7ne实例上(8核32G),部署1.31版本的控制平面节点需要:
- 至少2核CPU(实际压力测试显示空闲时占用0.3核,峰值1.8核)
- 4GB内存(包含etcd等组件的常驻内存)
- 40GB磁盘(/var/lib/etcd单独挂载SSD盘时性能最佳)
工作节点根据负载需求调整,但要注意:
- 每个Pod默认会占用0.1核和100MB内存的系统预留资源
- 建议节点数≥3以实现高可用(我用2节点集群遇到过脑裂问题)
2.2 系统配置关键步骤
所有节点需要统一执行:
bash复制# 关闭Swap(否则kubelet会启动失败)
sudo swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
# 设置正确的时区(日志时间戳对齐的关键)
timedatectl set-timezone Asia/Shanghai
# 加载内核模块(ipvs模式必需)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
sudo modprobe -- $(cat /etc/modules-load.d/k8s.conf)
重要提示:如果使用CentOS 7,需要额外升级内核到4.19+版本,否则会遇到cgroup v2兼容性问题。建议直接选用Ubuntu 22.04或RHEL 8+。
3. 容器运行时部署
3.1 containerd精细调优
安装后需要修改配置:
bash复制sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
关键参数调整:
toml复制[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
disable_snapshot_annotations = true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 必须开启以适配kubelet
重启服务时注意顺序:
bash复制sudo systemctl daemon-reload
sudo systemctl restart containerd
sudo systemctl enable containerd
3.2 常见安装坑排查
遇到过最诡异的问题:某次安装后容器网络不通,最终发现是firewalld的nftables后端与CNI插件冲突。解决方案:
bash复制sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo iptables -F
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
4. 控制平面部署实战
4.1 kubeadm定制化配置
创建kubeadm-config.yaml:
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: "LOAD_BALANCER_DNS:6443"
networking:
podSubnet: "192.168.0.0/16"
serviceSubnet: "10.96.0.0/12"
apiServer:
extraArgs:
advertise-address: "MASTER_NODE_IP"
enable-admission-plugins: "NodeRestriction"
controllerManager:
extraArgs:
node-cidr-mask-size: "24"
scheduler:
extraArgs:
bind-address: "0.0.0.0"
初始化命令需要添加关键参数:
bash复制sudo kubeadm init --config=kubeadm-config.yaml \
--upload-certs \
--ignore-preflight-errors=Swap
4.2 证书管理技巧
查看证书过期时间(1.31版本默认延长到2年):
bash复制kubeadm certs check-expiration
手动续期所有证书(生产环境建议配置自动续期):
bash复制kubeadm certs renew all
5. 工作节点接入规范
5.1 join命令的隐藏参数
通过--discovery-token-ca-cert-hash参数增强安全性:
bash复制openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt \
| openssl rsa -pubin -outform der 2>/dev/null \
| openssl dgst -sha256 -hex
完整的join命令示例:
bash复制sudo kubeadm join 10.0.0.100:6443 \
--token xyz123.abc456 \
--discovery-token-ca-cert-hash sha256:你的哈希值 \
--node-labels="disk=ssd,zone=cn-east-1a" \
--ignore-preflight-errors=NumCPU
5.2 节点标签管理策略
生产环境建议标准化标签:
bash复制kubectl label nodes node01 \
topology.kubernetes.io/region=cn-east \
topology.kubernetes.io/zone=cn-east-1a \
node.kubernetes.io/instance-type=ecs.g7ne
6. 网络插件选型与部署
6.1 Calico的BGP模式配置
安装时指定IP池和BGP参数:
bash复制kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
cat <<EOF | kubectl apply -f -
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
calicoNetwork:
bgp: Enabled
ipPools:
- blockSize: 26
cidr: 192.168.0.0/16
encapsulation: None
natOutgoing: Enabled
nodeSelector: all()
EOF
6.2 网络性能调优参数
调整calico-node的MTU(云环境通常需要):
bash复制kubectl patch daemonset calico-node -n kube-system \
--type='json' \
-p='[{"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": {"name": "FELIX_IPINIPMTU", "value": "1480"}}]'
7. 集群验证与问题排查
7.1 健康检查黄金命令组合
bash复制# 查看核心组件状态
kubectl get componentstatuses
# 检查节点资源分配
kubectl describe nodes | grep -A 10 "Allocated resources"
# 网络连通性测试(需要提前部署测试Pod)
kubectl run net-test --image=alpine --restart=Never --rm -it -- ping 8.8.8.8
# 查看事件日志(按时间排序)
kubectl get events --sort-by=.metadata.creationTimestamp
7.2 典型故障处理记录
案例1:Pod一直处于Pending状态
- 排查路径:
- kubectl describe pod
查看Events - kubectl get nodes 检查节点状态
- kubectl get pods -n kube-system 确认网络插件运行正常
- kubectl describe pod
- 常见原因:节点资源不足、未配置污点容忍、网络插件异常
案例2:API Server间歇性不可用
- 快速诊断:
bash复制
curl -k https://localhost:6443/healthz journalctl -u kube-apiserver -n 100 --no-pager - 解决方案:检查etcd集群状态、调整apiserver的--max-requests-inflight参数
8. 生产环境加固建议
8.1 关键安全配置
启用PSP(Pod安全策略):
yaml复制apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
fsGroup:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
8.2 监控基线配置
必备的Prometheus监控指标:
- kubelet_http_requests_total:API请求量
- apiserver_request_duration_seconds:API响应延迟
- etcd_db_total_size_in_bytes:etcd存储大小
- container_memory_working_set_bytes:容器内存使用量
9. 版本升级路线图
1.31版本的显著变化:
- 移除了dockershim的残留代码
- 引入SidecarContainers特性门控
- kube-proxy支持IPVS的SCTP协议
- 动态资源分配进入Beta阶段
升级前必须检查:
bash复制kubeadm upgrade plan
kubectl get pods -A -o json | jq -r '.items[] | select(.spec.containers[].resources.requests != null) | .metadata.namespace + "/" + .metadata.name'
升级过程中遇到最多的问题是CRD兼容性,建议提前用kubeconform验证:
bash复制kubeconform -summary -strict -kubernetes-version 1.31.0 manifests/