高可用架构设计
Load Balancer:负载均衡
DataStore:嵌入式数据库(外部数据库)
嵌入式DB高可用
注意:
1、从 v1.19.5+k3s1 版本开始,K3s 已添加了对嵌入式 etcd 的完全支持。从 v1.19.1 到 v1.19.4 版本只提供了对嵌入式 etcd 的实验性支持。嵌入式 etcd (HA) 在速度较慢的磁盘上可能会出现性能问题,例如使用 SD 卡运行的 Raspberry Pi。
2、有几个配置标志在所有 server 节点中必须是相同的:
● 与网络有关的标志:–cluster-dns, --cluster-domain, --cluster-cidr, --service-cidr
● 控制某些组件的部署的标志:–disable-helm-controller, --disable-kube-proxy, --disable-network-policy和任何传递给–disable的组件
● 与功能相关的标志:–secrets-encryption
新集群
要在这种模式下运行 K3s,你必须有奇数的 server 节点。我们建议从三个节点开始。
(大于等于3是因为k3s使用了Raft算法来实现一致性,而Raft算法的容崩率为1/3,也就是只要集群中有2/3台机器正常运作,集群就能正常运作,所以3台机器是最低要求;要奇数个结点是因为Raft算法过程中有一个很重要的随机投票选Leader的流程,结点们通过定期投票选举出一个Leader角色,然后其他结点在它的任期内就向他同步数据,这个时候如果结点数是偶数,那么容易出现平票问题,选不出leader,并且,崩溃后集群进行数据恢复过程中,实现一致的方法是多数服从少数,如果是偶数Master结点,且刚好被分割成2个结点规模一样的集团,就没办法恢复数据了,所以需要奇数个结点以避免权力平分问题。)
1、首先启动一个 server 节点,使用cluster-init标志来启用集群,并使用一个标记作为共享的密钥来加入其他服务器到集群中。 SECRET:共享秘钥
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | K3S_TOKEN=SECRET sh -s - server --cluster-init
2、启动第一台 server 后,使用共享密钥将第二台和第三台 server 加入集群。
serverIP:server1的ip端口,例:https://192.168.18.131:6443
servercurl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=SECRET sh -s - --server serverIP
3、有了一个高可用的 controlplane。你可以在 --server 参数中使用任何集群 server,从而加入额外的 server 和 worker 节点。将额外的 worker 节点加入到集群中,步骤与单个 server 集群相同。
4、查询 ETCD 集群状态:
etcd证书默认目录:/var/lib/rancher/k3s/server/tls/etcd # etcd
数据默认目录:/var/lib/rancher/k3s/server/db/etcd
ETCDCTL_ENDPOINTS='https://172.31.12.136:2379,https://172.31.4.43:2379,https://172.31.4.190:2379' ETCDCTL_CACERT='/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt' ETCDCTL_CERT='/var/lib/rancher/k3s/server/tls/etcd/server-client.crt' ETCDCTL_KEY='/var/lib/rancher/k3s/server/tls/etcd/server-client.key' ETCDCTL_API=3 etcdctl endpoint status --write-out=table
5、验证(每个节点的角色都会有etcd)
rebot看集群leader变化
kubectl get nodes
## 看看K3s集群里面有
kubectl get all --all-namespaces
## 集群的视角
kubectl get nodes --output wide
# 查询ETCD集群状态
# etcd证书默认目录:/var/lib/rancher/k3s/server/tls/etcd
# etcd数据默认目录:/var/lib/rancher/k3s/server/db/etcd
## 重启
systemctl restart k3s
## 删除k3s
/usr/local/bin/k3s-uninstall.sh
基于外部数据库mysql搭建
K3s 支持以下数据存储选项
:
● 嵌入式 SQLite
● PostgreSQL (经过认证的版本:10.7 和 11.5)
● MySQL (经过认证的版本:5.7)
● MariaDB (经过认证的版本:10.3.20)
● etcd (经过认证的版本:3.3.15)
外部数据库高可用–mysql
1、创建一个外部数据存储(mysql)
# k3s-db
docker run --name some-mysql --restart=unless-stopped -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7
2、启动 k3s server 节点
mysqlIp:mysql数据库ip、端口
LBIp:负载ip
注意:–tls-san:在 TLS 证书中添加其他主机名或 IP 作为主题备用名称,本例为 LB 的 IP 否则通过 LB IP 连接 k3s api 时将会报错:Unable to connect to the server: x509: certificate is valid for 10.43.0.1, 127.0.0.1, 172.31.2.134, 172.31.2.42, not 172.31.13.97
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | sh -s - server --datastore-endpoint="mysql://root:password@tcp(mysqlIp)/k3s" --tls-san LBIp
3、配置固定的注册地址
Agent 节点需要一个 URL 来注册,你应该在 server 节点前面有一个稳定的 endpoint,不会随时间推移而改变。可以使用许多方法来设置此 endpoint,例如:
● 一个 4 层(TCP)负载均衡器
● 轮询 DNS
● 虚拟或弹性 IP 地址
使用 nginx 作为负载均衡器,将 6443 端口流量转发到 k3s server:
# k3s-lb 节点
cat >> /etc/nginx.conf <<EOF
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
upstream k3s_api {
least_conn;
server 172.31.2.134:6443 max_fails=3 fail_timeout=5s;
server 172.31.2.42:6443 max_fails=3 fail_timeout=5s;
}
server {
listen 6443;
proxy_pass k3s_api;
}
}
EOF
docker run -d --restart=unless-stopped \
-p 6443:6443 \
-v /etc/nginx.conf:/etc/nginx/nginx.conf \
nginx:1.14
4、可选: 加入 Agent 节点
在 HA 集群中加入 agent 节点与在单个 server 集群中加入 agent 节点是一样的。你只需要指定 agent 应该注册到的 URL 和它应该使用的 token 即可。
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | K3S_URL=https://172.31.13.97:6443 K3S_TOKEN=mynodetoken sh -