Rocky Linux 9上部署高可用Kubernetes集群指南

📅 2026/8/9 21:41:20
Rocky Linux 9上部署高可用Kubernetes集群指南
1. 项目概述在当今云原生技术蓬勃发展的时代Kubernetes已成为容器编排领域的事实标准。而Rocky Linux作为RHEL的完美替代品凭借其稳定性和长期支持特性正成为企业级部署的首选操作系统。本文将详细记录在Rocky Linux 9系统上部署多Master高可用Kubernetes集群的全过程涵盖从系统准备到集群验证的每个关键环节。高可用Kubernetes集群的核心在于Master节点的冗余设计。传统单Master架构存在单点故障风险一旦Master节点宕机整个集群将失去管理能力。通过部署多Master节点配合负载均衡器可以确保即使某个Master节点故障集群控制平面仍能持续运作。这种架构特别适合生产环境能够满足企业对于服务连续性的严格要求。2. 环境准备与系统配置2.1 硬件与网络规划对于生产级Kubernetes集群建议至少准备3台物理机或虚拟机作为Master节点配置建议CPU4核以上内存8GB以上存储50GB以上系统盘 额外数据盘用于etcd网络千兆网卡固定IP地址网络拓扑应采用分离式设计管理网络用于节点间通信如10.0.1.0/24服务网络用于Kubernetes Service如172.16.0.0/16Pod网络用于容器间通信如192.168.0.0/16重要提示所有节点必须确保时间同步建议部署NTP服务。时差过大会导致etcd集群出现严重问题。2.2 Rocky Linux基础配置在所有节点执行以下基础配置# 禁用SELinuxKubernetes兼容性问题 sudo sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config sudo setenforce 0 # 关闭防火墙或配置放行规则 sudo systemctl stop firewalld sudo systemctl disable firewalld # 加载内核模块 cat EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # 配置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 sudo sysctl --system2.3 容器运行时安装Kubernetes 1.24版本默认不再包含Docker支持推荐使用containerd# 安装containerd sudo yum install -y containerd.io # 生成默认配置并启用SystemdCgroup sudo containerd config default | sudo tee /etc/containerd/config.toml sudo sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml # 启动服务 sudo systemctl restart containerd sudo systemctl enable containerd3. Kubernetes组件安装与配置3.1 安装kubeadm、kubelet和kubectl在所有节点执行# 添加Kubernetes仓库 cat EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://pkgs.k8s.io/core:/stable:/v1.28/rpm/ enabled1 gpgcheck1 gpgkeyhttps://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key EOF # 安装组件指定版本以避免兼容性问题 sudo yum install -y kubelet-1.28.4 kubeadm-1.28.4 kubectl-1.28.4 --disableexcludeskubernetes # 启动kubelet sudo systemctl enable --now kubelet3.2 初始化第一个Master节点选择一台作为初始Master节点执行sudo kubeadm init \ --control-plane-endpoint LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \ --upload-certs \ --pod-network-cidr192.168.0.0/16 \ --service-cidr172.16.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers关键参数说明--control-plane-endpoint: 负载均衡器的DNS和端口--upload-certs: 自动上传证书供其他Master节点使用--pod-network-cidr: 必须与后续安装的CNI插件匹配--image-repository: 使用国内镜像加速初始化成功后记下输出的join命令包含证书密钥用于其他节点加入集群。3.3 配置kubectl访问mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config验证集群状态kubectl get nodes kubectl get pods -n kube-system4. 高可用控制平面部署4.1 添加额外Master节点在其他Master节点执行初始化时输出的join命令需包含--control-plane和--certificate-key参数sudo kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \ --token token \ --discovery-token-ca-cert-hash sha256:hash \ --control-plane \ --certificate-key key-from-init4.2 etcd集群健康检查多Master架构下etcd以集群模式运行。验证etcd健康状态# 获取etcd Pod名称 ETCD_POD$(kubectl get pods -n kube-system -l componentetcd -o jsonpath{.items[0].metadata.name}) # 检查成员列表 kubectl exec -it -n kube-system $ETCD_POD -- etcdctl \ --cert/etc/kubernetes/pki/etcd/peer.crt \ --key/etc/kubernetes/pki/etcd/peer.key \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ member list # 检查集群健康状态 kubectl exec -it -n kube-system $ETCD_POD -- etcdctl \ --cert/etc/kubernetes/pki/etcd/peer.crt \ --key/etc/kubernetes/pki/etcd/peer.key \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ endpoint health健康输出应显示所有etcd成员状态正常。4.3 负载均衡器配置高可用集群需要前置负载均衡器分发API Server流量。以Nginx为例的配置stream { upstream kube_apiserver { server master1:6443; server master2:6443; server master3:6443; } server { listen 6443; proxy_pass kube_apiserver; } }生产环境建议使用硬件负载均衡器或云服务商的LB服务并配置健康检查。5. 网络插件与附加组件5.1 安装Calico网络插件kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml验证安装watch kubectl get pods -n calico-system5.2 部署Metrics Serverkubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml5.3 配置本地存储类kubectl apply -f - EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer EOF6. 集群验证与故障排查6.1 基础功能验证创建测试Deploymentkubectl create deployment nginx --imagenginx kubectl expose deployment nginx --port80 kubectl get svc,pods访问测试kubectl run -it --rm test --imagebusybox -- sh wget -qO- nginx6.2 高可用性测试随机停止一个Master节点的kubelet服务验证集群操作是否正常如创建/删除资源检查kubectl get nodes输出是否准确恢复节点后观察自动重新加入过程6.3 常见问题排查问题1kubeadm init卡住检查网络连通性确认容器运行时正常运行查看日志journalctl -xeu kubelet问题2节点NotReady检查kubelet状态systemctl status kubelet验证网络插件Pod是否正常运行查看节点详情kubectl describe node问题3证书过期更新证书kubeadm certs renew all重启控制平面组件7. 生产环境优化建议7.1 安全加固措施启用RBAC并限制默认服务账户权限配置网络策略限制Pod间通信定期轮换证书默认1年有效期启用审计日志并集中收集7.2 性能调优参数# kubelet配置/var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration maxPods: 150 kubeAPIQPS: 50 kubeAPIBurst: 1007.3 备份与恢复策略etcd定期备份脚本ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ snapshot save /backup/etcd-snapshot-$(date %Y%m%d).db恢复步骤停止所有API Server恢复etcd数据重启控制平面组件8. 长期维护指南8.1 版本升级策略先升级kubeadm工具逐个排空并升级Master节点最后升级Worker节点验证各组件兼容性8.2 监控方案部署推荐使用Prometheus-Operator套件kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup.yaml kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/8.3 日志收集架构EFK(ElasticsearchFluentdKibana)部署示例# 安装Elasticsearch kubectl apply -f https://download.elastic.co/downloads/eck/2.6.1/crds.yaml kubectl apply -f https://download.elastic.co/downloads/eck/2.6.1/operator.yaml # 部署Fluentd DaemonSet kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch-rbac.yaml在实际生产环境中运行这套架构已有半年时间最大的体会是前期规划比后期补救更重要。特别是网络规划和证书管理如果初期设计不当后期调整会非常痛苦。建议在部署前绘制详细的架构图明确每个组件的交互关系并建立完善的监控体系这样才能真正发挥高可用集群的价值。