1. K8S 1.20.11 部署背景与核心价值
Kubernetes 1.20版本作为2020年底发布的重要稳定版,引入了多项生产级增强特性。选择1.20.11这个最终补丁版本,既避开了早期子版本的潜在缺陷,又能获得完整的API支持周期。对于需要长期稳定运行的环境,这个版本经过社区充分验证,与主流CNI插件、存储驱动和监控方案的兼容性最为可靠。
在实际生产环境中,kubeadm作为官方推荐的集群引导工具,相比minikube、kind等方案更适合真实业务场景。它提供了从零构建生产可用集群的标准路径,同时保持了足够的灵活性来适配不同基础设施需求。1.20版本中kubeadm的重要改进包括:
- 更完善的证书轮换机制
- 对IPv6双栈的正式支持
- 控制平面组件默认以非root用户运行
- 优化了节点加入流程的可靠性
注意:虽然1.20已结束主流支持周期,但其稳定性已被大量生产环境验证。若需更长期支持,可考虑1.22+版本,但需注意API变更带来的适配成本。
2. 基础环境准备与系统调优
2.1 主机规格与操作系统要求
建议至少准备两台4核8G配置的x86_64服务器(1控制节点+1工作节点),操作系统选择CentOS 7.9或Ubuntu 20.04 LTS。关键配置步骤如下:
# 关闭swap(所有节点执行) sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 设置内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system2.2 容器运行时选择与配置
1.20版本仍支持Docker作为运行时,但建议使用containerd以获得更好的稳定性:
# 安装containerd(所有节点) sudo apt-get update && sudo apt-get install -y containerd sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml sudo systemctl restart containerd关键配置项检查:
- 禁用swap后需确认
free -m输出中swap列为0 lsmod | grep br_netfilter应显示模块已加载- containerd的cgroup驱动需与kubelet一致(默认systemd)
3. kubeadm集群初始化实战
3.1 控制平面节点部署
使用kubeadm init时需特别注意镜像拉取策略和网络配置:
sudo kubeadm init \ --kubernetes-version=v1.20.11 \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=<控制节点IP> \ --image-repository registry.aliyuncs.com/google_containers初始化成功后需执行:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config3.2 工作节点加入集群
在工作节点执行控制平面初始化输出的join命令,例如:
sudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx常见问题处理:
- 若token过期,可在控制节点执行
kubeadm token create --print-join-command生成新命令 - 节点状态NotReady通常是CNI插件未安装导致
- 使用
journalctl -u kubelet -f查看节点加入时的详细日志
4. 网络插件与核心组件部署
4.1 Flannel网络插件安装
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml验证网络状态:
kubectl get pods -n kube-system -l app=flannel kubectl get nodes -o wide # 应显示所有节点Ready状态4.2 Metrics Server部署
1.20版本需要额外配置兼容性参数:
# metrics-server.yaml apiVersion: apps/v1 kind: Deployment metadata: name: metrics-server namespace: kube-system spec: template: spec: containers: - args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP5. 生产环境关键配置调优
5.1 kubelet资源预留配置
编辑/var/lib/kubelet/config.yaml:
systemReserved: cpu: "500m" memory: "500Mi" kubeReserved: cpu: "500m" memory: "500Mi" evictionHard: memory.available: "200Mi" nodefs.available: "10%"5.2 证书自动续期配置
1.20版本默认启用证书自动续期,检查配置:
kubeadm alpha certs check-expiration手动续期命令:
kubeadm alpha certs renew all6. 常见故障排查手册
6.1 节点NotReady问题排查流程
- 检查kubelet状态:
systemctl status kubelet - 查看容器运行时日志:
journalctl -u containerd -f - 验证网络插件Pod状态:
kubectl get pods -n kube-system - 检查节点资源:
kubectl describe node <节点名>
6.2 Pod启动失败典型场景
- ImagePullBackoff:镜像拉取失败,检查仓库权限和网络
- CrashLoopBackOff:应用自身崩溃,查看Pod日志
kubectl logs <pod名> - Pending状态:通常资源不足或调度约束导致
7. 版本升级与维护策略
7.1 1.20.11小版本升级步骤
# 控制平面节点 sudo kubeadm upgrade plan sudo kubeadm upgrade apply v1.20.12 # 工作节点 sudo kubeadm upgrade node7.2 关键维护命令速查
# 查看集群事件 kubectl get events --sort-by=.metadata.creationTimestamp # 强制删除卡在Terminating状态的Pod kubectl delete pod <pod名> --grace-period=0 --force # 查看组件健康状态 kubectl get --raw='/readyz?verbose'我在实际部署中发现,1.20版本对旧硬件的兼容性较好,但在资源受限环境中需要特别注意kubelet的eviction配置。一个实用的技巧是提前设置好--image-repository参数使用国内镜像源,可以避免初始化时因网络问题导致的失败。另外,对于开发测试环境,可以考虑使用kubeadm reset快速重建集群,但生产环境务必谨慎执行该操作。