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。
以我的为例,我将三台树莓派分别命名为rpi1
、rpi2
、rpi3
,其IP固定为如下
rpi1 192.168.6.91 #节点类型:Master
rpi2 192.168.6.92 #节点类型:node
rpi3 192.168.6.93 #节点类型:node
在k8s集群中,节点分为Master
和node
两种,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 -
同时,如果网络有问题,可以参考官方文档使用国内镜像。
此处不直接使用这个脚本,而是预先添加参数,分别在Master
和node
执行
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
那么在rpi2
、rpi3
这两个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_URL
为Master
结点(即这里的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 Dashboard
和Kuboard
的部署。对于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
上,是我们可以通过访问rpi1
(192.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的很多概念,有非常多不理解的地方,对于任务的部署其实还完全不了解,回头理解了再发新的文章介绍。估计要明年发了