k8s折腾笔记——树莓派集群安装k3s

写在前面

上个月和班主任聊天,知道了k8s(Kubernetes),瞬间来了折腾的兴趣。脑子一热买了三台树莓派4B。
由于其对初心者及其不友善的特点,断断续续拖了一个月,昨天刚弄好。
想到博客万年没更新了,来写一下。

封面图来自:画师JW —— 人总分不清梦境与现实。

前置准备

硬件准备

  • 电脑一台(系统随意)
  • 树莓派4B*3(我的是4GB的版本)
  • 交换机
  • 网线*4(树莓派连交换机3根,交换机连路由器1根)
  • SD卡*3(我是64GB的闪迪)
  • 鞋盒*1

此处树莓派供电我用的是绿联的三个快充头,以保证充足的供电。
有买亚克力的架子,组装后大概如下

软件

  • 各系统自带终端(用于ssh连接树莓派)
  • Debian-Pi-Aarch64 ★ 全新树莓派64位系统 项目地址
  • balenaEtcher – 一个跨平台镜像烧录工具(Mac、Windows、Linux)官方网址
  • 各种k8s相关的软件

注意:接下去的内容能够正常使用的前提是要有“良好的网络环境”,例如要能顺畅地pull到dockerHub上的镜像,否则将有极大概率无法完成安装!

系统设置

这里使用的是Debian-Pi-Aarch64 ★ 全新树莓派64位系统的基础版无桌面镜像,烧录进SD卡后插电开机
默认账户:pi,默认密码:raspberry
首先需要找到树莓派的IP地址,可以登录路由器后台查看。建议知道地址后将其固定下来,不固定也没事,之后会将其设置为静态IP。
以我的为例,我将三台树莓派分别命名为rpi1rpi2rpi3,其IP固定为如下

rpi1    192.168.6.91    #节点类型:Master
rpi2    192.168.6.92    #节点类型:node
rpi3    192.168.6.93    #节点类型:node

在k8s集群中,节点分为Masternode两种,Master节点是集群中负责调度任务等工作的控制面节点,node是工作节点。后续向集群中添加应用程序时,会由Master将任务指派给node
接下去的内容默认是在root用户下执行,请使用sudo -i将用户变更为root并设置root用户密码

更改主机名

首先要把三台主机的主机名更改回来(此处仅以rpi1为例)
ssh连接rpi1这里有两个文件内容要更改,第一个是/etc/hosts

vim /etc/hosts

将文件中的

127.0.0.1   raspberry

更改为

127.0.0.1   rpi1

第二个文件是/etc/hostname
将内容改为rpi1即可。其他两台操作相同

更改网络设置

打开配置文件

vim /etc/network/interfaces

将文件内容修改为如下(此处依旧以rpi1为例,如果你的网段与我不同,请更改为自己的网段!请勿照抄)

auto eth0
allow-htoplug eth0

iface eth0 inet static
address 192.168.6.91
netmask 255.255.255.0
gateway 192.168.6.1
dns-nameservers 114.114.114.114

接着将三台机器的IP地址添加到/etc/hosts文件中,并重启网络

sudo cat >> /etc/hosts << EOF
192.168.6.91 rpi1
192.168.6.92 rpi2
192.168.6.93 rpi3
EOF

service networking restart 

修改ssh设置

默认情况下,这个镜像是不允许直接使用root账号连接的,为了方便省事,需要允许直接使用root账号进行ssh连接

vim /etc/ssh/sshd_config

进入配置文件,将

#PermitRootLogin prohibit-password

修改为

PermitRootLogin yes

并重启服务

service sshd restart

打开IPv4转发

vim /etc/sysctl.conf

将文件中的这行注释去掉

net.ipv4.ip_forward = 1

关闭防火墙

sudo /usr/sbin/iptables -P FORWARD ACCEPT

关闭一些服务

systemctl stop NetworkManager.service
systemctl disable NetworkManager.service

安装常用软件

sudo apt-get install -y net-tools lrzsz tree screen lsof tcpdump

启用docker

systemctl enable docker.service #开机自动启动Docker服务
systemctl start docker.service #启动Docker服务

关闭Swap

直接注释掉,简单粗暴

sed -ri 's/.swap./#&/' /etc/fstab

至此,系统配置已全部完成
重启一遍系统后,正式开始集群的部署

