1. 环境准备与前置条件检查
在开始部署Kubernetes 1.20.11集群之前,我们需要确保所有节点满足基本要求。我建议使用CentOS 7.9或Ubuntu 20.04 LTS作为基础操作系统,这两个版本在社区支持度和稳定性方面都有良好表现。
1.1 系统要求与配置
每个节点至少需要:
- 2核CPU(生产环境建议4核以上)
- 2GB内存(控制平面节点建议4GB以上)
- 20GB磁盘空间
- 唯一的主机名、MAC地址和product_uuid
- 禁用swap分区(Kubernetes 1.20+强制要求)
执行以下命令进行基础配置:
# 设置主机名(在各节点分别执行) hostnamectl set-hostname k8s-master # 主节点 hostnamectl set-hostname k8s-node1 # 工作节点1 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 禁用SELinux setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab1.2 网络与内核参数调优
Kubernetes对网络和内核参数有特定要求,需要调整以下参数:
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 sysctl --system注意:如果遇到"bridge-nf-call"参数报错,需要先加载br_netfilter模块:
modprobe br_netfilter
1.3 容器运行时安装
Kubernetes 1.20开始逐步弃用对Docker的直接支持,推荐使用containerd作为容器运行时。以下是安装步骤:
# 安装containerd yum install -y containerd.io # 生成默认配置 containerd config default > /etc/containerd/config.toml # 修改配置启用SystemdCgroup sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml # 启动并设置开机自启 systemctl restart containerd systemctl enable containerd2. kubeadm工具安装与配置
2.1 配置Kubernetes仓库
添加Kubernetes官方仓库:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF2.2 安装kubeadm、kubelet和kubectl
指定安装1.20.11版本:
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11 --disableexcludes=kubernetes # 设置kubelet开机启动(先不要启动,等初始化完成) systemctl enable kubelet2.3 配置kubeadm初始化文件
创建kubeadm-config.yaml配置文件:
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: 1.20.11 controlPlaneEndpoint: "k8s-master:6443" networking: podSubnet: "10.244.0.0/16" # 为Flannel网络插件准备 serviceSubnet: "10.96.0.0/12" apiServer: extraArgs: runtime-config: "apps/v1=true" controllerManager: {} scheduler: {}3. 集群初始化与节点加入
3.1 主节点初始化
执行初始化命令:
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log初始化成功后,按照提示配置kubectl:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config保存节点加入命令(后面工作节点会用到):
kubeadm token create --print-join-command > join-command.sh3.2 工作节点加入集群
在工作节点上执行主节点生成的加入命令:
# 示例命令(实际使用主节点生成的命令) kubeadm join k8s-master:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef验证节点状态:
kubectl get nodes -o wide常见问题:如果节点长时间处于NotReady状态,通常是网络插件未安装或容器镜像拉取失败导致。
4. 网络插件安装与集群验证
4.1 安装Flannel网络插件
Kubernetes 1.20.11推荐使用Flannel v0.13.0:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.13.0/Documentation/kube-flannel.yml检查网络组件状态:
kubectl get pods -n kube-system -l app=flannel4.2 集群功能验证
部署测试应用验证集群功能:
kubectl create deployment nginx --image=nginx:1.19 kubectl expose deployment nginx --port=80 --type=NodePort kubectl get svc nginx访问测试:
curl http://<任意节点IP>:<NodePort>4.3 核心组件状态检查
检查所有系统Pod状态:
kubectl get pods -n kube-system常见问题排查命令:
# 查看组件日志 journalctl -u kubelet -f kubectl logs <pod-name> -n kube-system # 检查证书有效期 kubeadm alpha certs check-expiration5. 生产环境优化建议
5.1 证书管理
Kubernetes默认证书有效期为1年,建议提前续期:
kubeadm alpha certs renew all5.2 高可用配置
生产环境建议配置多控制平面节点:
# 在其他控制平面节点执行 kubeadm join k8s-master:6443 --token ... \ --discovery-token-ca-cert-hash ... \ --control-plane --certificate-key ...5.3 资源限制与调度优化
配置kubelet资源预留(/var/lib/kubelet/config.yaml):
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: memory.available: "500Mi" nodefs.available: "10%" systemReserved: cpu: "500m" memory: "500Mi"5.4 监控与日志方案
部署基础监控组件:
# 安装Metrics Server kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 验证监控数据 kubectl top nodes kubectl top pods6. 版本特定注意事项
Kubernetes 1.20版本有几个重要变化需要特别注意:
- Docker支持弃用:虽然仍能使用Docker作为运行时,但会收到警告,建议迁移到containerd
- API变化:
- 移除了extensions/v1beta1, apps/v1beta1和apps/v1beta2 API
- 默认启用EndpointSlice
- kubeadm变化:
- 默认使用control-plane标签而非master
- 改进了证书管理机制
回滚到旧版本的方法:
kubeadm reset yum remove kubelet kubeadm kubectl # 然后安装特定旧版本我在实际部署中发现,1.20.11版本对ARM架构的支持有所改进,但在某些旧硬件上可能需要额外配置内核参数。另外,这个版本对IPv6的支持还不够完善,如果网络环境中有IPv6,建议暂时禁用以避免意外问题。