简介
看过k3s架构的同学应该会知道怎么实现k3s的高可用,在1.0.0之前k3s是原生不支持高可用的,如果你要做到高可用,那么就只能自己搭建一个高可用的外部数据库,然后让k3s连接这个外部的高可用数据库来实现k3s的高可用,但是k3s在1.0.0之后实现了自己的高可用,他的高可用是使用自己内部的DQLite来实现的,但是这种高可用方式还是处于测试阶段,我尝试了很多次还是有一些bug的,所以为了简单可控,我就不使用高可用的方法在树莓派上安装k3s了
架构
我一共有4个树莓派,所以一个是master其他都是worker节点
主
- 10.10.10.10
从
- 10.10.10.13
- 10.10.10.11
- 10.10.10.12
修改主机名
首先要修改主机名
hostnamectl set-hostname rpi-k8s-master1.bboysoul.com
其他节点一样我其他节点的主机名是rpi-k8s-slave1.bboysoul.com
禁用ipv6
vim /boot/cmdline.txt
ipv6.disable=1
关闭swap
vim /etc/rc.local
加上
dphys-swapfile swapoff
把所有节点FORWARD链设置成accept
iptables -P FORWARD ACCEPT
这步十分的重要,如果不做会导致worker 节点的pods 访问不了master 节点的apiserver
安装k3s
之后就是安装k3s
下载k3s
wget https://github.com/rancher/k3s/releases/download/v1.0.0/k3s-armhf
移动并且重命名
mv k3s-armhf /usr/local/bin/k3s && chmod +x /usr/local/bin/k3s
检查系统是否符合要求
k3s check-config
如果出现iptables版本不符合,请先忽略,我们继续
上面两步四个节点都要操作
之后再master节点启动
nohup k3s server --kube-apiserver-arg service-node-port-range=1-30000 --docker &
为了方便管理我使用的是docker作为容器管理的工具,默认k3s使用的是containerd,还有设置了apiserver的端口范围
master节点启动完成没问题之后启动worker节点上的k3s
首先找到NODE_TOKEN,NODE_TOKEN存储在master节点上的
cat /var/lib/rancher/k3s/server/node-token
这个文件下
之后启动
nohup k3s agent --server https://k3s.bboysoul.com:6443 --token K1089f376f5bc64458d8b19f42bdcaf7035547cce846406026994d1ed8b4fa68d16::server:02d0845746cdb75b9ee3e9a8b8146595 --docker &
注意一定要给你的master节点设置一个dns解析,我的是k3s.bboysoul.com这个域名
当主从节点全部启动完成之后你执行k3s kubectl get pods -A
会是下面这个状态
➜ ~ k3s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system helm-install-traefik-lfdv8 0/1 Completed 0 16h
kube-system svclb-traefik-wsxrj 3/3 Running 0 16h
kube-system svclb-traefik-cttnn 3/3 Running 0 16h
kube-system svclb-traefik-nn7kz 3/3 Running 0 16h
kube-system traefik-65bccdc4bd-8w245 1/1 Running 0 16h
kube-system coredns-d798c9dd-2vnr2 1/1 Running 1 16h
kube-system local-path-provisioner-58fb86bdfd-6664n 1/1 Running 1 16h
kube-system metrics-server-6d684c7b5-2vbc4 1/1 Running 0 16h
kube-system svclb-traefik-vrlnz 3/3 Running 0 16h
执行k3s kubectl get nodes
会是下面这个状态
➜ ~ k3s kubectl get nodes
NAME STATUS ROLES AGE VERSION
rpi-k8s-slave3.bboysoul.com Ready <none> 16h v1.16.3-k3s.2
rpi-k8s-slave1.bboysoul.com Ready <none> 16h v1.16.3-k3s.2
rpi-k8s-slave2.bboysoul.com Ready <none> 16h v1.16.3-k3s.2
rpi-k8s-master.bboysoul.com Ready master 17h v1.16.3-k3s.2
确定没问题了之后我们优化下k3s自带的traefik
vim /var/lib/rancher/k3s/server/manifests/traefik.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: traefik
namespace: kube-system
spec:
chart: https://%{KUBERNETES_API}%/static/charts/traefik-1.77.1.tgz
set:
rbac.enabled: "true"
ssl.enabled: "true"
serviceType: "NodePort"
service.nodePorts.http: "80"
service.nodePorts.https: "443"
dashboard.enabled: "true"
dashboard.domain: "traefik.bboysoul.com"
metrics.prometheus.enabled: "true"
kubernetes.ingressEndpoint.useDefaultPublishedService: "true"
我加了就下面几句
serviceType: "NodePort"
service.nodePorts.http: "80"
service.nodePorts.https: "443"
dashboard.enabled: "true"
dashboard.domain: "traefik.bboysoul.com"
一个是使用NodePort这个service 第二个是设置nodeport的端口,我就直接80和443了,最后是把dashboard打开然后设置访问dashboard的域名是traefik.bboysoul.com
接着执行下这个文件
k3s kubectl apply -f /var/lib/rancher/k3s/server/manifests/traefik.yaml
欢迎关注我的博客www.bboy.app
Have Fun