云原生环境下高可用Kubernetes集群二进制部署实战
1. 项目概述
在云原生技术快速发展的今天,Kubernetes(k8s)已成为容器编排领域的事实标准。相比使用kubeadm等工具快速搭建集群,二进制部署方式能让我们更深入理解k8s各组件的运行机制和交互关系。特别是在生产环境中,高可用架构和负载均衡配置更是保障业务连续性的关键。
这次我将分享在云服务器环境下,从零开始构建高可用k8s集群的完整过程。不同于常见的单master节点部署,我们会实现:
- 多master节点的高可用架构
- 使用keepalived+haproxy实现LB转发
- 基于云服务器特性的网络优化
- 生产级的安全加固措施
这种部署方式虽然复杂度较高,但能获得:
- 对集群组件的完全控制权
- 更灵活的资源调配能力
- 更深入的问题排查能力
- 符合企业级需求的稳定性
2. 环境规划与准备
2.1 服务器资源配置
建议的最低配置(生产环境应根据实际负载调整):
| 角色 | CPU | 内存 | 磁盘 | 数量 | 云服务器推荐规格 |
|---|---|---|---|---|---|
| Master节点 | 4核 | 8GB | 100GB | 3 | 阿里云ecs.c6.xlarge |
| Worker节点 | 8核 | 16GB | 200GB | ≥2 | 阿里云ecs.g6.2xlarge |
| LB节点 | 2核 | 4GB | 40GB | 2 | 阿里云ecs.c6.large |
注意:Master节点建议使用奇数台(3/5/7)以保证etcd集群的选举稳定性
2.2 网络规划关键点
CIDR规划原则:
- Pod网络:选择不与物理网络冲突的CIDR(如10.244.0.0/16)
- Service网络:建议使用10.96.0.0/12段
- 物理网络:确保云服务器VPC网段与上述不重叠
端口开放清单:
- 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 --now3. 高可用架构实现
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集群部署
- 下载并安装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/- 创建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.target4.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.local5. 集群初始化与验证
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=1006. 云服务器LB最佳实践
6.1 阿里云SLB对接方案
如果使用阿里云SLB替代自建haproxy,建议配置:
创建TCP监听:
- 前端端口:6443
- 后端端口:6443
- 调度算法:轮询
- 开启会话保持(可选)
健康检查配置:
- 检查路径:/healthz
- 正常状态码:200
- 检查间隔:5秒
- 超时时间:2秒
6.2 网络性能优化
- 调整内核参数:
# 增加连接跟踪表大小 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- CNI插件选择:
- Flannel:简单易用,适合中小集群
- Calico:支持网络策略,性能较好
- Cilium:基于eBPF,功能最强大
7. 常见问题排查
7.1 典型错误与解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| API Server无法连接etcd | 证书配置错误 | 检查etcd相关证书的CN和SAN |
| Node节点NotReady | 网络插件未安装 | 部署flannel或calico CNI |
| Pod无法解析DNS | CoreDNS异常 | 检查kube-dns服务Endpoint |
| 频繁出现TCP重传 | 云服务器带宽不足 | 升级实例规格或启用BGP带宽包 |
7.2 日志查看技巧
- 查看组件日志:
journalctl -u kube-apiserver -f journalctl -u etcd -f- 查看容器日志:
kubectl logs -n kube-system <pod-name> --tail=100- 使用kubectl describe分析资源状态:
kubectl describe node <node-name> kubectl describe pod <pod-name>8. 生产环境加固建议
RBAC权限控制:
- 为不同团队创建最小权限角色
- 禁用默认的cluster-admin绑定
Pod安全策略:
- 限制privileged容器
- 强制使用只读根文件系统
- 禁止hostNetwork
审计日志配置:
apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: "" resources: ["secrets", "configmaps"]- 定期备份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的运作机制。特别是在故障排查时,这种部署方式的优势就非常明显——你能清楚地知道每个组件的行为和它们之间的交互方式。建议在测试环境充分验证后再上生产,同时做好详细的部署文档记录。