树莓派上的 K8S 集群挂了,怎么办?

做者 | Lukasz Raczylogit

编译 | 云原生计算编辑部github

 

昨晚在个人树莓派上进行更新的时候,全部节点忽然中止检测网络接口,而且没法恢复!!!docker

 

那时我有两个选择,但都很费时:api

 

方法1:提前起床,并按照我本身以前的文章手动重建,也许还会发现一些改进的余地。我已经亲身试验了不少次:这种方法很容易出错,主要是输入错误或跳过一个或两个步骤,而后在接下来的半个小时试图找出到底发生了什么事,再抹去一切并从头开始一遍又一遍。服务器

 

方法2:及早醒悟并从头开始编码,这样可让个人最终解决方案实现执行一次并永久使用,使整个集群的重建和生产尽量容易地进行复制。固然,这将意味着更多的停机时间。可是,它的好处将是长期的,这使我没必要担忧集群自己,并最终将其视为一个稳定的解决方案,能够向其迁移整个本地基础架构。微信

 

 自动化传奇开始

 

在开始任何工做以前,我都很是专一于基础知识,并提出了在整个过程当中遵循的一些原则。这样建立的环境各部分之间的代码之间逻辑上有不少分隔,所以亲爱的读者,您能够更容易地更改代码或注释掉整个文件以禁用此处或此处的少许功能。网络

 

原则1:在树莓派上设置 Kubernetes 集群能够分为三个部分:设置存储卡,在系统级别上进行节点配置,最后扩展 Kubernetes 资源。架构

 

原则2:在个人旧版 Intel NUC 上运行着一个NFS服务,该服务已链接到 DROBO 存储。很适合将它用做全部节点的永久共享存储。app

 

原则3: 树莓派的集群在个人家庭网络中的 VLAN 中运行,所以保护它不是个人优先事项,全部服务以及节点都应易于访问,而无需处理 credentials。ssh

 

要重现结果(或使其发挥做用),您将须要:

  • Mac:当我有空安装Linux VM时,我可能会在脚本中添加平台监测部分

  • Ansible:我使用的版本为2.10.6

  • Terraform:用0.13.4编写,也适用于0.14.8

  • Make:任意版本应该都可使用

 

 树莓派集群:步骤1

 

树莓派使用存储卡做为其硬盘驱动器。这可能不是最佳选择,而且绝对不会给您最大的读写操做速度,但对于业余爱好项目而言,应该足够了。

 

步骤1须要注意什么?

  • 格式化存储卡

  • 将存储卡分为两个分区-1GB +其他存储卡

  • 将Alpine Linux镜像复制到存储卡上

  • 建立系统覆盖

 

系统覆盖负责设置 Promisc 模式下的 eth0(对于MetalLB来讲是必需的),并配置 SSH 免密登录。

 

重要提示:检查001-prepare-card.sh的来源,请确保刚才插入的存储卡其实是/dev/disk5,不然可能会丢失数据。

 

结果:准备6张存储卡大约须要一分钟。

 

 树莓派集群:步骤2

 

这一步才是真正有趣的开始。我猜你已经把存储卡插入到你的树莓派,链接了全部的电缆(网络和电源),并容许它们启动?你如今须要获取你的设备的 IP 地址——你能够经过链接屏幕到每个设备并执行 ifconfig eth0 或者登陆到你的路由器并检查来实现。用合适的值调整 pi-hosts.txt

 

[masters]pi0 ansible_host=192.168.50.132 # Pi0[workers]pi1 ansible_host=192.168.50.135 # Pi1pi3 ansible_host=192.168.50.60 # Pi3pi4 ansible_host=192.168.50.36 # Pi4pi2 ansible_host=192.168.50.85 # Pi2pi5 ansible_host=192.168.50.230 # Pi5

 

重要提示:从此不多有事情须要 pi0 主机名。

将如下内容添加到~/.ssh/config,强制将全部pi *主机做为根链接。

 

