「K3S」- 搭建,高可用,嵌入式数据库

  CREATED BY JENKINSBOT

问题描述

在低资源的环境中,我们需要部署 Kubernetes 集群,最后我们选择 K3S 服务(轻量级的 Kubernetes 集群)。

该笔记将记录:在 Linux 中,如何部署高可用 K3S 集群,以及常见问题解决办法。

解决方案

选择 K3S 原因(毫无正经原因):
1)安装 Ubuntu Server 时候,推荐应用有 K3S 服务;
2)我们使用 Rancher 服务,而 K3S 为 Rancher Lab 出品;

选择内嵌数据库(etcd)的原因:
1)外置数据库需要做高可用:我们不想做 MySQL 高可用;

关于高可用,之前我们一直存在错误理解:
1)我们一直以为三个 Master 节点需要通过 VIP 才能实现高可用,这是错误的;
—- 实际上 VIP 是提供给 Worker 进行连接的,提供唯一且稳定的 Master 地址;
3)另外 TLS SAN 需要包含该 VIP 的原因是:
—- 当 VIP 漂移到节点后,通过 VIP 访问时要求 TLS 包含该 VIP 地址;
—- 如果使用四层负载均衡,就不存在该问题,因为最终请求的仍旧是特定节点地址;

准备工作

准备工作便是阅读官方文档,形成对于该设施的基本认识,明确工作流程:
1)快速部署单节点集群:Quick-Start Guide
2)通过内嵌数据库的高可用架构:
—- High-Availability K3s Server with an External DB
—- High Availability with Embedded DB

环境信息

k3s-lb, 172.21.251.10, 四层负载均衡

# 鉴于使用 etcd 数据库,所以需要奇数个节点
# 这与 Kubernetes 类似
k3s-m1, 172.21.251.11, Master 01, 1vCPU/1G/10G
k3s-m2, 172.21.251.12, Master 02, 1vCPU/1G/10G
k3s-m3, 172.21.251.13, Master 03, 1vCPU/1G/10G

# 根据负载,增加自己需要的节点数量
k3s-w1, 172.21.251.21, Master 04
k3s-w2, 172.21.251.22, Master 05
k3s-w3, 172.21.251.23, Master 06

集群部署

第一步、创建主节点

操作节点:k3s-m1,k3s-m2,k3s-m3

# 创建首个主节点,k3s-m1
curl -sfL https://get.k3s.io \
    | bash -s - server --cluster-init

# 查看口令,k3s-m1
cat /var/lib/rancher/k3s/server/node-token

# 添加其他主节点,k3s-m2,k3s-m3
curl -sfL https://get.k3s.io                \
    | K3S_TOKEN="K102bff5f862c3f62c8557680b08c8f3f3c2ce31d1eb7fa2446d03ad0169446885f::server:47008ed9da39fff2bf71f470a375d101" \
      bash -s - server --server https://172.31.251.11:6443

第二步、部署负载均衡

操作节点:k3s-lb

# cat /etc/nginx/nginx.conf 
stream {
    upstream k3s_servers {
        server 172.31.251.11:6443;
        server 172.31.251.12:6443;
        server 172.31.251.13:6443;
    }
    server {
        listen 6443;
        proxy_pass k3s_servers;
    }
}

第三步、添加工作节点

操作节点:k3s-w1,k3s-w2,…

curl -sfL https://get.k3s.io                \
    | K3S_URL=https://172.31.251.10:6443    \
      K3S_TOKEN="K102bff5f862c3f62c8557680b08c8f3f3c2ce31d1eb7fa2446d03ad0169446885f::server:47008ed9da39fff2bf71f470a375d101" \
      sh -

第四步、查看当前节点

# k3s kubectl get nodes -o wide
NAME     STATUS   ROLES                       AGE    VERSION        INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
k3s-m1   Ready    control-plane,etcd,master   176m   v1.22.6+k3s1   172.31.251.11   <none>        Ubuntu 20.04.3 LTS   5.4.0-99-generic   containerd://1.5.9-k3s1
k3s-m2   Ready    control-plane,etcd,master   128m   v1.22.6+k3s1   172.31.251.12   <none>        Ubuntu 20.04.3 LTS   5.4.0-99-generic   containerd://1.5.9-k3s1
k3s-m3   Ready    control-plane,etcd,master   107m   v1.22.6+k3s1   172.31.251.13   <none>        Ubuntu 20.04.3 LTS   5.4.0-99-generic   containerd://1.5.9-k3s1
k3s-w1   Ready    <none>                      47m    v1.22.6+k3s1   172.31.251.21   <none>        Ubuntu 20.04.3 LTS   5.4.0-99-generic   containerd://1.5.9-k3s1
k3s-w2   Ready    <none>                      15s    v1.22.6+k3s1   172.31.251.22   <none>        Ubuntu 20.04.3 LTS   5.4.0-99-generic   containerd://1.5.9-k3s1

相关链接

Setting up a HA Kubernetes cluster using K3S
Why is kubeadm config’s controlPlaneEndpoint necessary?