基于Kubeadm的Kubernetes 1.18.6高可用集群部署与网络方案选型
1. Kubernetes高可用集群部署基础
搭建Kubernetes高可用集群是每个云原生工程师的必修课。我最早接触kubeadm是在2017年,那时Kubernetes的安装还比较原始,需要手动配置各种组件。现在kubeadm已经成熟很多,但依然有很多细节需要注意。
高可用集群的核心在于控制平面的冗余部署。传统的单master架构存在单点故障风险,一旦master节点宕机,整个集群就会失控。我在生产环境就遇到过因为硬件故障导致master节点宕机,整个集群瘫痪的惨痛经历。所以现在搭建集群,高可用是基本要求。
1.1 环境准备要点
在开始部署前,有三点必须确认:
-
节点规划:建议至少3个master节点实现真正的高可用。我曾经试过用2个master,结果网络分区时出现了脑裂问题。worker节点数量根据业务需求决定,但最少2个。
-
系统配置:CentOS 7.6/7.9是最稳定的选择。Ubuntu也可以,但要注意内核版本。有次我用Ubuntu 18.04遇到cgroup驱动不兼容的问题,排查了半天。
-
网络要求:
- 所有节点间网络互通
- 禁用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"
}
这个配置有两个重点:
- 使用systemd作为cgroup驱动,与kubelet保持一致
- 配置国内镜像加速,不然拉镜像会非常慢
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对比
| 特性 | Flannel | Calico |
|---|---|---|
| 网络模型 | Overlay | BGP路由 |
| 性能 | 较好 | 优秀 |
| 策略支持 | 无 | 强大的网络策略 |
| 适用场景 | 简单环境 | 生产环境 |
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 关键监控指标
- APIServer延迟:反映控制平面健康状态
- etcd写入延迟:超过50ms就需要警惕
- 节点内存压力:防止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
更多推荐
所有评论(0)