1. Kubernetes高可用集群部署基础

搭建Kubernetes高可用集群是每个云原生工程师的必修课。我最早接触kubeadm是在2017年,那时Kubernetes的安装还比较原始,需要手动配置各种组件。现在kubeadm已经成熟很多,但依然有很多细节需要注意。

高可用集群的核心在于控制平面的冗余部署。传统的单master架构存在单点故障风险,一旦master节点宕机,整个集群就会失控。我在生产环境就遇到过因为硬件故障导致master节点宕机,整个集群瘫痪的惨痛经历。所以现在搭建集群,高可用是基本要求。

1.1 环境准备要点

在开始部署前,有三点必须确认:

  1. 节点规划:建议至少3个master节点实现真正的高可用。我曾经试过用2个master,结果网络分区时出现了脑裂问题。worker节点数量根据业务需求决定,但最少2个。

  2. 系统配置:CentOS 7.6/7.9是最稳定的选择。Ubuntu也可以,但要注意内核版本。有次我用Ubuntu 18.04遇到cgroup驱动不兼容的问题,排查了半天。

  3. 网络要求

    • 所有节点间网络互通
    • 禁用Swap分区
    • 唯一的主机名、MAC和product_uuid

检查MAC和product_uuid的命令:

ip link
cat /sys/class/dmi/id/product_uuid

1.2 系统基础配置

这些配置在所有节点上都要执行:

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 清空iptables规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat

# 关闭SELinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭Swap
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

特别注意:如果服务器有Swap分区,一定要关闭。我有次部署完发现Pod频繁被OOM杀死,查了半天才发现是Swap没关干净。

2. 使用Kubeadm部署集群

2.1 容器运行时安装

Docker依然是目前最稳定的选择,但要注意版本兼容性。Kubernetes 1.18.x推荐Docker 19.03.x。

安装步骤:

# 卸载旧版本
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 设置阿里云镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装指定版本
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io

关键配置:

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "storage-driver": "overlay2"
}

这个配置有两个重点:

  1. 使用systemd作为cgroup驱动,与kubelet保持一致
  2. 配置国内镜像加速,不然拉镜像会非常慢

2.2 Kubeadm组件安装

配置阿里云镜像源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
EOF

安装指定版本:

yum install -y kubelet-1.18.6 kubeadm-1.18.6 kubectl-1.18.6
systemctl enable --now kubelet

3. 高可用控制平面部署

3.1 初始化第一个Master节点

kubeadm init \
  --kubernetes-version=v1.18.6 \
  --apiserver-advertise-address=192.168.203.212 \
  --control-plane-endpoint=192.168.203.250 \  # 负载均衡VIP
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.1.0.0/16 \
  --upload-certs

关键参数说明:

  • control-plane-endpoint: 所有master节点共享的负载均衡地址
  • upload-certs: 自动上传证书供其他master节点使用

3.2 加入其他Master节点

初始化成功后,会输出join命令:

kubeadm join 192.168.203.250:6443 \
  --token xxxx \
  --discovery-token-ca-cert-hash sha256:xxxx \
  --control-plane \
  --certificate-key xxxx

经验之谈:证书有效期默认2小时,如果过期了可以用kubeadm init phase upload-certs --upload-certs重新生成。

4. 网络插件选型与实践

4.1 Flannel vs Calico对比

特性FlannelCalico
网络模型OverlayBGP路由
性能较好优秀
策略支持强大的网络策略
适用场景简单环境生产环境

4.2 Flannel部署

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Flannel的优点是简单,但我在大规模集群(100+节点)遇到过性能问题,Pod间延迟明显升高。

4.3 Calico部署

curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O
sed -i 's/192.168.0.0\/16/10.244.0.0\/16/' calico.yaml
kubectl apply -f calico.yaml

Calico的BGP模式性能最好,但需要交换机支持BGP协议。如果不行,可以改用IPIP模式:

- name: CALICO_IPV4POOL_IPIP
  value: "Always"

5. 生产环境优化建议

5.1 启用IPVS模式

kubectl edit cm kube-proxy -n kube-system
# 修改mode: "ipvs"
kubectl delete pod -l k8s-app=kube-proxy -n kube-system

IPVS相比iptables有更好的性能和更低的延迟,特别是在服务数量多的时候。

5.2 关键监控指标

  1. APIServer延迟:反映控制平面健康状态
  2. etcd写入延迟:超过50ms就需要警惕
  3. 节点内存压力:防止OOM发生

可以用这个命令快速检查:

kubectl get --raw /metrics | grep -E 'apiserver_request_duration_seconds|etcd_disk_wal_fsync_duration_seconds'

5.3 日常维护命令

查看证书过期时间:

kubeadm certs check-expiration

更新证书:

kubeadm certs renew all

升级集群版本(比如到1.18.8):

yum install -y kubelet-1.18.8 kubeadm-1.18.8
kubeadm upgrade plan
kubeadm upgrade apply v1.18.8

更多推荐