Group 1219

博客

Search
Vector 10
Microsoft Teams Image 55 17379b5ddb

在 Zenlayer 裸机云上部署基于 Talos 的 Kubernetes 集群

关于作者:

Seagle Yang 是 Zenlayer 的产品架构师和常驻裸机云专家,已在 Zenlayer 工作超过 5 年。作为一名业务解决方案架构师,他在系统和网络设计以及管理方面拥有超过 20 年的行业经验。Seagle Yang 喜欢接受新的技术挑战,以便在克服挑战的过程中不断学习新技能。

 

引言:

大家好!今天我们将介绍如何在 Zenlayer 裸机上使用 Talos 创建 Kubernetes 集群的步骤。

这个指南非常适合那些想要部署基于 Talos 的 Kubernetes 平台以简化其容器构建的人。

Talos 是一个针对容器优化的 Linux 发行版,因此您不会在其上找到 SSH / bash 终端,因为它专为单一目的而设计——启动 Kubernetes。因此,它被尽可能重新想象并最小化。

本指南的关键步骤包括:

  1. 创建一个带有 DHCP / TFTP / HTTP 的 PXE / iPXE 服务器的管理员工作站。
  2. 在管理员工作站上安装 talosctl 和 kubectl。
  3. 准备 PXE 环境。
  4. 生成机器配置文件。
  5. 通过 PXE 安装并引导控制平面节点的 etcd,然后通过 PXE 安装工作节点。
  6. 验证集群构建、配置修改和基本故障排除

以下是我们最终构建的拓扑结构,Kubernetes 组件以蓝色命名,而 Talos 组件以橙色命名:

Step #1 – 创建管理员工作站并准备局域网:

为了在 Zenlayer 上创建裸机实例和您的第一个局域网(在 zenConsole 中也称为“子网”),请参考文章中的第 1 节和第 2 节:“在裸机上构建您的私有云”。

1.1. 使用 root 权限,运行“apt install”来安装以下服务:

– DHCP 服务器: isc-dhcp-server

– TFTP: tftpd-hpa

– HTTP(S): lighttpd

Step #2 – 在管理员工作站上安装 Kubernetes CLI 工具:

2.1. 安装 “talosctl“:

curl -Lo /usr/local/bin/talosctl
https://github.com/siderolabs/talos/releases/download/v1.2.5/talosctl-$(uname -s | tr “[:upper:]” ”
[:lower:]”)-amd64

chmod +x /usr/local/bin/talosctl

2.2. 安装 “kubectl”:

curl -LO “https://dl.k8s.io/release/$(curl -L -s
https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl”

sudo chmod +x /usr/local/bin/kubectl

2.3. (选择性) 安装 “clusterctl“

sudo curl -Lo /usr/local/bin/clusterctl

“https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.1.1/clusterctl-$(uname -s |
tr ‘[:upper:]’ ‘[:lower:]’)-amd64”

sudo chmod +x /usr/local/bin/clusterctl

 

Step #3 – 配置PXE环境:

3.1 DHCP 服务器配置:

子网配置部分相对直接,配置文件为“/etc/dhcp/dhcpd.conf”。我定义了一个范围 10.7.7.101-150,并让服务在 10.7.7.3 的私有 LAN 接口上监听。

关键的配置是让 DHCP 服务器为请求 DHCP 引导的客户端发送正确的文件。我为不同的请求放置了一个“if-else”语句,因为默认情况下,ipxe 会发出另一个 DHCP 请求并陷入无限循环——PXE 会加载 iPXE,然后 iPXE 又会加载 iPXE,如此反复……

为了打破这个循环,服务器会检查 DHCP 请求的用户类属性是否设置为“ipxe”,如果是 ipxe 初始化的,则发送“boot.script”而不是 pxe 镜像。

subnet 10.7.7.0 netmask 255.255.255.0 {

range 10.7.7.101 10.7.7.150;

option domain-name-servers 8.8.8.8;

option domain-name “zenlayer.net”;

option routers 10.7.7.3;

option broadcast-address 10.7.7.255;

default-lease-time 600;

max-lease-time 7200;

# TFTP server IP

next-server 10.7.7.3;

if exists user-class and option user-class = “iPXE” {

filename “http://10.7.7.3/boot.script”;

} else {

filename “ipxe.pxe”;

}

#  fix IP-MAC binding if necessary,for you reference;

host cp00 {

hardware ethernet 0c:c4:7a:e2:df:42;

fixed-address 10.7.7.104;

}

}

 

3.2 TFTP 服务器

