K3s 使用外部数据库实现高可用安装
使用外部数据库实现高可用安装
注意: 我们在 v1.0.0 版本中引入了在 Kubernetes 集群上安装 Rancher 的官方支持。
本节介绍了如何使用外部数据库安装一个高可用的 K3s 集群。
单节点 k3s server 集群可以满足各种用例,但是对于需要 Kubernetes control-plane 稳定运行的重要环境,您可以在 HA 配置中运行 K3s。一个 K3s HA 集群由以下几个部分组成:
- 两个或多个server 节点,将为 Kubernetes API 提供服务并运行其他 control-plane 服务。
- 零个或多个agent 节点,用于运行您的应用和服务。
- 外部数据存储 (与单个 k3s server 设置中使用的嵌入式 SQLite 数据存储相反)
- 固定的注册地址,位于 server 节点的前面,以允许 agent 节点向集群注册
关于这些组件如何协同工作的更多细节,请参考架构部分。
Agent 通过固定的注册地址进行注册,但注册后直接与其中一个 server 节点建立连接。这是一个由k3s agent
进程发起的 websocket 连接,并由作为 agent 进程一部分运行的客户端负载均衡器维护。
安装概要
1. 创建一个外部数据存储
你首先需要为集群创建一个外部数据存储。请参阅集群数据存储选项文档了解更多细节。
2. 启动 server 节点
K3s 需要两个或更多的 server 节点来实现这种 HA 配置。请参阅安装要求指南了解最低主机要求。
当在这些节点上运行k3s server
命令时,必须设置datastore-endpoint
参数,以便 K3s 知道如何连接到外部数据存储。token
参数也可以用来在添加节点时设置一个固定的 token。当为空时,将自动生成 token。
例如,可以使用如下命令安装 K3s server,并使用 MySQL 数据库作为外部数据存储和设置 token:
curl -sfL https://get.k3s.io | sh -s - server \
--token=SECRET \
--datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"
国内用户,可以使用以下方法加速安装:
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server \ --token=SECRET \ --datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"
根据数据库类型的不同,数据存储端点的格式也不同。详情请参考数据存储端点格式章节。
启动 server 节点时,若要设置 TLS 证书,请参考数据存储配置指南。
注意: 单台 server 安装时可用的安装选项也适用于高可用安装。更多详情,请参见安装和配置选项文档。
默认情况下,server 节点将是可调度的,因此你的工作负载可以在它们上启动。如果你希望有一个专用的 control-plane,在这个平面上不会运行用户工作负载,你可以使用 taints。node-taint
参数将允许你用污点配置节点,例如--node-taint CriticalAddonsOnly=true:NoExecute
。
在所有 server 节点上启动k3s server
进程后,用k3s kubectl get nodes
确保集群正常运行。你应该会看到你的 server 节点处Ready
状态。
3. 配置固定的注册地址
Agent 节点需要一个 URL 来注册。这可以是任何 server 节点的 IP 或主机名,但在许多情况下,这些节点可能会随着时间的推移而改变。例如,如果您在支持缩放组的云中运行集群,您可能会随着时间的推移上下缩放 server 节点组,导致节点被创建和销毁,从而具有与初始 server 节点不同的 IP。因此,你应该在 server 节点前面有一个稳定的端点,不会随时间推移而改变。可以使用许多方法来设置此端点,例如:
- 一个 4 层(TCP)负载均衡器
- 轮询 DNS
- 虚拟或弹性 IP 地址
这个端点也可以用来访问 Kubernetes API。因此,你可以修改你的kubeconfig
文件来指向它,而不是特定的节点。为了避免在这样的配置中出现证书错误,你应该使用--tls-san YOUR_IP_OR_HOSTNAME_HERE
选项安装 server 节点。这个选项在 TLS 证书中增加了一个额外的主机名或 IP 作为备用名称,如果你想通过 IP 和主机名访问,可以多次指定。
4. 可选:加入其他的 server 节点
步骤 2 中的相同示例命令可用于加入其他 server 节点,其中需要使用第一个节点的 token。
如果第一个 server 节点是在没有 --token
CLI 标志或 K3S_TOKEN
变量的情况下启动的,那么可以从任何已经加入集群的 server 节点中检索到 token:
cat /var/lib/rancher/k3s/server/token
然后可以使用 token添加其他 server 节点:
curl -sfL https://get.k3s.io | sh -s - server \
--token=SECRET \
--datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"
有几个配置标志在所有 server 节点中必须是相同的:
- 与网络有关的标志:
--cluster-dns
, --cluster-domain
, --cluster-cidr
, --service-cidr
- 控制某些组件的部署的标志:
--disable-helm-controller
, --disable-kube-proxy
, --disable-network-policy
和任何传递给--disable
的组件 - 与功能相关的标志:
--secrets-encryption
注意:应该备份 token 的值,因为从备份恢复和添加节点时都需要它。以前,K3s 在使用外部 SQL 数据存储时不强制使用 token。
5. 可选: 加入 Agent 节点
因为 K3s server 节点默认是可调度的,所以 HA K3s server 集群的最小节点数是两个 server 节点和零个 agent 节点。要添加指定运行您的应用和服务的节点,请将 agent 节点加入到您的集群中。
在 HA 集群中加入 agent 节点与在单个 server 集群中加入 agent 节点是一样的。你只需要指定 agent 应该注册到的 URL 和它应该使用的 token 即可。
K3S_TOKEN=SECRET k3s agent --server https://fixed-registration-address:6443
更多建议: