云服务器上3节点K8s集群实战:用kubeadm搞定Master/Worker节点配置与Flannel网络

在云计算时代,Kubernetes(K8s)已成为容器编排的事实标准。对于需要在生产环境中部署容器化应用的DevOps团队来说,掌握多节点K8s集群的搭建是必备技能。本文将基于腾讯云/华为云等主流云平台,详细解析如何通过kubeadm工具快速构建一个3节点的生产级K8s集群,涵盖从环境准备到网络配置的全流程实战操作。

1. 环境准备与系统配置

在开始部署K8s集群前,我们需要确保所有节点满足基本要求并完成必要的系统配置。对于云服务器环境,建议选择同一地域的相同配置实例以确保最佳的网络性能。以下是三台服务器的典型配置:

  • Master节点:2核CPU/4GB内存/50GB SSD(控制平面组件)
  • Worker节点×2:2核CPU/4GB内存/50GB SSD(运行工作负载)

1.1 系统基础配置

在所有节点上执行以下操作:

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

# 禁用SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

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

# 设置时间同步
yum install -y chrony || apt-get install -y chrony
systemctl enable --now chronyd

1.2 内核参数优化

K8s对Linux内核参数有特定要求,需配置以下参数:

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

1.3 容器运行时安装

K8s 1.24+版本默认使用containerd作为容器运行时:

# 安装containerd
yum install -y containerd.io || apt-get install -y containerd

# 配置systemd cgroup驱动
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 重启服务
systemctl restart containerd && systemctl enable containerd

2. K8s组件安装与Master节点初始化

2.1 安装kubeadm/kubelet/kubectl

在所有节点上添加K8s仓库并安装必要组件:

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

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

2.2 Master节点初始化

在Master节点执行初始化命令,关键参数说明:

  • --apiserver-advertise-address:Master节点内网IP
  • --pod-network-cidr:Pod网络CIDR(需与后续网络插件匹配)
  • --image-repository:使用国内镜像源加速
kubeadm init \
  --apiserver-advertise-address=192.168.0.100 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --upload-certs

初始化成功后,会输出Worker节点加入集群的命令,类似:

kubeadm join 192.168.0.100:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxx

2.3 配置kubectl

在Master节点配置kubectl访问权限:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

验证集群状态:

kubectl get nodes
# 应显示Master节点状态为NotReady(尚未安装网络插件)

3. Worker节点加入与网络配置

3.1 Worker节点加入集群

在每个Worker节点执行Master初始化时输出的join命令:

kubeadm join 192.168.0.100:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxx

加入成功后,在Master节点验证:

kubectl get nodes
# 应显示3个节点(1个Master+2个Worker)

3.2 安装Flannel网络插件

Flannel是K8s常用的Overlay网络方案,配置简单且性能稳定:

# 下载Flannel YAML配置
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 修改网络配置与初始化时的pod-network-cidr一致
sed -i 's|"Network": "10.244.0.0/16"|"Network": "10.244.0.0/16"|' kube-flannel.yml

# 部署Flannel
kubectl apply -f kube-flannel.yml

等待所有Pod变为Running状态:

watch kubectl get pods -n kube-system
# 应看到flannel和coredns等组件正常运行

4. 云平台特殊配置与生产优化

4.1 云服务器安全组配置

在云平台控制台需确保以下端口开放:

方向 协议 端口范围 用途
入站 TCP 6443 K8s API Server
入站 TCP 2379-2380 etcd server
入站 TCP 10250 Kubelet API
入站 UDP 8472 Flannel VXLAN

4.2 高可用配置建议

对于生产环境,建议对Master节点进行高可用配置:

# 在其他控制平面节点执行(需先安装kubeadm)
kubeadm join 192.168.0.100:6443 \
    --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxx \
    --control-plane \
    --certificate-key xxxxxxxxxxxxxxxxxxxx

4.3 关键组件监控

部署Metrics Server实现基础监控:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

验证节点资源使用情况:

kubectl top nodes

5. 常见问题排查与维护

5.1 节点NotReady问题排查

# 查看节点详细状态
kubectl describe node <node-name>

# 检查kubelet日志
journalctl -u kubelet -f

5.2 网络故障排查

# 检查Flannel Pod日志
kubectl logs -n kube-system <flannel-pod-name>

# 验证跨节点网络连通性
kubectl run -it --rm --image=alpine test -- sh
# 在Pod内ping其他节点Pod IP

5.3 证书更新

当集群证书即将过期时:

# 检查证书有效期
kubeadm certs check-expiration

# 更新证书
kubeadm certs renew all

通过以上步骤,我们已在云服务器上成功部署了一个3节点的生产级K8s集群。实际使用中,建议结合CI/CD流水线实现应用的自动化部署,并定期备份etcd数据以确保集群安全。对于更复杂的生产需求,可考虑使用云托管的K8s服务或部署集群自动扩缩容组件。

更多推荐