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节点,配置建议:

  • CPU:4核以上
  • 内存:8GB以上
  • 存储:50GB以上系统盘 + 额外数据盘(用于etcd)
  • 网络:千兆网卡,固定IP地址

网络拓扑应采用分离式设计:

  • 管理网络:用于节点间通信(如10.0.1.0/24)
  • 服务网络:用于Kubernetes Service(如172.16.0.0/16)
  • Pod网络:用于容器间通信(如192.168.0.0/16)

重要提示:所有节点必须确保时间同步,建议部署NTP服务。时差过大会导致etcd集群出现严重问题。

2.2 Rocky Linux基础配置

在所有节点执行以下基础配置:

# 禁用SELinux(Kubernetes兼容性问题) sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /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 --system

2.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 containerd

3. Kubernetes组件安装与配置

3.1 安装kubeadm、kubelet和kubectl

在所有节点执行:

# 添加Kubernetes仓库 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/ enabled=1 gpgcheck=1 gpgkey=https://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 --disableexcludes=kubernetes # 启动kubelet sudo systemctl enable --now kubelet

3.2 初始化第一个Master节点

选择一台作为初始Master节点执行:

sudo kubeadm init \ --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \ --upload-certs \ --pod-network-cidr=192.168.0.0/16 \ --service-cidr=172.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-system

4. 高可用控制平面部署

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-init>

4.2 etcd集群健康检查

多Master架构下,etcd以集群模式运行。验证etcd健康状态:

# 获取etcd Pod名称 ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -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-system

5.2 部署Metrics Server

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

5.3 配置本地存储类

kubectl apply -f - <<EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer EOF

6. 集群验证与故障排查

6.1 基础功能验证

创建测试Deployment:

kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 kubectl get svc,pods

访问测试:

kubectl run -it --rm test --image=busybox -- sh wget -qO- nginx

6.2 高可用性测试

  1. 随机停止一个Master节点的kubelet服务
  2. 验证集群操作是否正常(如创建/删除资源)
  3. 检查kubectl get nodes输出是否准确
  4. 恢复节点后观察自动重新加入过程

6.3 常见问题排查

问题1:kubeadm init卡住

  • 检查网络连通性
  • 确认容器运行时正常运行
  • 查看日志:journalctl -xeu kubelet

问题2:节点NotReady

  • 检查kubelet状态:systemctl status kubelet
  • 验证网络插件Pod是否正常运行
  • 查看节点详情:kubectl describe node

问题3:证书过期

  • 更新证书:kubeadm certs renew all
  • 重启控制平面组件

7. 生产环境优化建议

7.1 安全加固措施

  1. 启用RBAC并限制默认服务账户权限
  2. 配置网络策略限制Pod间通信
  3. 定期轮换证书(默认1年有效期)
  4. 启用审计日志并集中收集

7.2 性能调优参数

# kubelet配置(/var/lib/kubelet/config.yaml) apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration maxPods: 150 kubeAPIQPS: 50 kubeAPIBurst: 100

7.3 备份与恢复策略

etcd定期备份脚本:

ETCDCTL_API=3 etcdctl \ --endpoints=https://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

恢复步骤:

  1. 停止所有API Server
  2. 恢复etcd数据
  3. 重启控制平面组件

8. 长期维护指南

8.1 版本升级策略

  1. 先升级kubeadm工具
  2. 逐个排空并升级Master节点
  3. 最后升级Worker节点
  4. 验证各组件兼容性

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(Elasticsearch+Fluentd+Kibana)部署示例:

# 安装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

在实际生产环境中运行这套架构已有半年时间,最大的体会是前期规划比后期补救更重要。特别是网络规划和证书管理,如果初期设计不当,后期调整会非常痛苦。建议在部署前绘制详细的架构图,明确每个组件的交互关系,并建立完善的监控体系,这样才能真正发挥高可用集群的价值。