1. 项目概述

在当今云原生技术蓬勃发展的背景下,Kubernetes已成为容器编排领域的事实标准。而Rocky Linux作为RHEL的替代品,凭借其稳定性和兼容性,正逐渐成为企业级部署的首选操作系统。本文将详细记录在Rocky Linux系统上部署多Master高可用Kubernetes集群的全过程,涵盖从环境准备到最终验证的每个关键环节。

2. 环境准备与系统配置

2.1 硬件与网络规划

对于生产环境的高可用Kubernetes集群,建议至少配置3个Master节点和若干Worker节点。每个Master节点应满足:

  • 4核CPU或以上
  • 8GB内存或以上
  • 40GB磁盘空间
  • 千兆网络连接

网络规划需要考虑:

  1. 节点间通信网络(建议10Gbps)
  2. Pod网络CIDR(如10.244.0.0/16)
  3. Service网络CIDR(如10.96.0.0/12)

2.2 Rocky Linux基础配置

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

# 设置主机名
hostnamectl set-hostname master1

# 配置静态IP
nmcli con mod "ens192" ipv4.addresses "192.168.1.101/24"
nmcli con mod "ens192" ipv4.gateway "192.168.1.1"
nmcli con mod "ens192" ipv4.dns "8.8.8.8"
nmcli con mod "ens192" ipv4.method manual
nmcli con up "ens192"

# 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 配置时间同步
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd

3. 容器运行时与Kubernetes组件安装

3.1 安装Docker容器运行时

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker
yum install -y docker-ce docker-ce-cli containerd.io

# 配置Docker
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 启动Docker
systemctl enable docker
systemctl start docker

3.2 安装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
EOF

# 安装kubeadm, kubelet和kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 设置kubelet开机启动
systemctl enable kubelet

4. 高可用集群部署

4.1 初始化第一个Master节点

kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12

初始化完成后,按照输出提示配置kubectl:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.2 加入其他Master节点

在其他Master节点上执行以下命令加入集群:

kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <key>

4.3 部署网络插件

这里选择Calico作为网络插件:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

5. 高可用配置与验证

5.1 配置负载均衡器

在生产环境中,建议使用专业的负载均衡器(如HAProxy或Nginx)来分发Master节点的API Server流量。以下是HAProxy的示例配置:

frontend kubernetes
    bind *:6443
    option tcplog
    mode tcp
    default_backend kubernetes-master-nodes

backend kubernetes-master-nodes
    mode tcp
    balance roundrobin
    option tcp-check
    server master1 192.168.1.101:6443 check fall 3 rise 2
    server master2 192.168.1.102:6443 check fall 3 rise 2
    server master3 192.168.1.103:6443 check fall 3 rise 2

5.2 验证集群状态

# 查看节点状态
kubectl get nodes

# 查看组件状态
kubectl get componentstatuses

# 查看Pod状态
kubectl get pods --all-namespaces

6. 生产环境优化与维护

6.1 证书管理

Kubernetes集群默认证书有效期为1年,建议定期检查并更新:

# 检查证书有效期
kubeadm certs check-expiration

# 更新证书
kubeadm certs renew all

6.2 备份与恢复

定期备份etcd数据至关重要:

# 备份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 /opt/etcd-backup.db

# 恢复etcd
ETCDCTL_API=3 etcdctl snapshot restore /opt/etcd-backup.db \
--data-dir /var/lib/etcd-backup

7. 常见问题排查

7.1 节点NotReady状态

可能原因及解决方案:

  1. 网络插件未正确安装 - 重新部署网络插件
  2. kubelet服务未运行 - systemctl restart kubelet
  3. 容器运行时问题 - 检查Docker/containerd日志

7.2 API Server不可用

检查步骤:

  1. 验证负载均衡器是否健康
  2. 检查Master节点kube-apiserver Pod状态
  3. 查看kube-apiserver日志: journalctl -u kubelet -n 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 \
endpoint health

8. 性能优化建议

  1. 调整kubelet参数:

    --max-pods=100
    --kube-api-qps=50
    --kube-api-burst=100
    
  2. 优化etcd性能:

    • 使用SSD存储
    • 分离etcd数据目录和wal目录
    • 定期压缩历史数据
  3. 配置合理的资源请求和限制:

    resources:
      requests:
        cpu: "500m"
        memory: "512Mi"
      limits:
        cpu: "1000m"
        memory: "1Gi"
    

在实际部署过程中,我发现Rocky Linux作为Kubernetes的宿主操作系统表现非常稳定,特别是在长时间运行的场景下。对于生产环境,建议在部署前充分测试网络性能和存储IO,这往往是集群性能的瓶颈所在。另外,定期维护和监控是保证集群长期稳定运行的关键。

更多推荐