TFTP 服务器设置相对简单,因为它在此构建中只有一个目的——帮助 DHCP 客户端启动 ipxe 引导。默认的配置文件是“/etc/default/tftpd-hpa”。

找到目录根,并将ipxe镜像放入其中。ipxe镜像可以从https://boot.ipxe.org/下载。

• 对于使用传统启动的服务器,文件“ipxe.pxe”将用于此目的。

• 对于使用 UEFI 启动的服务器,“ipxe.efi”将执行此操作。

3.3 HTTP 服务器

在加载了 ipxe 镜像之后,DHCP 客户端将能够通过 HTTP 拉取脚本或镜像。同时,Talos 安装需要一个 yaml 文件来配置服务器,该文件也将通过 HTTP 提供。

通过执行单个命令行“apt install lighttpd”可以安装 lighttpd,其默认配置文件是“/etc/lighttpd/lighttpd.conf”。

找到“server.document-root”定义,并定位到该文件夹。

我已经在 HTTP 服务器的根目录下放置了一些文件用于此构建:

root@K8SController:/var/www/html# ls -l
-rw-r–r– 1 root root 297 Nov 14 23:51 boot.script
-rw-r–r– 1 root root 25321 Nov 14 23:16 cp.yaml
-rw-r–r– 1 root root 10 Nov 11 01:09 index.html
-rw-r–r– 1 root root 60337204 Oct 11 19:35 initramfs-amd64.xz
-rw-r–r– 1 root root 16031520 Oct 11 19:37 vmlinuz-amd64
-rw-r–r– 1 root root 23834 Nov 17 20:23 wk.yaml

• vmlinuz-amd64 和 initramfs-amd64.xz:这是 Talos 网络启动镜像,可以从 Talos 的 Github 上下载:https://github.com/siderolabs/talos/releases
• cp.yaml 和 wk.yaml:这是 Talos 机器的配置文件,以 yaml 格式存在,分别用于控制平面和工作节点,我将在第 4 步中进行解释。
• boot.script:这是 ipxe 启动的关键,带有 #!ipxe 头部和 3 条命令行 – 内核;初始 RAM 磁盘;带有相应参数的启动。

#!ipxe
kernel http://10.7.7.3/vmlinuz-amd64 initrd=initramfs-amd64.xz console=tty0
console=ttyS1,115200 selinux=0 biosdevname=0 init_on_alloc=1 slab_nomerge pti=on
printk.devkmsg=on talos.platform=metal ip=dhcp talos.config=http://10.7.7.3/wk.yaml
initrd http://10.7.7.3/initramfs-amd64.xz
boot

• Talos 需要一些内核参数,您可以在这里找到:Kernel 。

• index.html 文件随默认的 lighttpd 安装而来。

要进行验证,您可以使用“ss -lna”命令来检查服务监听的端口:

• UDP 67 – DHCP
• UDP 69 – TFTP
• TCP 80 – HTTP

您也可以使用 curl 命令来拉取 boot.script 文件以进行测试。

对于 DHCP,使用“journalctl -xe”命令可以提供更多信息,一个正常的 DHCP 输出应该像这样:

Step #4 – 生成机器配置的YAML文件:

机器配置采用YAML格式,并将被发送到服务器进行IPXE引导,Talos提供的“talosctl”命令行工具可以帮助您生成该文件:

命令用法:

talosctl gen config [ClusterName] https://<负载均衡器 IP 或 API 端点的 DNS>:<端口>

在我的方案中,我使用了单个控制平面,我将“mydemo”作为集群名称,并将 10.7.7.104 作为控制平面的 API 端点:

# talosctl gen config mydemo https://10.7.7.104:6443

创建 controlplane.yaml

创建 worker.yaml

创建 talosconfig

我复制了 controlplane.yaml 文件并将其重命名为 cp.yaml,然后进行了编辑,以下是用于裸机设置的一些关键设置:

4.1 – 控制平面节点接口和 IP 设置:

在这种情况下,我在 10.7.7.3(管理员工作站)上启用了 NAT,以便服务器可以从互联网上获取镜像,因为所有 Zenlayer 裸金属服务器默认都有一个互联网接口。实际上,我可以使用相同的 yaml文件启动互联网地址并绕过 NAT。

在 iPXE 引导期间,服务器将从 eth0 初始化请求,这是 Zenlayer 裸金属服务器的默认第一个引导选项,通过 http 获取网络引导镜像和 yaml 文件,然后执行 init 软重载并应用 yaml 文件。

到那时,互联网接口将正常运行,并且安装过程将开始通过互联网接口拉取最新的 Talos 镜像。我稍后将在名为“工作节点配置”的部分中展示。

