具有外部数据库的高可用
注意:我们在 v1.0.0 版本中引入了在 Kubernetes 集群上安装 Rancher 的官方支持。
本文介绍了如何安装具有外部数据库的高可用 K3s 集群。
单服务器集群可以满足各种用例,但如果你的环境对 Kubernetes control plane 的正常运行时间有要求,你可以在 HA 配置中运行 K3s。一个 HA K3s 集群包括:
- 两个或多个 Server 节点为 Kubernetes API 提供服务并运行其他 control plane 服务
- 零个或多个 Agent 节点,用于运行你的应用和服务
- 外部数据存储(与单节点设置中使用的嵌入式 SQLite 数据存储相反)
- 一个在 Server 节点前面的固定的注册地址,用于让 Agent 节点注册到集群
有关这些组件如何协同工作的详细信息,请参阅架构。
Agent 通过固定的注册地址进行注册,但注册后直接与其中一个 Server 节点建立连接。这是一个由 k3s agent
进程发起的 WebSocket 连接,并由作为 agent 进程一部分运行的客户端负载均衡器维护。
安装概要
设置 HA 集群需要以下步骤:
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.rancher.cn/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,你可以使用污点(taint)。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 作为 Subject Alternative Name,如果你想通过 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"
中国用户,可以使用以下方法加速安装:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn 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 的值,因为恢复备份和添加节点时都需要该 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