云原生环境下高可用Kubernetes集群二进制部署实战

发布时间:2026/10/29 17:49:31
云原生环境下高可用Kubernetes集群二进制部署实战

1. 项目概述

在云原生技术快速发展的今天,Kubernetes(k8s)已成为容器编排领域的事实标准。相比使用kubeadm等工具快速搭建集群,二进制部署方式能让我们更深入理解k8s各组件的运行机制和交互关系。特别是在生产环境中,高可用架构和负载均衡配置更是保障业务连续性的关键。

这次我将分享在云服务器环境下,从零开始构建高可用k8s集群的完整过程。不同于常见的单master节点部署,我们会实现:

  • 多master节点的高可用架构
  • 使用keepalived+haproxy实现LB转发
  • 基于云服务器特性的网络优化
  • 生产级的安全加固措施

这种部署方式虽然复杂度较高,但能获得:

  • 对集群组件的完全控制权
  • 更灵活的资源调配能力
  • 更深入的问题排查能力
  • 符合企业级需求的稳定性

2. 环境规划与准备

2.1 服务器资源配置

建议的最低配置(生产环境应根据实际负载调整):

角色CPU内存磁盘数量云服务器推荐规格
Master节点4核8GB100GB3阿里云ecs.c6.xlarge
Worker节点8核16GB200GB≥2阿里云ecs.g6.2xlarge
LB节点2核4GB40GB2阿里云ecs.c6.large

注意:Master节点建议使用奇数台(3/5/7)以保证etcd集群的选举稳定性

2.2 网络规划关键点

  1. CIDR规划原则:

    • Pod网络:选择不与物理网络冲突的CIDR(如10.244.0.0/16)
    • Service网络:建议使用10.96.0.0/12段
    • 物理网络:确保云服务器VPC网段与上述不重叠
  2. 端口开放清单:

    • Master节点需开放:6443(API Server)、2379-2380(etcd)、10250(kubelet)
    • Worker节点需开放:10250、30000-32767(NodePort范围)
    • LB节点需开放:8443(VIP转发端口)

2.3 系统初始化配置

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

# 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 关闭SELinux setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 配置内核参数 cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system # 设置时间同步 yum install -y chrony systemctl enable chronyd --now

3. 高可用架构实现

3.1 Keepalived配置详解

在LB节点上安装配置keepalived实现VIP漂移:

# 安装keepalived yum install -y keepalived # 主节点配置(/etc/keepalived/keepalived.conf) global_defs { router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight -5 fall 3 rise 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 101 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100/24 } track_script { chk_haproxy } }

踩坑提醒:virtual_router_id必须在同一网段内唯一,否则会导致VRRP协议异常

3.2 HAProxy负载均衡配置

haproxy负责将API Server请求分发到各master节点:

# /etc/haproxy/haproxy.cfg global log /dev/log local0 maxconn 4000 daemon defaults mode tcp timeout connect 10s timeout client 1m timeout server 1m frontend k8s-api bind *:8443 default_backend k8s-api backend k8s-api balance roundrobin server master1 192.168.1.101:6443 check server master2 192.168.1.102:6443 check server master3 192.168.1.103:6443 check listen stats bind *:1080 mode http stats enable stats uri / stats auth admin:password

关键参数说明:

  • balance算法选择roundrobin实现简单轮询
  • 6443是k8s API Server默认端口
  • 1080端口提供haproxy监控界面

4. 二进制组件部署

4.1 Etcd集群部署

  1. 下载并安装etcd二进制文件:
ETCD_VER=v3.4.13 wget https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz tar -xvf etcd-${ETCD_VER}-linux-amd64.tar.gz mv etcd-${ETCD_VER}-linux-amd64/etcd* /usr/local/bin/
  1. 创建systemd服务文件(以master1为例):
# /etc/systemd/system/etcd.service [Unit] Description=etcd Documentation=https://github.com/coreos/etcd [Service] ExecStart=/usr/local/bin/etcd \ --name=master1 \ --data-dir=/var/lib/etcd \ --initial-advertise-peer-urls=https://192.168.1.101:2380 \ --listen-peer-urls=https://192.168.1.101:2380 \ --listen-client-urls=https://192.168.1.101:2379,https://127.0.0.1:2379 \ --advertise-client-urls=https://192.168.1.101:2379 \ --initial-cluster-token=etcd-cluster \ --initial-cluster=master1=https://192.168.1.101:2380,master2=https://192.168.1.102:2380,master3=https://192.168.1.103:2380 \ --initial-cluster-state=new \ --client-cert-auth=true \ --trusted-ca-file=/etc/kubernetes/pki/ca.crt \ --cert-file=/etc/kubernetes/pki/etcd/server.crt \ --key-file=/etc/kubernetes/pki/etcd/server.key \ --peer-client-cert-auth=true \ --peer-trusted-ca-file=/etc/kubernetes/pki/ca.crt \ --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt \ --peer-key-file=/etc/kubernetes/pki/etcd/peer.key Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target