命名服务器设置和磁盘配置,通常是“dev/sda”。

我将“wipe”选项更改为“true”,以便格式化磁盘并在其上加载 Talos Linux。

4.2 – 工作节点接口和 IP 设置:

在配置工作节点时,我发现可以通过 yaml 文件分配互联网 IP 地址,并从 Zenlayer 控制台 zenConsole 获取 IP 配置。

在获取了互联网 IP 地址和网关信息后,我对 yaml 进行了相应的修改,以匹配裸金属服务器的互联网设置。这将允许 ipxe 服务器进行网络引导,而剩余的镜像和安装工作将通过各服务器的互联网连接来完成。

在编辑完 yaml 文件后,您可以通过运行“talosctl validate –config [YourFileName].yaml –mode metal”命令来验证它:

参考:YAML 文件配置:配置

步骤#5 – PXE/iPXE 启动和 etcd 引导:

在管理员工作站和 yaml 文件准备就绪后,您可以重启第一台服务器以进行 pxe 安装。我将 cp0.yaml 放入 boot.script 中,因为控制平面节点必须是第一台服务器,我可以通过 zenConsole 访问服务器的 IPMI 界面来查看安装过程:

远程控制台输出显示,服务器已经获取 DHCP 分配,并开始加载网络启动镜像:

随后,安装程序开始运行并擦除磁盘:/dev/sda

然后,它将在 etcd 处停止,并等待一个特殊步骤,称为“bootstrap etcd”:

然后,您可以登录管理员工作站(在我的实验室中是10.7.7.3),并执行以下命令(10.7.7.104是我的控制平面节点的IP):

talosctl –talosconfig talosconfig config endpoint 10.7.7.104

talosctl –talosconfig talosconfig config node 10.7.7.104

talosctl –talosconfig talosconfig bootstrap

请记住,这是一个必需步骤,并且仅在安装第一个控制平面节点时执行一次。下面的截图显示了引导过程已完成:

然后,安装将完成,您可以通过一条命令检索配置并将其合并到kubeconfig中。talosconfig 文件是在步骤#4 中生成的,您可以在管理员工作站上运行该命令:

talosctl –talosconfig talosconfig kubeconfig

检查~/.kube/config文件,并确认mydemo集群的证书已合并:

现在,您可以使用 kubectl 进行 Kubernetes 集群管理:

下一步是 pxe 安装工作节点。我更改了 boot.script 文件,以分发 wk.yaml 文件并重新加载工作节点。安装程序将执行其工作,您可以在配置后检查节点是否已注册:

* 左上角部分是工作节点安装的屏幕输出,背景中的终端窗口显示节点已成功注册,但目前显示为“not ready”(未就绪):

现在,我们稍作休息,让 Talos 完成剩下的工作。过一会儿,工作节点处于就绪状态,我们拥有了一个包含一个控制平面节点和一个工作节点的集群:

 

Step #6 – 验证/修改和故障排除:

6.1. 标签/升级/健康检查

工作节点在角色列中显示为<none>,您可以使用命令行设置标签:

kubectl label node talos-05w-tbf node-role.kubernetes.io/worker=worker

出于某种原因,我的工作节点安装版本是 1.2.5,因此我决定进行升级。一条talosctl命令即可完成此操作:

talosctl upgrade -n 10.7.7.105 –image ghcr.io/siderolabs/installer:v1.2.6

我对最后一台机器进行了 pxe 启动,并得到了一个包含一个控制平面和两个工作节点的集群:

talosctl 还可以对集群状态进行快速健康检查:

6.1 安装后的机器网络配置更改

由于 Talos 没有为管理员提供 ssh 或终端 bash,因此一些管理员可能想要在机器配置上进行更改时会感到困惑——talosctl 将帮助您解决这个问题。

例如,对于网络连接的故障排除和修改,“talosctl get addresses -n [NodeIP]”类似于 Linux bash 中的“ip a”:

“talosctl get route -n [NodeIP]”将显示类似于“ip r”或“route -v”的内容。

当对网络进行更改时,“talosctl edit machineconfig -n [nodeIP]”将弹出裸金属服务器的网络配置,您可以像编辑 yaml 文件一样对其进行修改:

 

请注意,如果您觉得直接编辑不太适应,也可以选择使用“应用 yaml 文件”的方法。所有的操作都是通过 API 调用进行的,并且遵循 Kubernetes 的风格。

您可以在这里找到完整的网络资源列表:https://www.talos.dev/v1.2/learn-more/networking-resources/

祝您好运,尽情享受 Talos Linux 带来的乐趣吧!!!

分享:

下载白皮书