跨VPC网络-使用 kubeadm 创建集群(v1.24)

使用 kubeadm 创建集群(v1.24)

  • 部署单个控制平面的 Kubernetes 集群,使用外部 etcd 集群设置 Kubernetes 集群

  • 在集群上安装 Pod 网络,以便你的 Pod 可以相互连通

前提

    1. 跨 VPC 网络搭建 k8s 集群-工具安装

    1. 跨 VPC 网络二进制部署 etcd 集群

3.1 初始化控制平面节点

将 etcd 认证文件从任何一个 etcd 节点复制到控制平面节点(master)

export CONTROL_PLANE="root@112.71.24.110"
scp /etc/etcd/ssl/ca.pem "${CONTROL_PLANE}":
scp /etc/etcd/ssl/etcd.pem "${CONTROL_PLANE}":
scp /etc/etcd/ssl/etcd-key.pem "${CONTROL_PLANE}":

3.2 集群配置参数 首先生成配置文件

 # 生成默认的 kubeadm 配置文件
kubeadm config print init-defaults > kubeadm.yaml

# 编辑修改参数
vim kubeadm.yaml

调整好的 kubeadm.yaml 如下:

初始化命令

kubeadm init 首先运行一系列预检查。这些预检查会显示警告并在错误时退出。预检查通过后 kubeadm init 下载并安装集群控制平面组件。这可能需要几分钟。 完成之后你应该看到:

在控制平面节点运行以下命令,就能够开始使用 kubectl 操作集群

加入其它控制平面节点

在追求高稳定性的生产环境中,集群的冗余是必要的。如果只有一个控制平面节点,当这个节点宕机时,整个集群处于不可用状态。为了降低这类风险,我们需要准备多个控制平面节点。集群数量是1、3、5、7……,奇数。

加入工作节点 在工作节点机器上运行 kubeadm init 输出的 kubeadm join 命令

输出如下:

回到控制平面节点(master)上运行 kubectl get nodes 命令查看节点加入情况,发现 kubectl 命令报错,无法查看节点信息。

因为 kubeadm join 命令将工作节点的内网 IP 上传给控制平面节点,跨 VPC 情况下,在控制平面节点当然无法通过工作节点的内网 IP 与工作节点通讯。

解决方案: 在控制平台节点(master)设置各个工作节点内、外网 IP NAT 转发规则(有 n 个工作节点就设置 n 条转发规则),使 kubectl 能够与所有工作节点通讯。命令格式如下:

此处有 2 个工作节点,故需要在 master 上执行 2 条命令:

kubectl 此刻可正常查看各个工作节点信息:

安装 Pod 网络插件 flannel

kubectl get nodes 查看全部节点状态,都是 Not Ready;再用 kubectl get pods --all-namespaces -o wide 查看所有 pod,CoreDNS 都是 pending 状态。

这是还没安装 Pod 网络插件的状态,k8s 集群还没就绪。

第一种方式是在每个节点上安装二进制包,然后以 systemd 服务运行 flanneld,指定-public-ip 参数,绑定外网ip,详见 https://github.com/flannel-io/flannel/blob/master/Documentation/running.md 第二种方式,容器化部署 flannel,一键执行,方便快捷。

在部署之前,有个关键问题:

flannel 默认将网卡 IP 设置为 Public IP,跨 VPC 服务器上的 flannel 实例以该服务器的内网 IP 为 Public IP,然后就出现控制平面节点的 flannel 运行成功,而工作节点的 flannel 不断重启、不断失败的状况……

解决方案: 在每个节点(控制平台节点、工作节点)上设置节点注释,命令格式如下:

在控制节点执行以下命令:

接着回到 master 上,用以下命令部署 flannel

每个集群只能安装一个 Pod 网络。

安装 Pod 网络后,你可以通过在 kubectl get pods --all-namespaces 输出中检查 CoreDNS Pod 是否 Running 来确认其是否正常运行。 一旦 CoreDNS Pod 和 flannel Pod 启用并运行,集群就完成部署工作。

Last updated