多服务器(跨服务商)Kubernetes公网部署

0、说明

参考https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/

下方以你实际IP为准,此处仅为占位符
主服务器IP:{mainServerIp}
节点服务器IP:{nodeIp}

上述IP均为公网IP,需与服务商提供的内网IP相区别。

服务器操作系统:openCloudOS 8
Kubernetes版本:1.27.3

1、环境配置

此部分从节点和主节点都需要进行。

转发 IPv4 并让 iptables 看到桥接流量

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

通过运行以下指令确认 br_netfilter 和 overlay 模块被加载:

lsmod | grep br_netfilter
lsmod | grep overlay

通过运行以下指令确认 net.bridge.bridge-nf-call-iptablesnet.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1:

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

cgroup 驱动设置参考https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#cgroup-drivers,此处安装的K8S版本为1.27.3,根据文档所述,默认cgroup为systemd,故此处不再配置。

安装Docker。参考https://docs.docker.com/engine/install/centos/ 进行安装(openCloudOS兼容CentOS)。安装完成Docker后,设置自动启动并启动:

systemctl enable docker
systemctl start docker

安装cri-dockerd。参考https://github.com/Mirantis/cri-dockerd#build-and-install。此链接最后一部分“To use with Kubernetes”可不做。

安装kubectl、kubeadm、kubelet。参考https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.38c71b11Fl8p9e

添加Docker镜像。参考阿里云容器镜像服务ACR-镜像工具-镜像加速器

提前拉取镜像。由于网络环境的问题,会出现拉取registry.k8s.io/pause:3.6失败的问题导致主节点初始化失败,需要手动拉取。思路是通过镜像源拉取该镜像,然后将其标签设置为registry.k8s.io/pause:3.6,这样主节点部署时就会认为本地已经有了该镜像,从而不会再去拉取registry.k8s.io下的镜像了。若使用其他版本的K8S,遇到失败时需要查看kubectl的日志确定缺失的是哪个版本的pause,再用此方法下载即可。

docker pull registry.aliyuncs.com/google_containers/pause:3.6
docker image tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6

2、主节点部署

开放主节点端口。在云服务商处开放主节点服务器的6443端口。其它需要开放的端口依情况而定,端口列表不再列出,可自行查找。

添加虚拟网卡。此步骤是因为大多数云服务器默认绑定的网卡只有服务商的内网IP,导致初始化集群时若将apiServer的广播地址设置为公网IP,则会初始化失败,一直卡在等待控制平面启动的阶段,最后导致超时从而部署失败(默认4分钟)。参考https://blog.csdn.net/github_35735591/article/details/125533342

使用kubeadm初始化。具体参数配置见https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/。此处为pod网段分配了10.112.0.0/12、为服务网段分配了10.96.0.0/12,可依据自身情况调整。cri-socket参数配置为使用cri-dockerd的接口,若采用其他CRI,依情况修改,若不知道有哪些可用可不加此参数,直接执行,部署程序会自动查找系统中的CRI并应用,若有不止一个则会列举出所有的CRI,根据情况选择使用即可。

kubeadm init \
--apiserver-advertise-address 124.220.103.247 \
--kubernetes-version 1.27.3 \
--pod-network-cidr 10.112.0.0/12 \
--service-cidr 10.96.0.0/12 \
--cri-socket unix:///var/run/cri-dockerd.sock \
--image-repository=registry.aliyuncs.com/google_containers

初始化完成后,还需要进行下一步的操作,执行黄色框中的内容(或使用root用户执行绿色框内容,但只会在当前连接会话内有效,推荐执行黄色框内容),需要记录下输出的内容(红框中的内容)以便于从节点加入集群。

安装网络插件,否则主节点CoreDns Pod会一直处于Pending状态(https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#coredns-%E5%81%9C%E6%BB%9E%E5%9C%A8-pending-%E7%8A%B6%E6%80%81)。可选的网络插件有很多,这里选用Flannel进行安装(https://github.com/flannel-io/flannel#deploying-flannel-with-kubectl)。

因为我们自定义了Pod的网段,所以不能直接使用Flannel的默认安装,需要下载下来并进行修改。

wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
vi kube-flannel.yml

找到net-conf.json,修改其中的Network为自定义的Pod网段,此处我们使用的Pod网段为10.112.0.0/12

修改完成后,使用kubectl进行应用即可。

kubectl apply -f kube-flannel.yml

3、从节点配置

在从节点中运行之前执行kubeadm init命令后输出的kubeadm join命令(之前图片内红色框中的内容)。需要注意的是,此处需要加上cri-socket参数,说明见上节的kubeadm init部分。下面的代码仅为示例,实际token与discovery-token-ca-cert-hash更长。

kubeadm join {mainServerApi}:6443 \
--token d3n.sxikf --discovery-token-ca-cert-hash sha256:9b17ef12ccbed5ac5bc0e50 \
--cri-socket unix:///var/run/cri-dockerd.sock

4、完成

从节点全部执行join命令后,在主节点执行kubectl get node即可查询所有节点状态。全部节点的状态都为ready时,集群才算部署完成。

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code