简介
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
但是,我是一个有特殊需求的人,需求如下
- k3s默认使用containerd作为container runtime,但是这边使用docker作为container runtime,因为熟悉了在docker下操作
- 不安装默认的traefik和servicelb,我喜欢使用metalb和nginx
- cgroup-driver使用systemd
- proxy-mode使用ipvs
- 默认和容器等相关的数据目录放在/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