sudo reboot

集群部署

从这里开始,才算进入正片。由于k8s对于树莓派而言有点过于臃肿了(主要部署起来太折腾了),所以我使用的是k3s

k3s脚本安装

对于没有网络问题的同学可以直接使用官方脚本进行安装,(请注意不要直接复制下面这行命令,我们需要加上相关参数执行!)

curl -sfL https://get.k3s.io | sh -

同时,如果网络有问题,可以参考官方文档使用国内镜像。
此处不直接使用这个脚本,而是预先添加参数,分别在Masternode执行

Master机执行

Master机脚本如下

curl -sfL https://get.k3s.io |  K3S_NODE_NAME=rpi1 sh -

如果网络有问题请在命令中添加参数INSTALL_K3S_MIRROR=cn,以使用国内镜像
此处K3S_NODE_NAME为指定此机器在集群中的名字,为方便识别这里设置为和主机名rpi1一样的名字。
等待执行完后,需要获取Token,给后续添加进集群的机器使用。请保存好这个Token,接下去要用到。

cat /var/lib/rancher/k3s/server/node-token #获取rpi1的Token

node机执行

前面我们在Master机获取到了Token,假设它为

K107dfc82a8d9453e538b26dd3250757827356a276ae509c3158b60ec3238e7929f::server:bac90b26fc5t6b2c76a8ee1bc22291cc

那么在rpi2rpi3这两个node节点上的执行命令为

curl -sfL https://get.k3s.io |  K3S_NODE_NAME=rpi2 K3S_URL=https://192.168.6.91:6443 K3S_TOKEN=K107dfc82a8d9453e538b26dd3250757827356a276ae509c3158b60ec3238e7929f::server:bac90b26fc5t6b2c76a8ee1bc22291cc sh - #这个命令在rpi2上执行

curl -sfL https://get.k3s.io |  K3S_NODE_NAME=rpi3 K3S_URL=https://192.168.6.91:6443 K3S_TOKEN=K107dfc82a8d9453e538b26dd3250757827356a276ae509c3158b60ec3238e7929f::server:bac90b26fc5t6b2c76a8ee1bc22291cc sh - #这个命令在rpi3上执行

参数K3S_URLMaster结点(即这里的rpi1结点),参数K3S_TOKEN填入上面的Token
如果网络有问题请在命令中添加参数INSTALL_K3S_MIRROR=cn,以使用国内镜像

回到Master机查看集群状态

kubectl get nodes

如果没有问题将会看到如下显示,三个结点都已在集群中,并已ready

NAME   STATUS   ROLES                  AGE   VERSION
rpi2   Ready    <none>                 32h   v1.21.5+k3s2
rpi3   Ready    <none>                 32h   v1.21.5+k3s2
rpi1   Ready    control-plane,master   32h   v1.21.5+k3s2

使用以下命令查看pods是否已正常运行

kubectl get pods -A 

基本如下所示就是正常的

NAMESPACE              NAME                                         READY   STATUS      RESTARTS   AGE
kube-system            local-path-provisioner-5ff76fc89d-pd7rd      1/1     Running     0          32h
kube-system            coredns-7448499f4d-dlwqx                     1/1     Running     0          32h
kube-system            helm-install-traefik-crd-lpgwj               0/1     Completed   0          32h
kube-system            helm-install-traefik-gqrr9                   0/1     Completed   1          32h
kube-system            svclb-traefik-rrwqk                          2/2     Running     0          32h
kube-system            traefik-97b44b794-h2rqp                      1/1     Running     0          32h
kube-system            svclb-traefik-49gc9                          2/2     Running     0          32h
kube-system            svclb-traefik-nltmk                          2/2     Running     0          32h

至此k3s的安装也就告一段落了。

安装一些管理应用

