树莓派安装k3s

简介

看过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会是下面这个状态

1
2
3
4
5
6
7
8
9
10
11
➜  ~ 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会是下面这个状态

1
2
3
4
5
6
➜  ~ 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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"

我加了就下面几句

1
2
3
4
5
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

欢迎关注Bboysoul的博客www.bboy.app
Have Fun

欢迎关注我的其它发布渠道