树莓派k3s高可用搭建

简介

k3s的搭建其实还是比较简单的,k3s出第一个版本的时候我就关注了,现在过去很多年了,文档什么都很完善了。如果想在家里长期稳定的运行一个k8s,k3s是一个完美的解决方案,尤其是当你用树莓派或者其他arm设备去跑的时候。

操作

k3s 高可用支持两种方式

  • 使用外部数据库(pgsql.mysql,mariadb,etcd)
  • 使用内部的嵌入式数据库(etcd)

这里我们使用外部的mysql作为高可用的数据库,原因是我不想再搭建一个数据库了,反正又不是不能用。

如果在搭建的过程中你犯了一些错误,可以随时使用下面这个脚本来卸载节点中的k3s

/usr/local/bin/k3s-uninstall.sh

接着我们准备四台虚拟机

  • k3s-1
  • k3s-2
  • k3s-3
  • k3s-4

如果你没有什么特殊的需求的话可以直接使用官方的脚本去安装k3s

curl -sfL https://get.k3s.io | sh -s - server \
  --token=SECRET \
  --datastore-endpoint="mysql://username:[email protected](hostname:3306)/database-name"

这里的token可以随机生成一个,我的操作是随便touch一个文件

touch a

然后拿他的md5

md5sum a

但是,我是一个有特殊需求的人,需求如下

  1. k3s默认使用containerd作为container runtime,但是这边使用docker作为container runtime,因为熟悉了在docker下操作
  2. 不安装默认的traefik和servicelb,我喜欢使用metalb和nginx
  3. cgroup-driver使用systemd
  4. proxy-mode使用ipvs
  5. 默认和容器等相关的数据目录放在/data/k3s下面

东搞西搞所以安装命令就变成下面这样了

curl -sfL https://get.k3s.io | sh -s - server   \
--token=d41d8cd98998f8427e   \
--datastore-endpoint="mysql://user:[email protected](host:3306)/dbname" \
--no-deploy traefik servicelb \
--data-dir /data/k3s \
--docker true\
--kubelet-arg cgroup-driver=systemd \
--kube-proxy-arg proxy-mode=ipvs

因为要使用docker,所以每台机器都要安装上docker

wget get.docker.com && bash index.html

systemctl start docker && systemctl enable docker

docker安装完成之后,就可以在三台主节点里面去执行安装命令了。

当然k3s还支持你把配置放在

/etc/rancher/k3s/config.yaml

这样当你要修改一些配置的时候,或者已经安装了k3s,想要卸载traefik的时候,直接修改这个文件就可以了,而不用去修改

/etc/systemd/system/k3s.service

下面是我的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
docker: true
data-dir: /data/k3s
datastore-endpoint: mysql://user:[email protected](host:3306)/dbname
no-deploy:
  - traefik
  - servicelb
token: d41d8cd98998f8427e
kubelet-arg:
  - cgroup-driver=systemd
kube-proxy-arg:
  - proxy-mode=ipvs

在三台主节点安装完k3s之后使用下面的命令去加入一个从节点

1
2
3
4
5
6
7
curl -sfL https://get.k3s.io | sh -s - agent \
  --token=d41d8cd98998f8427e \
  --server=https://k3samd64.bboysoul.cn:6444 \
  --data-dir /data/k3s \
  --docker true \
  --kubelet-arg cgroup-driver=systemd \
  --kube-proxy-arg proxy-mode=ipvs

和所有的k8s高可用一样,我的apiserver使用nginx做了4层的负载均衡,所以有了下面这个域名,然后dns解析ip到nginx就好了

k3samd64.bboysoul.cn

nginx的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
stream {
    upstream k3samd64 {
        server 10.10.100.18:6443;
        server 10.10.100.19:6443;
        server 10.10.100.20:6443;
    }
    server {
        listen 6444;
        proxy_pass k3samd64;
    }
}

加入完成之后可以看所有的节点是不是都完成了

Every 2.0s: kubectl get nodes                                                                                                                                                                                k3s-1: Thu Jul 14 13:53:01 2022

NAME    STATUS   ROLES                  AGE     VERSION
k3s-3   Ready    control-plane,master   4m40s   v1.23.8+k3s2
k3s-2   Ready    control-plane,master   4m39s   v1.23.8+k3s2
k3s-1   Ready    control-plane,master   4h31m   v1.23.8+k3s2
k3s-4   Ready    <none>                 49s     v1.23.8+k3s2

查看已经部署的pods

Every 2.0s: kubectl get pods -A                                                                                                                                                                              k3s-1: Thu Jul 14 13:53:21 2022

NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   coredns-d76bd69b-qqbt9                    1/1     Running   0          4h30m
kube-system   metrics-server-7cd5fcb6b7-t4dvc           1/1     Running   0          4h30m
kube-system   local-path-provisioner-6c79684f77-f86tf   1/1     Running   0          4h30m

欢迎关注我的博客 www.bboy.app

Have Fun