1. Kubernetes 1.20 集群部署概述
Kubernetes 1.20版本发布于2020年12月,这个版本带来了多项重要改进,包括Dockershim弃用通知、API优先级和公平性增强、以及Volume快照功能进入GA阶段。对于想要在生产环境部署K8s集群的运维人员和开发者来说,1.20版本提供了更稳定和强大的功能集。
在实际部署过程中,我发现1.20版本相比之前版本在安装配置上有几个关键变化:首先是对容器运行时接口(CRI)的支持更加完善,其次是kubeadm工具的默认配置有所调整。本文将基于这些变化,详细介绍从零开始部署一个高可用Kubernetes 1.20集群的全过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件与操作系统要求
对于生产环境,建议至少准备三台配置相同的服务器作为控制平面节点,以及若干工作节点。每台控制平面节点应满足:
- 2核以上CPU
- 4GB以上内存
- 40GB以上磁盘空间
- 千兆网络连接
操作系统方面,我推荐使用Ubuntu 20.04 LTS或CentOS 8,这两个发行版对Kubernetes 1.20有良好的支持。以下是基础系统配置步骤:
bash复制# 禁用交换分区(所有节点)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 设置主机名(在各节点分别执行)
sudo hostnamectl set-hostname k8s-master-01
sudo hostnamectl set-hostname k8s-worker-01
# 其他节点依此类推
# 配置hosts文件(所有节点相同)
cat <<EOF | sudo tee -a /etc/hosts
192.168.1.101 k8s-master-01
192.168.1.102 k8s-master-02
192.168.1.103 k8s-master-03
192.168.1.201 k8s-worker-01
192.168.1.202 k8s-worker-02
EOF
2.2 容器运行时安装
Kubernetes 1.20开始正式弃用Docker作为容器运行时,推荐使用containerd或CRI-O。这里我们选择containerd:
bash复制# 安装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
sudo systemctl enable containerd
# 修改cgroup驱动为systemd
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
注意:如果之前安装过Docker,需要完全卸载以避免冲突。containerd的配置文件中
SystemdCgroup参数必须设为true,以匹配kubelet的默认cgroup驱动。
3. Kubernetes组件安装与配置
3.1 安装kubeadm、kubelet和kubectl
在所有节点上执行以下命令安装Kubernetes组件:
bash复制# 添加Kubernetes仓库
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
# 安装指定版本(1.20.x)
sudo apt-get install -y kubelet=1.20.15-00 kubeadm=1.20.15-00 kubectl=1.20.15-00
sudo apt-mark hold kubelet kubeadm kubectl
3.2 初始化控制平面
在主节点1上执行初始化命令:
bash复制sudo kubeadm init \
--control-plane-endpoint "k8s-cluster.example.com:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version v1.20.15 \
--service-cidr=10.96.0.0/12
关键参数说明:
--control-plane-endpoint: 高可用集群的负载均衡端点--upload-certs: 自动上传证书供其他控制平面节点使用--pod-network-cidr: 需要与后续安装的CNI插件匹配
初始化完成后,按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.3 加入其他控制平面节点
使用初始化时输出的命令加入其他控制平面节点:
bash复制kubeadm join k8s-cluster.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <key>
4. 网络插件与附加组件部署
4.1 安装Flannel网络插件
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
验证网络插件状态:
bash复制kubectl get pods -n kube-system -l app=flannel
4.2 部署CoreDNS和Metrics Server
bash复制# 检查CoreDNS是否已自动部署
kubectl get deployment -n kube-system coredns
# 部署Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
5. 工作节点加入集群
在每个工作节点上执行初始化时输出的join命令(不带--control-plane参数):
bash复制kubeadm join k8s-cluster.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
6. 集群验证与测试
6.1 基本状态检查
bash复制# 查看节点状态
kubectl get nodes -o wide
# 查看系统Pod状态
kubectl get pods -n kube-system
# 检查集群健康状态
kubectl get componentstatuses
6.2 部署测试应用
bash复制kubectl create deployment nginx-test --image=nginx
kubectl expose deployment nginx-test --port=80 --type=NodePort
kubectl get svc nginx-test
访问测试服务,验证集群功能是否正常。
7. 生产环境关键配置
7.1 证书自动续期配置
Kubernetes 1.20改进了证书管理,默认证书有效期延长到1年。建议配置自动续期:
bash复制# 修改kube-controller-manager配置
sudo vi /etc/kubernetes/manifests/kube-controller-manager.yaml
# 添加以下参数:
# - --experimental-cluster-signing-duration=87600h0m0s
# - --feature-gates=RotateKubeletServerCertificate=true
7.2 资源限制与调度优化
bash复制# 配置kubelet资源预留(所有节点)
sudo vi /var/lib/kubelet/config.yaml
# 添加:
systemReserved:
cpu: "500m"
memory: "500Mi"
kubeReserved:
cpu: "500m"
memory: "500Mi"
重启kubelet使配置生效:
bash复制sudo systemctl restart kubelet
8. 常见问题排查
8.1 节点NotReady状态
可能原因及解决方案:
- 网络插件未正确安装 - 重新部署Flannel
- 容器运行时问题 - 检查containerd日志
journalctl -u containerd - kubelet配置错误 - 检查
/var/log/syslog中的kubelet日志
8.2 Pod一直处于Pending状态
排查步骤:
bash复制# 查看Pod描述
kubectl describe pod <pod-name>
# 查看事件
kubectl get events --sort-by='.metadata.creationTimestamp'
常见原因包括资源不足、节点选择器不匹配或持久卷声明问题。
8.3 证书过期问题
检查证书有效期:
bash复制kubectl get csr
kubectl certificate approve <csr-name>
如果证书已过期,需要手动更新:
bash复制kubeadm alpha certs renew all
9. 升级与维护策略
9.1 集群升级准备
- 备份关键数据:
bash复制# 备份etcd
kubectl exec -n kube-system etcd-k8s-master-01 -- \
etcdctl snapshot save /var/lib/etcd/snapshot.db
# 备份kubeadm配置
kubeadm config view > kubeadm-config.yaml
9.2 分阶段升级步骤
- 升级kubeadm:
bash复制sudo apt-get update && sudo apt-get install -y kubeadm=1.21.0-00
- 升级控制平面:
bash复制sudo kubeadm upgrade apply v1.21.0
- 升级kubelet和kubectl:
bash复制sudo apt-get install -y kubelet=1.21.0-00 kubectl=1.21.0-00
sudo systemctl restart kubelet
10. 安全加固建议
10.1 RBAC配置
创建最小权限角色:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
10.2 网络策略
限制Pod间通信:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
10.3 审计日志配置
bash复制# 创建审计策略文件
sudo vi /etc/kubernetes/audit-policy.yaml
# 修改api-server配置
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加:
# - --audit-policy-file=/etc/kubernetes/audit-policy.yaml
# - --audit-log-path=/var/log/kubernetes/audit.log
