Kubernetes容器编排实战:从零搭建高可用集群

在云原生时代,Kubernetes(K8s)已成为容器编排的事实标准。然而,搭建一个生产可用的高可用集群对初学者来说并不容易。本文将以kubeadm为主要工具,手把手教您搭建一个包含3个Master节点和3个Worker节点的高可用集群,并部署Calico网络插件。整个过程将涵盖从环境准备到集群验证的每一个细节。

一、环境准备

我们使用6台Ubuntu 22.04 LTS虚拟机,配置如下:

  • Master节点:3台(2核4GB内存,50GB硬盘)
  • Worker节点:3台(4核8GB内存,100GB硬盘)
  • 所有节点之间内网互通,并可以访问外网(用于拉取镜像)

首先,在所有节点上执行基础配置:

# 更新系统并安装必要工具
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl

# 关闭swap(K8s要求)
sudo swapoff -a
# 永久关闭swap:注释掉/etc/fstab中的swap行

# 加载内核模块
cat <

二、安装容器运行时(containerd)

Kubernetes从1.24版本开始移除了对Docker的集成支持,我们使用containerd作为运行时。

# 安装containerd
sudo apt-get install -y containerd

# 配置containerd使用systemd cgroup驱动
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 重启containerd
sudo systemctl restart containerd
sudo systemctl enable containerd

三、安装kubeadm、kubelet和kubectl

# 添加Kubernetes官方仓库
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 注意:如果网络受限,可使用国内镜像源

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

# 锁定版本,防止意外升级
sudo apt-mark hold kubelet kubeadm kubectl

四、配置负载均衡器(HAProxy)

对于高可用集群,需要一个虚拟IP(VIP)或负载均衡器来分发流量到多个Master节点。这里我们使用HAProxy在独立的一台机器上(或直接在某个Master上)配置。

# 安装HAProxy(在所有Master节点或专用负载均衡节点)
sudo apt-get install -y haproxy

# 编辑/etc/haproxy/haproxy.cfg,添加如下配置
frontend k8s-api
    bind *:6443
    default_backend k8s-masters

backend k8s-masters
    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

# 重启HAProxy
sudo systemctl restart haproxy

确保所有Master节点的kubelet和kubeadm都指向负载均衡器的地址(例如192.168.1.100:6443)。

五、初始化第一个Master节点

在第一个Master节点上执行初始化命令,指定负载均衡器的IP和端口:

sudo kubeadm init --control-plane-endpoint "192.168.1.100:6443" --upload-certs --pod-network-cidr=10.244.0.0/16

初始化完成后,会输出一段加入集群的命令,请保存好。接着配置kubectl:

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

六、加入其余Master和Worker节点

在第二个和第三个Master节点上,执行初始化输出中提供的kubeadm join命令,并加上--control-plane参数。例如:

sudo kubeadm join 192.168.1.100:6443 --token  --discovery-token-ca-cert-hash sha256: --control-plane --certificate-key 

对于Worker节点,去掉--control-plane参数即可。

七、部署网络插件(Calico)

在任意Master节点上,使用kubectl部署Calico:

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml

如果网络受限,可以下载YAML文件后修改镜像地址为国内镜像。

八、验证集群状态

# 检查节点状态
kubectl get nodes

# 检查Pod状态(所有Pod应为Running)
kubectl get pods -n kube-system

# 查看集群健康状态
kubectl cluster-info

当所有节点状态为Ready,所有kube-system命名空间下的Pod都处于Running状态时,集群搭建成功。

九、测试部署一个应用

# 创建一个简单的nginx部署
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务暴露的端口
kubectl get svc nginx

通过任意节点的IP加上NodePort端口即可访问nginx服务。

十、常见问题与优化

  • 镜像拉取失败:使用国内镜像源,如阿里云或中科大镜像,修改kubeadm配置中的imageRepository。
  • 证书过期:kubeadm生成的证书有效期为1年,请使用kubeadm certs renew all定期续期。
  • 性能优化:调整内核参数,如net.core.somaxconn,并设置kubelet的--max-pods参数。

通过以上步骤,您已经成功搭建了一个生产级的高可用Kubernetes集群。接下来可以深入探索K8s的存储、滚动更新、自动伸缩等高级功能。希望本教程对您有所帮助,欢迎分享给更多需要的人。