0

树莓派k3s高可用搭建

 1 year ago
source link: https://www.bboy.app/2022/07/26/%E6%A0%91%E8%8E%93%E6%B4%BEk3s%E9%AB%98%E5%8F%AF%E7%94%A8%E6%90%AD%E5%BB%BA/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

树莓派k3s高可用搭建

2022-07-262022-08-02kubernetes

20220726-1.webp

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:password@tcp(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:pass@tcp(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

下面是我的配置

docker: true
data-dir: /data/k3s
datastore-endpoint: mysql://user:pass@tcp(host:3306)/dbname
no-deploy:
- traefik
- servicelb
token: d41d8cd98998f8427e
kubelet-arg:
- cgroup-driver=systemd
kube-proxy-arg:
- proxy-mode=ipvs

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

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的配置

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK