home-lab Kubernetes 集群流水账

流水账

  • 物理上位于四个地点的五个节点,两个节点位于家中虚拟化平台上、国内腾讯云与阿里云的学生机上各有一个节点、一个节点位于香港的某 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。

解决方法包括两个步骤:

  1. 修改 coredns 自动扩容脚本参数 nodesPerReplica  为 1,这样每个节点都会运行一个 coredns,但此时访问依旧是均衡负载的。
  2. 确保启用集群 feature gate ServiceTopology, EndpointSlice,随后为 kube-dns service 增加限制 topologyKeys 限制,这样默认情况下每个节点只会访问本机的 dns,其次是同区域的,配合上一条,解决了 dns 的问题。
topologyKeys:
  - 'kubernetes.io/hostname'
  - 'topology.kubernetes.io/zone'
  - 'topology.kubernetes.io/region'

急救手册

以下是一些排障帮助,希望对大家有帮助:

  • 如果有功能运行不正常,先检查 system Project 下的组件都是否正常。
  • 注意 MTU 问题,即使在非混合架构下,网络中 MTU 也会因为 ip 隧道等原因变得不再那么规整,有时会导致网络无法访问。