Host pi? User root Hostname %h.local

 

由于咱们已经准备好了微机,因此咱们须要为 Ansible 运行作好准备。使用 001-prepare- anable .sh 脚本能够轻松完成此操做,该脚本将将 ssh 到 pi-hosts 文件中指定的每一个服务器,为NTP配置 chrony 并安装 Python 解释器。

 

重要提示:您可能须要检查 rpi.yaml 文件并根据须要调整vars部分。

成功执行此步骤后,您能够执行 ansible-playbook rpi.yaml -f 10 来运行Ansible,该运行将按如下顺序进行:

 

常见操做:

  • 安装必要的软件包

  • 分区并格式化 RPI 存储卡

  • 将“更大”的分区设置为系统磁盘

  • 添加全部 fstab 条目

  • 提交更改

  • 从新启动树莓派以从“permanent”分区启动

 

KUBEMASTER:

  • 使用 kubeadm 设置主节点

  • 将令牌存储在本地(在static/token_file

  • root 在树莓派上设置能够访问 kubectl 的用户

  • 将 Kubernetes 配置保存在本地(在static/kubectl.conf

 

KUBEWORKER:

  • 将 token 复制到 worker 节点

  • 它使 worker 经过 token 文件加入您的主服务器

  • kubectl.conf复制到 workers 的root用户

 

基本操做:

  • 从  Master 上移除污点,使其参与工做负载

  • 在节点上安装py3-pip,PyYaml和helm

 

若是您还在阅读(恭喜您),您刚刚完成了基本的Kubernetes集群。我相信,这就像执行几个脚本而后等待它们完成同样简单,并且确定比手动方法更好。

 

重要提示:您能够任意屡次运行它。一旦完成,你的存储卡就不会从新格式化。

 

结果:安装6节点的基本 Kubernetes 集群大概须要花费几分钟,具体的时间取决于你的网络连接状态。

 

 

 树莓派集群:步骤3

 

成功执行前两个步骤后,您应该已经准备好将树莓派的集群用于第一个部署。只需不多的基本设置步骤便可使其按需运行,可是请猜想一下……它们也被自动设置,并由 Terraform 来负责。

首先让咱们看一下配置:



# Variables used for barebone kubernetes setupnetwork_subnet = "192.168.50"net_hosts = { adguard = "240" adguard_catchall = "249" traefik = "234" torrent_rpc = "245"}nfs_storage = { general = "/media/nfs" torrent = "/mnt/drobo-storage/docker-volumes/torrent" adguard = "/mnt/drobo-storage/docker-volumes/adguard"}# ENV variable: TRAEFIK_API_KEY sets traefik_api_key# ENV variable: GH_USER, GH_PAT for authentication with private containers

 

您能够看到我正在192.168.50.0/24网络中运行集群,可是默认状况下,MetalLB 将使用地址 200-250 做为网络地址池的“end”。当我有了个人家庭 torrent 服务器和来自Adguard 的 DNS 时,我但愿它们具备特定的地址,连同 Traefik 平衡器为仪表板提供“东西”。

 

重要提示:

nfs_*_path值应与您在步骤2中更新的设置兼容。
确保您的 Kubernetes 配置文件~/.kube/config更新了static/kubernetes.conf的访问细节,我正在使用home-k8s做为上下文名称。

 

Terraforming有什么做用?

  1. 网络
    安装 flannel 和
    host-gw的配置补丁;
    安装 metalLB 并将网络设置为 
    var.network_subnet200–250;

  2. Traefik
    安装 Traefik 代理,并经过 metalLB 负载平衡器将其公开到您的家庭网络。Traefik 仪表板自己能够经过如下方式访问
    traefik.local

 

在树莓派集群上运行的 Traefik 仪表板

 

Adguard

使用 NFS 安装具备持久卷声明的 Adguard DNS 服务;
经过 traefik 公开仪表板,并经过家庭网络中的专用IP公开服务自己,以下所示:adguard.local

 

在树莓派集群上运行的 Adguard Home

 

Prometheus
在全部节点上安装和部署 Prometheus 监控堆栈和 grafana。更新 Prometheus DaemonSet,从而消除了进行卷挂载的必要性。它也经过 traefik 将 grafana 曝光为 grafana.local。默认的 grafana 用户/密码组合为 admin:admin。Grafana 附带一个预装的插件 devopsprodigi - kubegrafi -app,我认为这是用于集群监控的最佳插件。

 

在树莓派集群上运行的 Grafana 仪表板

 

Kubernetes Dashboard
安装 Kubernetes Dashboard 并经过 traefik 将其公开k8s.local

 

在树莓派集群上运行的 Kubernetes 仪表板

 

1.Torrent
使用 Flood Web 界面安装和部署torrent服务器(rTorrent)。经过公开仪表板torrent.local。它使用大量的挂载来存储数据和配置。有一个将复制设置为1的理由:-rTorrent的lock file有问题,而且因为它使用共享目录,所以若是检测到lock file件,它就不会启动。(在个人私有配置中)rTorrent被设置为监听端口23340。

 

2.备份

因为树莓派运行在存储卡上,因为常常读写操做,存储卡可能会磨损,因此我决定在NFS中添加etcd的按期备份。它们天天运行一次,在t erraform 应用的配置下——每一个备份“重量”约为32兆字节。

 

为了使操做更简单,我建立了 Makefile,该文件应该能够帮助您进行设置。您可能须要设置如下环境变量。

 

TRAEFIK_API_KEY // Traefik API keyGH_USER // Github userGH_PAT // Github Personal Access Token

 

重要提示:Github 证书如今尚未使用,但我计划很快添加身份验证,以便从 GHCR 提取私有镜像。

 








ADDITIONAL_ARGS=-var 'traefik_api_key=$(TRAEFIK_API_KEY)' -var "github_user=$(GH_USER)" -var "github_pat=$(GH_TOKEN)"apply: cd infrastructure; terraform apply $(ADDITIONAL_ARGS) -auto-approve -var-file ../variables.tfvarsplan: cd infrastructure; terraform plan $(ADDITIONAL_ARGS) -var-file ../variables.tfvarsdestroy: cd infrastructure; terraform destroy $(ADDITIONAL_ARGS) -var-file ../variables.tfvarsdestroy-target: cd infrastructure; terraform destroy $(ADDITIONAL_ARGS) -var-file ../variables.tfvars -target $(TARGET)refresh: cd infrastructure; terraform refresh $(ADDITIONAL_ARGS) -var-file ../variables.tfvarsinit: cd infrastructure; rm -fr .terraform; terraform initimport: cd infrastructure; terraform import $(ADDITIONAL_ARGS) -var-file ../variables.tfvars $(ARGS)lint:  terraform fmt -recursive infrastructure/

 

 总结

 

全部代码可在 GitHub 上的 lukaszraczylo / rpi-home-cluster-setup 中使用,任何人都可无偿使用和修改)。我还发布了具备支持 ARM64 处理器的多体系结构的定制构建的 docker 映像(rTorrent和Flood)。

 

自动化能够节省时间,节省精力,并且绝对能够完成工做。我常常清除整个集群,并使用前面提到的存储库从头开始构建,以确保它按预期工做。我将保持这篇文章和存储库的最新功能和特性。

 

原文连接:

https://itnext.io/i-broke-my-kubernetes-cluster-running-on-raspberry-pi-355234a24d

重磅!云原生计算交流群成立

 

扫码添加小助手便可申请加入,必定要备注:名字-公司/学校-地区,根据格式备注,才能经过且邀请进群。

了解更多微服务、云原生技术的相关信息,请关注咱们的微信公众号【云原生计算】

相关文章
相关标签/搜索