Kubernetes 游记之一,多云环境 K3S 集群的搭建

2021-10-8|2022-12-28
Vaayne
Vaayne
category
password
date
Oct 8, 2021 07:07 AM
icon
slug
status
tags
summary
type

系统架构

 
架构图
架构图

硬件

 
  1. 家里的 HPE Gen10 Plus 高配 32G
    1. 使用 ESXI 作为底层系统
    2. ESXI 虚拟化安装 TruaNAS 管理磁盘,作为 NFS/SMB Server
    3. ESXI 还虚拟出多个 Ubuntu Server 作为 Kubernetes 的 Worker Node
  1. 华为云的 2H4G 作为 Ingress Node因为有备案,所有的入站流量都会走这台机器进入集群内部
  1. 腾讯云的轻量 2H4G 作为 Master Node

网络

 
  1. 华为云的机器和腾讯云的机器本身有公网 IP
  1. 家里的 NAS 没有公网 IP,所有在 NAS 和 华为云,腾讯云机器上都安装 Tailscale 组建局域网
  1. NAS 里的 Tailscale 使用了 Subnet Router 模式,这样只需要在一个节点上安装,Tailscale 集群的其他Node 就能访问 NAS 里的所有 Node 了
 
最终的效果是
  • 华为云,腾讯云互相访问,以及 NAS 访问华为云,腾讯云使用公网 IP
  • 华为云,腾讯云访问 NAS 上安装了 Tailscale 的节点(A)使用 Tailscale 内网 IP (100.x.y.x)
  • 华为云,腾讯云访问 NAS 上没有安装 Tailscale 的其他节点(B,C,...),会先访问到安装了 Tailscale 的节点(A), 再由 A 中转到对应的节点(B,C,...)

开始搭建集群

 
集群安装参照官方文档,里面有国内镜像安装

Master Node

 

安装命令

 
INSTALL_K3S_EXEC 就是自定义安装的一些参数,详情参考 K3s Server 配置参考
  • --docker 用 docker 代替 containerd
  • --no-deploy traefik 不部署 traefik 作为默认的 ingress
  • --tls-san \"$IP\" 在 TLS 证书中添加其他主机名或 IP 作为主题备用名称, 这是为了其它的 node 使用 IP 加入的时候不报错
  • --write-kubeconfig-mode 664 使生成的 kubeconfig 文件可以使用
  • --node-external-ip \"$IP\" 设定 master node 的 external ip
  • --advertise-address \"$IP\" 设定其它 node 加入时使用的 IP
  • --node-name master 设定 node name
  • --flannel-backend wireguard 可选,使用 wireguard 作为 flannel 的后端,如果设置这个选项,需要提前在每个 node 上都安装 wireguard
  • --service-cidr \"10.42.0.0/16\" --cluster-dns \"10.42.0.10\" 将 K8S service 的 IP 网段,以及对应的 DNS 设置成和 Pod IP 一个网段 10.42.0.0/16,详情参考 K3s Server 配置参考 | Rancher文档 。手动设定这个是因为,在没有设置这个之前,我发现 wireguard 只设置的 Pod 的网段为可以连接的内网网段即 10.42.0.0/16, 但是 Service CIDR网段 10.43.0.0/16 不能通信。
  • --node-label=flannel.alpha.coreos.com/public-ip-overwrite=$IP" 覆盖默认的 external IP,不设置这个,会 Node 间连通不了
 

检查安装状态

如何访问集群,请参考 集群访问 | Rancher文档

获取 Worker 加入的 Token

当 Master Node 安装完成之后,准备安装 Worker Node
 

Ingress Node

 
Note:
  • 不一定要有一个单独的 Ingress Node,这边有是因为我在这个机器有备案,域名解析到这个节点最方便
  • Ingress Node 也可以同时是 Master Node,只需要加上对应的 label 就行
 
这边 Ingress 是一个单独的 Node,有自己的公网 IP,本身也是作为集群里面的 Worker

安装命令

  • MASTER_IP 就是 master node 的公网 IP
  • INGRESS_IP ingress 节点的公网 IP
  • --node-external-ip \"$INGRESS_IP\" 设定 external IP,后面创建 LoadBalancer 或者 NodePort service 时会使用
  • --node-ip \"$INGRESS_IP\"" 设定 node ip,如果不设置,会节点之间连通不了
  • --node-name ingress 设定 node name
 

检查安装状态

 

设置只有 Ingress Node 可以接收 ingress 流量

首先查看官方文档 网络 | Rancher文档
 
如何让 Ingress 入站流量都走 ingress node 呢
  1. 域名的 DNS 都需要解析到这台机器
  1. 集群的 ingress 需要监听这台机器的 80,443 端口
 
根据 官方文档 进行设置, master 节点进行操作,或者集群外操作
这样,只有设置了这个 label 的节点才能创建 LB,才能接收外部流量
 
 

Worker Nodes

 
worker node 的安装类似

安装命令

检查安装状态

 

Post Install

安装完成之后,需要先查看集群状态,保证一切正常,再进行下一步。

查看节点状态

所有的节点都安装完成之后,可以再次查看集群的状态,查看每个节点的状态
 

测试集群连通性

参考官方文档 Rancher Docs: Networking,进行测试
首先 apply DaemonSet
待安装完成,运行下列的脚本进行测试
检查测试结果
 
 

基本组件的安装

这里会安装一些基础组件,完善这个 K3S 集群

Storage

 
正如前文所讲,这个集群使用 NAS 里面 TrueNAS 提供的 NFS Server 作为集群的 Storage Provider
 
所有使用
nfs-subdir-external-provisioner
kubernetes-sigsUpdated Aug 29, 2023
来提供 Storage Class,方便后续创建 PV 和 PVC
 

Example

安装完成之后,创建 PV 的例子
 

监控

 
# TODO
 
ESXI 安装 OpenWrt 作为旁路由AutoScaling in Kubenetes