K3S 多节点集群部署

2024-07-25 17:41:39 浏览数 (3)

K3S 多节点集群部署指南

K3S 是一个轻量级的 Kubernetes 发行版,适合在资源受限的环境中部署。本文将详细介绍如何在多节点环境中部署 K3S,包括服务器和节点的配置、网络设置、Ingress 部署及调试方法。无论你是 K3S 新手还是资深用户,这份指南都能帮助你顺利搭建高效的 K3S 集群。

环境准备

以下是 K3S 多节点集群的环境准备表格,包括节点名称、子网、IP 地址及弹性 IP 绑定信息:

节点名称

子网

IP 地址

备注

K3S Server

私有子网

172.31.23.155

主要控制节点,管理集群

K3S Node1

私有子网

172.31.9.76

常规工作节点

K3S Node2

公开子网

172.31.9.75

专用节点,用于处理外部流量

弹性 IP 配置

为确保集群在重建或灾难恢复时的快速恢复,并避免由于 IP 更换导致的 DNS 缓存问题,建议为 K3S Node2(Ingress 节点)配置弹性 IP。弹性 IP 的使用可以确保外部访问不会因为节点 IP 的变化而中断服务。

弹性 IP 配置步骤
  1. 申请弹性 IP:在你的云服务提供商(如 AWS、Azure、GCP)上申请一个弹性 IP 地址。
  2. 绑定弹性 IP:将弹性 IP 绑定到 K3S Node2,确保其 IP 地址在任何重新启动或重建情况下保持IP地址不变。
  3. 更新 DNS 记录:将 DNS 记录指向弹性 IP 地址,以确保外部流量能够持续访问集群。

网络配置

K3S 集群的网络配置至关重要,尤其是在涉及到 Ingress 控制器时。以下是网络配置的关键点:

  1. 端口开放
    • K3S节点安全组:参考 官方文档 https://docs.k3s.io/installation/requirements#inbound-rules-for-k3s-nodes 配置入站规则。
    • Web 安全组:开放 443(HTTPS)和 80(HTTP)端口。
    • 运维安全组:开放 22(SSH)端口。
  2. Ingress 配置
    • Ingress 控制器需要运行在公开子网,以便处理来自外部的流量。

部署配置

K3S Server

使用以下命令部署 K3S Server:

代码语言:bash复制
curl -sfL https://get.k3s.io | sh -s - --disable=traefik,servicelb --data-dir=/opt/rancher/k3s --kube-apiserver-arg service-node-port-range=0-50000 --bind-address=0.0.0.0 --tls-san=172.31.23.155 --advertise-address=172.31.23.155 --node-external-ip=172.31.23.155

解释:

--disable=traefik,servicelb:禁用默认的 Traefik 和 Service LoadBalancer。

--data-dir=/opt/rancher/k3s:指定 K3S 数据目录。

--kube-apiserver-arg service-node-port-range=0-50000:设置 NodePort 服务范围。

--bind-address=0.0.0.0:监听所有网络接口。

--tls-san 和 --advertise-address:设置 TLS SAN 和广告地址。

K3S Agent

在部署 K3S Agent 节点时,需要满足以下关键前提条件:

Server URL:

  1. Server URL 是 K3S Server 节点的地址,用于让 Agent 节点连接到 Server 节点。
  2. 格式通常是 http://<server-ip>:6443 或 https://<server-ip>:6443,其中 <server-ip> 是 Server 节点的 IP 地址。
  3. Agent 节点需要知道 Server 节点的 URL,以便能够与 Server 节点进行通信。

Server Token

  1. 定义:Server Token 是一个用于身份验证的令牌,它确保 Agent 节点可以安全地加入到 Server 节点。INSTALL_K3S_EXEC="--server=https://<server-ip>:6443 --token=<server-token>" sh -
  2. 获取:在 Server 节点上生成,并存储在文件 /var/lib/rancher/k3s/server/node-token 中。
  3. 使用:在部署 K3S Agent 时,使用 INSTALL_K3S_EXEC 环境变量指定 token。例如:

检查节点的 IP Forwarding

  1. 定义:IP Forwarding 是指系统允许转发网络数据包的能力。这对于跨节点通信是必需的,特别是在使用 K3S 的集群中。
  2. 检查和启用:检查 IP Forwarding 状态: sysctl net.ipv4.ip_forward 如果输出结果为 net.ipv4.ip_forward = 0,则表示 IP Forwarding 被禁用。
  3. 启用 IP Forwarding:sudo sysctl -w net.ipv4.ip_forward=1 要使更改永久生效,可以编辑 /etc/sysctl.conf 文件,添加或修改以下行:net.ipv4.ip_forward=1

