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 配置步骤
- 申请弹性 IP:在你的云服务提供商(如 AWS、Azure、GCP)上申请一个弹性 IP 地址。
- 绑定弹性 IP:将弹性 IP 绑定到
K3S Node2
,确保其 IP 地址在任何重新启动或重建情况下保持IP地址不变。 - 更新 DNS 记录:将 DNS 记录指向弹性 IP 地址,以确保外部流量能够持续访问集群。
网络配置
K3S 集群的网络配置至关重要,尤其是在涉及到 Ingress 控制器时。以下是网络配置的关键点:
- 端口开放:
- K3S节点安全组:参考 官方文档 https://docs.k3s.io/installation/requirements#inbound-rules-for-k3s-nodes 配置入站规则。
- Web 安全组:开放 443(HTTPS)和 80(HTTP)端口。
- 运维安全组:开放 22(SSH)端口。
- 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:
- Server URL 是 K3S Server 节点的地址,用于让 Agent 节点连接到 Server 节点。
- 格式通常是 http://<server-ip>:6443 或 https://<server-ip>:6443,其中 <server-ip> 是 Server 节点的 IP 地址。
- Agent 节点需要知道 Server 节点的 URL,以便能够与 Server 节点进行通信。
Server Token
- 定义:Server Token 是一个用于身份验证的令牌,它确保 Agent 节点可以安全地加入到 Server 节点。INSTALL_K3S_EXEC="--server=https://<server-ip>:6443 --token=<server-token>" sh -
- 获取:在 Server 节点上生成,并存储在文件 /var/lib/rancher/k3s/server/node-token 中。
- 使用:在部署 K3S Agent 时,使用 INSTALL_K3S_EXEC 环境变量指定 token。例如:
检查节点的 IP Forwarding
- 定义:IP Forwarding 是指系统允许转发网络数据包的能力。这对于跨节点通信是必需的,特别是在使用 K3S 的集群中。
- 检查和启用:检查 IP Forwarding 状态: sysctl net.ipv4.ip_forward 如果输出结果为 net.ipv4.ip_forward = 0,则表示 IP Forwarding 被禁用。
- 启用 IP Forwarding:sudo sysctl -w net.ipv4.ip_forward=1 要使更改永久生效,可以编辑 /etc/sysctl.conf 文件,添加或修改以下行:net.ipv4.ip_forward=1
其他重要注意事项
- 网络配置:确保所有节点的网络配置正确,节点之间能够相互通信。
- 防火墙和安全组:检查防火墙规则和安全组配置,确保必要的端口(如 6443)已开放,允许 K3S 节点之间的通信。
- 系统资源:确保每个节点具有足够的 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 被调度到专用节点上,以确保流量能够正确地路由到集群内的服务。
验证
集群部署的健康状态和功能:
- 检查节点状态: kubectl get nodes
- 检查 Pod 状态:kubectl get pods --all-namespaces
- 测试 Ingress: 部署一个简单的测试服务和 Ingress 资源,确保外部流量能够正确访问。
调试
在遇到问题时,可以通过以下步骤进行调试:
- 查看日志:K3S 服务日志:journalctl -u k3s 或者查看 Pod 日志:kubectl logs <pod-name>
- 网络问题排查:确认防火墙规则和网络设置是否正确;确保 VXLAN 和其他必要端口已开放。
总结
- IP 地址配置:正确配置 --node-ip 和 --node-external-ip 是确保节点正常工作的关键,尤其是在 NAT 环境下。
- VXLAN 配置:跨节点通信时,VXLAN 配置和端口开放非常重要,以避免通信问题。
- Ingress 部署:部署在公开子网的 Ingress 控制器需要正确配置,以确保外部流量能够正常路由。
- 弹性 IP:为 Ingress 节点配置弹性 IP 可以提高节点的稳定性,并简化灾难恢复过程,避免 IP 更换带来的 DNS 缓存问题。
通过遵循上述步骤和注意事项,你将能够成功部署和管理 K3S 多节点集群,确保高效的服务运行和流量处理,可以使用以下最小资源配置来模拟生产集群的形态