Kubernetes集群的高可用性设计与实践

🔥 核心概念

Kubernetes集群的高可用性(HA)是确保生产环境稳定运行的关键。一个高可用的Kubernetes集群需要考虑以下几个维度:

  • 控制平面高可用:多Master节点部署
  • etcd集群高可用:分布式数据存储
  • 工作节点高可用:多节点部署
  • 服务高可用:Pod副本、服务发现、负载均衡

🚀 多Master部署方案

1. 架构设计

+---------------------+
|   负载均衡器(HAProxy/NGINX)  |
+---------------------+
          |
          v
+---------+---------+
| Master 1 | Master 2 | Master 3 |
+---------+---------+
          |
          v
+---------------------+
|     etcd集群(3节点)     |
+---------------------+
          |
          v
+---------+---------+
| Worker 1 | Worker 2 | Worker 3 |
+---------+---------+

2. 部署步骤

2.1 安装负载均衡器
# 安装HAProxy
sudo apt-get update
sudo apt-get install -y haproxy

# 配置HAProxy
cat > /etc/haproxy/haproxy.cfg << EOF
frontend kubernetes
    bind *:6443
    mode tcp
    option tcplog
    default_backend kubernetes-master-nodes

backend kubernetes-master-nodes
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    server master1 192.168.1.10:6443 check
    server master2 192.168.1.11:6443 check
    server master3 192.168.1.12:6443 check
EOF

# 重启HAProxy
sudo systemctl restart haproxy
sudo systemctl enable haproxy
2.2 初始化第一个Master节点
# 初始化集群
kubeadm init \
  --control-plane-endpoint "192.168.1.200:6443" \
  --upload-certs \
  --pod-network-cidr=10.244.0.0/16

# 设置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.3 加入其他Master节点
# 生成加入命令
kubeadm token create --print-join-command

# 在其他Master节点上执行
kubeadm join 192.168.1.200:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <certificate-key>
2.4 加入Worker节点
# 在Worker节点上执行
kubeadm join 192.168.1.200:6443 --token <token> --discovery-token-ca-cert-hash <hash>

📊 etcd集群配置

1. 外部etcd集群

# 安装etcd
download_url=https://github.com/etcd-io/etcd/releases/download/v3.5.6/etcd-v3.5.6-linux-amd64.tar.gz
curl -L $download_url -o etcd.tar.gz
tar xzf etcd.tar.gz
cd etcd-v3.5.6-linux-amd64

sudo cp etcd etcdctl /usr/local/bin/

# 配置etcd systemd服务
cat > /etc/systemd/system/etcd.service << EOF
[Unit]
Description=etcd
Documentation=https://github.com/etcd-io/etcd

[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
  --name etcd1 \
  --initial-advertise-peer-urls https://192.168.1.10:2380 \
  --listen-peer-urls https://192.168.1.10:2380 \
  --listen-client-urls https://192.168.1.10:2379,https://127.0.0.1:2379 \
  --advertise-client-urls https://192.168.1.10:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster etcd1=https://192.168.1.10:2380,etcd2=https://192.168.1.11:2380,etcd3=https://192.168.1.12:2380 \
  --initial-cluster-state new \
  --cert-file=/etc/kubernetes/pki/etcd/server.crt \
  --key-file=/etc/kubernetes/pki/etcd/server.key \
  --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt \
  --peer-key-file=/etc/kubernetes/pki/etcd/peer.key \
  --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt \
  --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

[Install]
WantedBy=multi-user.target
EOF

# 启动etcd
sudo systemctl daemon-reload
sudo systemctl start etcd
sudo systemctl enable etcd

2. 验证etcd集群

# 检查etcd集群状态
etcdctl --endpoints=https://192.168.1.10:2379,https://192.168.1.11:2379,https://192.168.1.12:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint health

# 查看etcd成员
etcdctl --endpoints=https://192.168.1.10:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  member list

🔧 高可用最佳实践

1. 节点健康检查

apiVersion: v1
kind: Pod
metadata:
  name: node-health-check
  namespace: kube-system
spec:
  containers:
  - name: health-check
    image: busybox
    command: ["/bin/sh", "-c", "while true; do echo $(date) node is healthy; sleep 60; done"]

2. 控制平面组件健康检查

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-apiserver
  namespace: monitoring
spec:
  selector:
    matchLabels:
      k8s-app: kube-apiserver
  endpoints:
  - port: https
    scheme: https
    tlsConfig:
      insecureSkipVerify: true
    interval: 15s

3. 自动故障转移

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: kube-apiserver-pdb
  namespace: kube-system
spec:
  minAvailable: 2
  selector:
    matchLabels:
      component: kube-apiserver

🚨 故障处理

1. Master节点故障

# 1. 检查故障节点状态
kubectl get nodes

# 2. 从etcd中移除故障节点
etcdctl --endpoints=https://192.168.1.10:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  member remove <故障节点ID>

# 3. 重新加入节点
kubeadm join 192.168.1.200:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <certificate-key>

2. etcd集群故障

# 1. 检查etcd集群状态
etcdctl --endpoints=https://192.168.1.10:2379,https://192.168.1.11:2379,https://192.168.1.12:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint status

# 2. 重建故障的etcd节点
etcdctl --endpoints=https://192.168.1.10:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  member add etcd4 --peer-urls=https://192.168.1.13:2380

📈 性能优化

1. 控制平面调优

# kube-apiserver调优
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.26.0
apiServer:
  extraArgs:
    timeout-for-graceful-termination: "120"
    min-request-timeout: "300"
    max-requests-inflight: "400"
    max-mutating-requests-inflight: "200"

2. etcd调优

# etcd性能调优
cat > /etc/systemd/system/etcd.service << EOF
[Service]
ExecStart=/usr/local/bin/etcd \
  # 其他参数... \
  --quota-backend-bytes=8589934592 \
  --auto-compaction-retention=2h \
  --snapshot-count=10000
EOF

总结

Kubernetes集群的高可用性设计是一个系统性工程,需要从多个维度进行考虑:

  1. 多Master部署:确保控制平面的高可用性
  2. etcd集群:保证数据存储的一致性和可靠性
  3. 负载均衡:分发请求,避免单点故障
  4. 健康检查:及时发现和处理故障
  5. 自动故障转移:减少人工干预,提高系统可靠性
  6. 性能调优:根据实际负载调整配置

通过以上措施,可以构建一个稳定、可靠的Kubernetes集群,为云原生应用提供坚实的运行基础。


💡 小贴士:在生产环境中,建议使用至少3个Master节点和3个etcd节点,以确保最佳的高可用性。同时,定期备份etcd数据,以防万一发生灾难性故障。

更多推荐