4.2 API Server配置要点

API Server作为集群核心组件,需要特别注意以下参数:

--etcd-servers=https://192.168.1.101:2379,https://192.168.1.102:2379,https://192.168.1.103:2379 \ --bind-address=0.0.0.0 \ --secure-port=6443 \ --advertise-address=192.168.1.101 \ --allow-privileged=true \ --service-cluster-ip-range=10.96.0.0/12 \ --enable-admission-plugins=NodeRestriction \ --authorization-mode=Node,RBAC \ --enable-bootstrap-token-auth=true \ --tls-cert-file=/etc/kubernetes/pki/apiserver.crt \ --tls-private-key-file=/etc/kubernetes/pki/apiserver.key \ --client-ca-file=/etc/kubernetes/pki/ca.crt \ --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt \ --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key \ --service-account-key-file=/etc/kubernetes/pki/sa.pub \ --service-account-signing-key-file=/etc/kubernetes/pki/sa.key \ --service-account-issuer=https://kubernetes.default.svc.cluster.local \ --api-audiences=https://kubernetes.default.svc.cluster.local

5. 集群初始化与验证

5.1 使用kubeadm生成配置

虽然我们采用二进制部署,但可以利用kubeadm生成基础证书:

kubeadm init phase certs all --config=kubeadm-config.yaml kubeadm init phase kubeconfig all --config=kubeadm-config.yaml

示例kubeadm-config.yaml:

apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.24.0 controlPlaneEndpoint: "192.168.1.100:8443" apiServer: certSANs: - "192.168.1.100" - "192.168.1.101" - "192.168.1.102" - "192.168.1.103" networking: podSubnet: "10.244.0.0/16" serviceSubnet: "10.96.0.0/12"

5.2 集群健康检查

部署完成后执行以下验证:

# 检查节点状态 kubectl get nodes -o wide # 检查组件健康状态 kubectl get cs # 检查pod运行状态 kubectl get pods --all-namespaces # 测试DNS解析 kubectl run -it --rm --restart=Never busybox --image=busybox -- nslookup kubernetes.default # 压力测试(创建100个nginx pod) kubectl run nginx --image=nginx --replicas=100

6. 云服务器LB最佳实践

6.1 阿里云SLB对接方案

如果使用阿里云SLB替代自建haproxy,建议配置:

  1. 创建TCP监听:

    • 前端端口:6443
    • 后端端口:6443
    • 调度算法:轮询
    • 开启会话保持(可选)
  2. 健康检查配置:

    • 检查路径:/healthz
    • 正常状态码:200
    • 检查间隔:5秒
    • 超时时间:2秒

6.2 网络性能优化

  1. 调整内核参数:
# 增加连接跟踪表大小 echo 2097152 > /proc/sys/net/nf_conntrack_max # 优化TCP协议栈 cat >> /etc/sysctl.conf <<EOF net.core.somaxconn = 32768 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_tw_reuse = 1 EOF
  1. CNI插件选择:
    • Flannel:简单易用,适合中小集群
    • Calico:支持网络策略,性能较好
    • Cilium:基于eBPF,功能最强大

7. 常见问题排查

7.1 典型错误与解决方案

错误现象可能原因解决方案
API Server无法连接etcd证书配置错误检查etcd相关证书的CN和SAN
Node节点NotReady网络插件未安装部署flannel或calico CNI
Pod无法解析DNSCoreDNS异常检查kube-dns服务Endpoint
频繁出现TCP重传云服务器带宽不足升级实例规格或启用BGP带宽包

7.2 日志查看技巧

  1. 查看组件日志:
journalctl -u kube-apiserver -f journalctl -u etcd -f
  1. 查看容器日志:
kubectl logs -n kube-system <pod-name> --tail=100
  1. 使用kubectl describe分析资源状态:
kubectl describe node <node-name> kubectl describe pod <pod-name>

8. 生产环境加固建议

  1. RBAC权限控制:

    • 为不同团队创建最小权限角色
    • 禁用默认的cluster-admin绑定
  2. Pod安全策略:

    • 限制privileged容器
    • 强制使用只读根文件系统
    • 禁止hostNetwork
  3. 审计日志配置:

apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: "" resources: ["secrets", "configmaps"]
  1. 定期备份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 /backup/etcd-snapshot-$(date +%Y%m%d).db

在实际部署过程中,我发现二进制部署虽然初期工作量较大,但能让我们更深入理解k8s的运作机制。特别是在故障排查时,这种部署方式的优势就非常明显——你能清楚地知道每个组件的行为和它们之间的交互方式。建议在测试环境充分验证后再上生产,同时做好详细的部署文档记录。