插件窝 干货文章 详解 K8S 高可用部署,超详细!

详解 K8S 高可用部署,超详细!

etcd 节点 集群 Kubernetes 789    来源:    2025-04-13

Kubernetes 高可用部署详解

一、高可用架构概述

Kubernetes 高可用(HA)部署主要解决控制平面的单点故障问题,确保集群在部分组件或节点故障时仍能正常工作。典型的高可用架构包括:

  1. 多Master节点:至少3个Master节点组成控制平面
  2. 负载均衡:前置负载均衡器分发API Server请求
  3. etcd集群:奇数个节点(3、5、7)组成分布式键值存储
  4. 工作节点冗余:多个Worker节点确保应用可用性

二、核心组件高可用实现

1. etcd集群

etcd是Kubernetes的"大脑",存储所有集群数据,必须实现高可用:

# 在三节点上安装etcd
# 节点1配置示例
ETCD_NAME=etcd1
ETCD_INITIAL_CLUSTER="etcd1=https://10.0.0.1:2380,etcd2=https://10.0.0.2:2380,etcd3=https://10.0.0.3:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.0.0.1:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://10.0.0.1:2379"
ETCD_LISTEN_PEER_URLS="https://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"
ETCD_DATA_DIR="/var/lib/etcd"

关键配置项: - initial-cluster:指定集群所有成员 - initial-cluster-token:集群唯一标识符 - initial-cluster-state:新集群设为new,加入现有集群设为existing

2. API Server负载均衡

使用Nginx、HAProxy或云服务商的LB实现:

# Nginx配置示例
stream {
    upstream kube_apiserver {
        server 10.0.0.1:6443;
        server 10.0.0.2:6443;
        server 10.0.0.3:6443;
    }

    server {
        listen 6443;
        proxy_pass kube_apiserver;
    }
}

3. Controller Manager和Scheduler选举

通过--leader-elect参数启用领导者选举机制:

# /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
  containers:
  - command:
    - kube-controller-manager
    - --leader-elect=true
    - --controllers=*,bootstrapsigner,tokencleaner

三、部署方案

方案1:使用kubeadm部署高可用集群

  1. 准备环境

    • 3台Master节点,2+ Worker节点
    • 负载均衡器(可以是独立节点或云LB)
    • 所有节点时间同步(NTP)
    • 禁用交换分区
  2. 初始化第一个Master节点

kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16
  1. 加入其他Master节点
kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <key>
  1. 加入Worker节点
kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>

方案2:使用二进制方式部署

  1. etcd集群部署

    • 在每个节点安装etcd二进制文件
    • 配置systemd服务文件
    • 验证集群健康状态:etcdctl --endpoints=https://10.0.0.1:2379 --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem endpoint health
  2. 部署API Server

    • 生成证书和kubeconfig文件
    • 配置systemd服务
[Unit]
Description=Kubernetes API Server
After=etcd.service

[Service]
ExecStart=/usr/local/bin/kube-apiserver \
  --advertise-address=10.0.0.1 \
  --allow-privileged=true \
  --apiserver-count=3 \
  --audit-log-maxage=30 \
  --audit-log-maxbackup=3 \
  --audit-log-maxsize=100 \
  --audit-log-path=/var/log/audit.log \
  --authorization-mode=Node,RBAC \
  --client-ca-file=/etc/kubernetes/pki/ca.crt \
  --enable-admission-plugins=NodeRestriction \
  --enable-bootstrap-token-auth=true \
  --etcd-cafile=/etc/etcd/ssl/ca.pem \
  --etcd-certfile=/etc/etcd/ssl/etcd.pem \
  --etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \
  --etcd-servers=https://10.0.0.1:2379,https://10.0.0.2:2379,https://10.0.0.3:2379 \
  --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt \
  --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key \
  --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt \
  --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key \
  --requestheader-allowed-names=front-proxy-client \
  --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt \
  --requestheader-extra-headers-prefix=X-Remote-Extra- \
  --requestheader-group-headers=X-Remote-Group \
  --requestheader-username-headers=X-Remote-User \
  --secure-port=6443 \
  --service-account-key-file=/etc/kubernetes/pki/sa.pub \
  --service-cluster-ip-range=10.96.0.0/12 \
  --tls-cert-file=/etc/kubernetes/pki/apiserver.crt \
  --tls-key-file=/etc/kubernetes/pki/apiserver.key
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  1. 部署Controller Manager和Scheduler
    • 类似配置systemd服务,启用--leader-elect=true

四、网络插件选择

高可用集群需要可靠的网络插件,常见选择: - Calico - Flannel - Weave Net - Cilium

以Calico为例:

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

五、验证高可用性

  1. 检查节点状态

    kubectl get nodes -o wide
    
  2. 检查组件状态

    kubectl get cs
    
  3. 模拟故障测试

    • 关闭一个Master节点,验证API是否仍可访问
    • 关闭etcd节点,验证数据一致性
    • 使用kubectl drain模拟节点维护
  4. 检查etcd集群健康

    ETCDCTL_API=3 etcdctl --endpoints=https://10.0.0.1:2379 \
    --cacert=/etc/etcd/ssl/ca.pem \
    --cert=/etc/etcd/ssl/etcd.pem \
    --key=/etc/etcd/ssl/etcd-key.pem \
    endpoint health
    

六、维护与升级

  1. 证书管理

    • 定期轮换证书
    • 使用kubeadm alpha certs check-expiration检查证书过期时间
  2. etcd备份与恢复

    # 备份
    ETCDCTL_API=3 etcdctl --endpoints=https://10.0.0.1:2379 \
    --cacert=/etc/etcd/ssl/ca.pem \
    --cert=/etc/etcd/ssl/etcd.pem \
    --key=/etc/etcd/ssl/etcd-key.pem \
    snapshot save /backup/etcd-snapshot.db
    
    # 恢复
    etcdctl snapshot restore /backup/etcd-snapshot.db \
    --data-dir /var/lib/etcd-from-backup
    
  3. Kubernetes版本升级

    # 使用kubeadm升级
    kubeadm upgrade plan
    kubeadm upgrade apply v1.xx.yy
    

七、最佳实践

  1. 节点规划

    • Master节点专用,不运行工作负载
    • 跨可用区部署提高容灾能力
    • 合理配置资源请求和限制
  2. 监控与告警

    • 部署Prometheus + Grafana监控集群状态
    • 设置关键指标告警(API Server延迟、etcd写入延迟等)
  3. 安全加固

    • 启用RBAC
    • 使用网络策略限制Pod间通信
    • 定期审计集群活动
  4. 文档与演练

    • 记录详细的恢复流程
    • 定期进行故障演练

八、常见问题解决

  1. 脑裂问题

    • 确保网络分区时quorum机制正常工作
    • 配置适当的etcd心跳和选举超时
  2. 证书过期

    • 定期检查证书有效期
    • 准备证书更新方案
  3. 性能瓶颈

    • 监控etcd存储大小(建议不超过8GB)
    • 考虑分离etcd集群与Kubernetes控制平面

通过以上详细配置和最佳实践,您可以构建一个稳定可靠的Kubernetes高可用集群,满足生产环境的需求。