从零到生产:手把手教你用kubeadm部署多Master节点K8S集群
·
企业级Kubernetes高可用集群实战:从零构建多Master架构
1. 高可用集群架构设计核心思路
在生产环境中,单Master节点的Kubernetes集群存在明显的单点故障风险。当Master节点宕机时,整个集群的控制平面将完全瘫痪。通过部署多Master节点配合负载均衡组件,可以实现控制平面的高可用性,确保API Server、Controller Manager和Scheduler等关键组件持续提供服务。
典型的高可用架构包含以下核心组件:
- 多Master节点:至少3个节点组成etcd集群,采用Raft协议保证数据一致性
- 负载均衡层:Keepalived + HAProxy组合实现VIP漂移和流量分发
- 网络插件:Calico/Flannel等CNI实现Pod间通信
- 证书管理:kubeadm自动生成的CA证书或自定义证书
# 典型生产环境节点规划示例
+-------------------+ +-------------------+
| Load Balancer 1 |-------| Load Balancer 2 |
| (Keepalived+HAProxy) | (Keepalived+HAProxy) |
+-------------------+ +-------------------+
| |
+------------+-------------+
|
+------------+-------------+
| | |
+-------------------+ +-------------------+ +-------------------+
| Master Node 1 | | Master Node 2 | | Master Node 3 |
| (etcd,API Server) | | (etcd,API Server) | | (etcd,API Server) |
+-------------------+ +-------------------+ +-------------------+
| | |
+---------------------------------------+
|
+---------------------------------------+
| | |
+-------------------+ +-------------------+ +-------------------+
| Worker Node 1 | | Worker Node 2 | | Worker Node 3 |
+-------------------+ +-------------------+ +-------------------+
2. 基础环境准备与系统优化
在开始部署前,所有节点需要完成统一的系统配置。以下操作需要在所有Master和Worker节点上执行:
内核参数调优:
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
vm.swappiness = 0
kernel.panic = 10
kernel.panic_on_oops = 1
EOF
sysctl --system
禁用Swap并优化cgroup驱动:
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# 配置docker使用systemd cgroup
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
时间同步与主机名解析:
# 配置NTP时间同步
timedatectl set-timezone Asia/Shanghai
yum install -y chrony
systemctl enable --now chronyd
# 设置主机名解析(所有节点)
cat >> /etc/hosts <<EOF
192.168.1.10 k8s-master1
192.168.1.11 k8s-master2
192.168.1.12 k8s-master3
192.168.1.100 k8s-vip
EOF
3. 负载均衡层部署与配置
Keepalived和HAProxy的组合为Kubernetes API Server提供了高可用的访问入口。建议至少部署两个负载均衡节点以避免单点故障。
Keepalived配置(主节点示例):
yum install -y keepalived
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 50
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 42f8d4e7
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_haproxy
}
}
EOF
systemctl enable --now keepalived
HAProxy配置(所有LB节点):
yum install -y haproxy
cat > /etc/haproxy/haproxy.cfg <<'EOF'
global
log /dev/log local0
maxconn 20000
stats socket /var/lib/haproxy/stats
defaults
mode tcp
timeout connect 5s
timeout client 50s
timeout server 50s
frontend k8s-api
bind *:6443
default_backend k8s-masters
backend k8s-masters
balance roundrobin
option tcp-check
server k8s-master1 192.168.1.10:6443 check inter 3s fall 3 rise 2
server k8s-master2 192.168.1.11:6443 check inter 3s fall 3 rise 2
server k8s-master3 192.168.1.12:6443 check inter 3s fall 3 rise 2
listen stats
bind *:8404
mode http
stats enable
stats uri /admin?stats
stats auth admin:SecurePass123
EOF
systemctl enable --now haproxy
关键提示:生产环境中建议将HAProxy的监控端口(8404)通过防火墙限制访问,仅允许管理网络访问
4. Kubernetes控制平面初始化
首个Master节点初始化:
kubeadm init \
--control-plane-endpoint "k8s-vip:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository registry.aliyuncs.com/google_containers
初始化成功后,按照提示配置kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
添加其他控制平面节点: 使用初始化时输出的join命令,例如:
kubeadm join k8s-vip:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxx \
--control-plane \
--certificate-key yyyyyyyy
网络插件安装(Calico示例):
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
验证集群状态:
kubectl get nodes -o wide
kubectl get pods -n kube-system
5. 生产环境关键配置与优化
证书自动续期配置:
# 修改kube-controller-manager配置
kubectl edit cm kube-controller-manager -n kube-system
# 添加以下参数:
--experimental-cluster-signing-duration=87600h0m0s
--feature-gates=RotateKubeletServerCertificate=true
API Server高可用参数调优:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
apiServer:
extraArgs:
audit-log-maxbackup: "10"
audit-log-maxsize: "100"
event-ttl: "720h"
profiling: "false"
extraVolumes:
- name: audit-log
hostPath: /var/log/kubernetes/audit
mountPath: /var/log/kubernetes/audit
readOnly: false
pathType: DirectoryOrCreate
节点维护与隔离操作:
# 安全排空节点
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 标记节点不可调度
kubectl cordon <node-name>
# 恢复节点
kubectl uncordon <node-name>
6. 常见故障排查指南
证书问题排查:
# 检查证书有效期
openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
# 手动更新证书
kubeadm certs renew all
网络连通性测试:
# 创建测试Pod
kubectl run net-test --image=nicolaka/netshoot -- sleep 3600
# 进入Pod测试
kubectl exec -it net-test -- bash
ping k8s-vip
curl -k https://k8s-vip:6443
nslookup kubernetes.default.svc.cluster.local
组件日志查看:
# 查看kubelet日志
journalctl -u kubelet -f
# 查看容器运行时日志
journalctl -u containerd -f
# 查看特定Pod日志
kubectl logs -n kube-system <pod-name> --tail=100
7. 集群扩展与升级策略
添加Worker节点:
# 使用初始化时生成的token
kubeadm token list
# 若无有效token则创建新token
kubeadm token create --print-join-command
# Worker节点加入命令示例
kubeadm join k8s-vip:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxx
版本升级方案:
# 1. 升级kubeadm
yum install -y kubeadm-1.28.0 --disableexcludes=kubernetes
# 2. 升级控制平面
kubeadm upgrade plan
kubeadm upgrade apply v1.28.0
# 3. 升级kubelet和kubectl
yum install -y kubelet-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes
systemctl restart kubelet
集群备份与恢复:
# 备份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 /tmp/etcd-snapshot.db
# 恢复etcd
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-snapshot.db \
--data-dir /var/lib/etcd-backup
更多推荐
所有评论(0)