到目前为止,k3s还只能在命令行使用,由于其复杂程度非常不利于初心者的使用,对于学习来说,快速开始使用是挺重要的,这里介绍Kubernetes DashboardKuboard的部署。对于k8s集群来说,部署任务只需要在Master机上执行即可,Master节点会向node节点指派任务。所以以下操作均是在Master机上执行的(在我的集群中是rpi1

安装Kubernetes Dashboard

执行以下命令

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

执行完后需要等待一段时间,集群拉取镜像和指派任务需要一点时间
可以通过以下命令查看部署情况

watch kubectl get pods -n kuboard

如果为ready则说明已经部署完成了

NAME                                         READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-78c79f97b4-v9565        1/1     Running   0          32h
dashboard-metrics-scraper-856586f554-z8nz5   1/1     Running   0          32h

使Kubernetes Dashboard在集群外部可用

在部署完成后,在Master机上执行kubectl proxy可以使其在Master机上访问(地址) ,但这对于我们来说是不够的。大公司可以用带桌面的系统,在机房中直接操作Master机,但平穷如我只能使用无桌面镜像的树莓派组集群,所以我们至少要让它暴露在集群外,至少在局域网下可以使用。
此时就需要对其配置进行修改。执行以下命令

kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort","ports":[{"port":443,"targetPort":8443,"nodePort":30443}]}}'

这个命令的意义在于让Kubernetes Dashboard的端口暴露在nodePort(节点端口)30443上,是我们可以通过访问rpi1192.168.6.91)的30443端口,执行完后,就可以通过访问 https://192.168.6.91:30443 使用Kubernetes Dashboard了。


但是!
但是由于目前集群使用的是自签名的ssl证书,对于浏览器而言是不受信任的,还无法直接访问。对于Firefox浏览器而言可以配置例外情况进行访问,而Google Chrome呢,它没给我们选项怎么办?
不用怕,其实Google Chrome有留“秘籍”!
点击以下页面的空白处,然后在键盘上敲thisisunsafe并回车就可以访问!非常有Google的风格。

登录使用Kubernetes Dashboard

Kubernetes Dashboard提供了两种登录方式,一种是Token,另一种是Kubeconfig。这里我只说Token的方法。
执行以下命令

cd /var/lib/rancher/k3s/server/manifests/ #进入/var/lib/rancher/k3s/server/manifests/目录
#创建并向dashboard-adminuser.yaml写入内容
cat > dashboard-adminuser.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard  
EOF

然后通过以下命令获取到Token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

将输出的Token填写在网页中即可。接下去就可以开始使用了

安装Kuboard

看了Kubernetes Dashboard的安装以及进入Kubernetes Dashboard的页面后是不是感觉还是很麻烦?是不是觉得看到一大堆各种各样的洋文无从下手?没错,我也这么觉得。所以这里我们安装Kuboard便我们之后的使用。 不过这里就不在k8s中部署了,而是直接在rpi1上使用docker部署。这里只介绍docker`上的部署,其他的方式请参阅官方文档

部署Kuboard镜像

在rpi1上执行以下命令

docker run -d \
  --restart=unless-stopped \
  --name=kuboard \
  -p 60080:80/tcp \
  -p 60081:10081/tcp \
  -e KUBOARD_ENDPOINT="http://192.168.6.91:60080" \
  -e KUBOARD_AGENT_SERVER_TCP_PORT="60081" \
  -v /root/kuboard-data:/data \
  eipwork/kuboard:v3.3.0.0-arm64

参数KUBOARD_ENDPOINT中的地址为之后Web界面的访问地址,命令中的各部分可根据实际需求自由替换,详情参阅官方文档
部署完成之后直接访问 http://192.168.6.91:60080 即可开始使用。比官方的Kubernetes Dashboard属实方便多了。
Kuboard的默认用户名:admin,默认密码:Kuboard123
现在开始,你也可以使用反向代理、内网穿透、端口映射等手段让管理界面在公网上可用。

添加集群

当我们完成了上面的设置,并不代表我们可以直接使用Kuboard对集群进行管理,还需要在设置中添加集群。
Kuboard提供了两种方法

这里我们选择agent的方式
填写名称和描述,其他默认,直接点确定,然后根据提示在Master机执行命令即可,基本无脑点确定就行,非常方便。
集群导入成功后即可开始使用

后话

为了玩这个真的投入了不少时间和金钱,确实折腾人。目前还没搞懂k8s的很多概念,有非常多不理解的地方,对于任务的部署其实还完全不了解,回头理解了再发新的文章介绍。估计要明年发了

参考文章


k8s折腾笔记——树莓派集群安装k3s
https://blog.xianyu.one/2021/11/16/Linux/tutorial/k8s-install/
作者
咸鱼
发布于
2021年11月16日
许可协议