流水账
- 物理上位于四个地点的五个节点,两个节点位于家中虚拟化平台上、国内腾讯云与阿里云的学生机上各有一个节点、一个节点位于香港的某 IDC,
etcd
节点在家中。 - 整个内网三层互通,家中虚拟化平台上两个节点,通过位于内网的转发节点与其他节点通过
zerotier
虚拟网络通信。 - 集群搭建使用了 rancher 作为管理平台,在内网配置完成后,在各个节点依次启动 agent,完成集群建设。
- CNI 选择了
calico
在原本三层互通的结构下直接 bgp 路由完成内部连接。 - ingress 使用了
traefik
,部署使用了daemonset
在所有节点提供服务。 - 储存选择了 nfs,在家中黑群晖上暴露了整个网段可读写的 nfs 共享盘,再使用 catalog 里的 nfs-client-provisioner 即可,注意如果你也使用了
synology
,权限 Squash 一定要选择no mapping
否则权限问题会影响很多应用。 - 在集群外部搭建了 influxdb 用于储存一些 metric 信息。
踩坑
docker 镜像拉取过慢
甚至分不清是否是集群启动脚本出错,解决方案推荐使用 ailyun 的容器镜像加速,国内其他云服务商则换成服务商自己的镜像源。
calico 内部 ip 识别错误
因为我的集群家中节点需要直接使用以太网 ip,而其他节点需要使用 zerotier
的 ip,同时外网 ip 也确实可以联通,需要限制 calico
的 ip 选择。通过下面的命令可以限制 calico
使用可以通信的那个 ip。
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=can-reach=your_internal_ip
默认 coredns 配置不合适
coredns
默认情况下只会有少量节点,不适合我们的分(qiong)散(guang)式(dan)集群,至少产生三个问题:跨境查询 dns 性能下降、国内特色 dns 污染影响外国节点、每个节点不能选择最快的 CDN。
解决方法包括两个步骤:
- 修改
coredns
自动扩容脚本参数nodesPerReplica
为1
,这样每个节点都会运行一个coredns
,但此时访问依旧是均衡负载的。 - 确保启用集群
feature gate
ServiceTopology
,EndpointSlice
,随后为 kube-dns service 增加限制topologyKeys
限制,这样默认情况下每个节点只会访问本机的 dns,其次是同区域的,配合上一条,解决了 dns 的问题。
topologyKeys:
- 'kubernetes.io/hostname'
- 'topology.kubernetes.io/zone'
- 'topology.kubernetes.io/region'
部署的服务
- mysql 提供数据库
- phpmyadmin 方便改数据库
- cert-manager DNS 记录签野卡
- code-server 用于快速修改配置的
- gitea 私有化 git 服务
- drone 私有化 ci 服务
- baget 私有化 nuget
- grafana 时序数据可视化
- ghost blog(当前)
- calibre-web 电子书管理
- rooftop-simulator 虚拟货币 k 线 telegram bot
- ron-data-collect 聚合币安币价实时数据
推荐资源
急救手册
以下是一些排障帮助,希望对大家有帮助:
- 如果有功能运行不正常,先检查
system
Project 下的组件都是否正常。 - 注意 MTU 问题,即使在非混合架构下,网络中 MTU 也会因为 ip 隧道等原因变得不再那么规整,有时会导致网络无法访问。