其他重要注意事项

  1. 网络配置:确保所有节点的网络配置正确,节点之间能够相互通信。
  2. 防火墙和安全组:检查防火墙规则和安全组配置,确保必要的端口(如 6443)已开放,允许 K3S 节点之间的通信。
  3. 系统资源:确保每个节点具有足够的 CPU、内存和存储资源,以支持 K3S 的运行。 确保满足上述条件,将有助于成功部署并稳定运行 K3S Agent 节点。

Agent节点类型及其设置

在 集群中 Agent 节点负责在集群中执行实际的工作负载任务,包括应用容器和服务。节点可以根据其角色和功能被划分为不同的类型,根据节点的具体角色,例如常规节点和专属节点,每种类型的配置和功能略有不同。

常规节点

代码语言:bash复制
curl -sfL https://get.k3s.io | K3S_URL=<Server_URL> K3S_TOKEN=<Server_TOKEN> INSTALL_K3S_EXEC="--node-label genernal=true --node-ip=172.31.9.76 --node-external-ip=172.31.9.76" sh -

说明:

--node-label genernal=true:为节点添加标签,标识该节点为常规工作节点。标签用于在调度 Pods 时进行选择和过滤。

--node-ip 172.31.9.76 和 --node-external-ip 172.31.9.76:指定节点的内部和外部 IP 地址,确保网络流量能够正确路由到该节点。

专属节点

代码语言:bash复制
curl -sfL https://get.k3s.io | K3S_URL=<Server_URL> K3S_TOKEN=<Server_TOKEN>
INSTALL_K3S_EXEC="--node-label ingress=true --node-taint key1=ingress:NoExecute --node-ip=172.31.9.75 --node-external-ip=172.31.9.75" sh -

说明: 专属节点的主要区别就是应用 Taint --node-taint key1=ingress 以便只有标记为 ingress 的 Pods 可以调度到该节点。Taint 确保了该节点只用于处理特定任务,例如 Ingress 流量。

区别及原因

在 K3S 集群中,不同类型的节点可以从以下三个维度进行区分:安全性、可靠性 和 成本控制。

维度/节点类型

常规节点

专属节点

安全性

部署在私有子网中,减少对外暴露,降低安全风险。

部署在公开子网中,设置 Taint 限制调度,仅处理指定类型的 Pods。通过专门的入口点管理外部流量,进一步提高集群的安全性。

可靠性

作为集群的计算节点,处理应用任务。由于在私有子网中,主要处理内部流量,与外部流量隔离,确保集群的稳定性。

部署在公开子网中,通过隔离流量,减少对常规节点的负担,提高系统的整体可靠性。

成本控制

根据业务负载选择性能较高的实例,部署在私有子网中,处理核心业务。

根据流量负载选择实例类型,部署在公开子网中,根据实际需求进行扩展,避免不必要的资源浪费。

Ingress 部署

确保 Ingress 控制器在公开子网节点上运行,以处理外部流量。配置 Ingress Pod 以适应以下要求:

代码语言:yaml复制
tolerations:
  - key: "key1"
    operator: "Equal"
    value: "ingress"
    effect: "NoExecute"
  • 确保 Ingress Pod 被调度到专用节点上,以确保流量能够正确地路由到集群内的服务。

验证

集群部署的健康状态和功能:

  1. 检查节点状态: kubectl get nodes
  2. 检查 Pod 状态:kubectl get pods --all-namespaces
  3. 测试 Ingress: 部署一个简单的测试服务和 Ingress 资源,确保外部流量能够正确访问。

调试

在遇到问题时,可以通过以下步骤进行调试:

  1. 查看日志:K3S 服务日志:journalctl -u k3s 或者查看 Pod 日志:kubectl logs <pod-name>
  2. 网络问题排查:确认防火墙规则和网络设置是否正确;确保 VXLAN 和其他必要端口已开放。

总结

  1. IP 地址配置:正确配置 --node-ip 和 --node-external-ip 是确保节点正常工作的关键,尤其是在 NAT 环境下。
  2. VXLAN 配置:跨节点通信时,VXLAN 配置和端口开放非常重要,以避免通信问题。
  3. Ingress 部署:部署在公开子网的 Ingress 控制器需要正确配置,以确保外部流量能够正常路由。
  4. 弹性 IP:为 Ingress 节点配置弹性 IP 可以提高节点的稳定性,并简化灾难恢复过程,避免 IP 更换带来的 DNS 缓存问题。

通过遵循上述步骤和注意事项,你将能够成功部署和管理 K3S 多节点集群,确保高效的服务运行和流量处理,可以使用以下最小资源配置来模拟生产集群的形态

0 人点赞