Kubernetes集群的高可用性设计与实践
·
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集群的高可用性设计是一个系统性工程,需要从多个维度进行考虑:
- 多Master部署:确保控制平面的高可用性
- etcd集群:保证数据存储的一致性和可靠性
- 负载均衡:分发请求,避免单点故障
- 健康检查:及时发现和处理故障
- 自动故障转移:减少人工干预,提高系统可靠性
- 性能调优:根据实际负载调整配置
通过以上措施,可以构建一个稳定、可靠的Kubernetes集群,为云原生应用提供坚实的运行基础。
💡 小贴士:在生产环境中,建议使用至少3个Master节点和3个etcd节点,以确保最佳的高可用性。同时,定期备份etcd数据,以防万一发生灾难性故障。
更多推荐
所有评论(0)