K3S高可用集群--基于内嵌etcd搭建 && 基于外部数据库mysql搭建

高可用架构设计

在这里插入图片描述
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 -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值