架构
服务器和代理
- 服务器节点定义为运行
k3s server
命令的主机,其中控制平面和数据存储组件由 K3s 管理。 - 代理节点定义为运行
k3s agent
命令的主机,没有任何数据存储或控制平面组件。 - 服务器和代理都运行 kubelet、容器运行时和 CNI。有关运行无代理服务器的更多信息,请参阅 高级选项 文档。
单服务器设置,使用嵌入式数据库
下图显示了具有单个节点 K3s 服务器和嵌入式 SQLite 数据库的集群示例。
在此配置中,每个代理节点都注册到同一服务器节点。K3s 用户可以通过在服务器节点上调用 K3s API 来操作 Kubernetes 资源。
高可用性 K3s
单服务器集群可以满足各种用例,但对于 Kubernetes 控制平面正常运行时间至关重要的环境,您可以在 HA 配置中运行 K3s。HA K3s 集群包含
- 嵌入式数据库
- 外部数据库
- 三个或更多个将提供 Kubernetes API 服务并运行其他控制平面服务的 **服务器节点**
- 一个 **嵌入式 etcd 数据存储**(与单服务器设置中使用的嵌入式 SQLite 数据存储不同)
- 两个或更多个将提供 Kubernetes API 服务并运行其他控制平面服务的 **服务器节点**
- 一个 **外部数据存储**(例如 MySQL、PostgreSQL 或 etcd)
代理节点的固定注册地址
在高可用性服务器配置中,每个节点还可以使用固定注册地址注册 Kubernetes API,如下面的图表所示。
注册后,代理节点将直接建立与其中一个服务器节点的连接。
代理节点注册工作原理
代理节点通过 k3s agent
进程发起的 websocket 连接注册,该连接由作为代理进程的一部分运行的客户端负载均衡器维护。最初,代理通过端口 6443 上的本地负载均衡器连接到主管(和 kube-apiserver)。负载均衡器维护一个可连接到的可用端点列表。默认(也是最初唯一的)端点由 --server
地址中的主机名填充。连接到集群后,代理从默认命名空间中的 Kubernetes 服务端点列表中检索 kube-apiserver 地址列表。这些端点将添加到负载均衡器,负载均衡器随后将维护与集群中所有服务器的稳定连接,从而提供对 kube-apiserver 的连接,该连接能够容忍单个服务器的中断。
代理将使用节点集群密钥以及随机生成的节点密码(存储在 /etc/rancher/node/password
中)向服务器注册。服务器将为各个节点存储密码作为 Kubernetes 密钥,任何后续尝试都必须使用相同的密码。节点密码密钥存储在 kube-system
命名空间中,名称使用模板 <host>.node-password.k3s
。这样做是为了保护节点 ID 的完整性。
如果删除了代理的 /etc/rancher/node
目录,或者您希望使用现有名称重新加入节点,则应从集群中删除该节点。这将清理旧的节点条目和节点密码密钥,并允许节点(重新)加入集群。
如果您经常重用主机名,但无法删除节点密码密钥,则可以通过使用 --with-node-id
标志启动 K3s 服务器或代理来将唯一的节点 ID 自动附加到主机名。启用后,节点 ID 也存储在 /etc/rancher/node/
中。