树莓派安装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

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