Kubernetes 游记之一,多云环境 K3S 集群的搭建
2021-10-8|2022-12-28
Vaayne
category
password
date
Oct 8, 2021 07:07 AM
icon
slug
status
tags
summary
type
系统架构硬件网络开始搭建集群Master Node安装命令检查安装状态获取 Worker 加入的 Token Ingress Node安装命令检查安装状态设置只有 Ingress Node 可以接收 ingress 流量Worker Nodes安装命令检查安装状态Post Install查看节点状态测试集群连通性基本组件的安装StorageExample监控
系统架构
硬件
- 家里的 HPE Gen10 Plus 高配 32G
- 使用 ESXI 作为底层系统
- ESXI 虚拟化安装 TruaNAS 管理磁盘,作为 NFS/SMB Server
- ESXI 还虚拟出多个 Ubuntu Server 作为 Kubernetes 的
Worker Node
- 华为云的 2H4G 作为
Ingress Node
,因为有备案,所有的入站流量都会走这台机器进入集群内部
- 腾讯云的轻量 2H4G 作为
Master Node
网络
- 华为云的机器和腾讯云的机器本身有公网 IP
- 家里的 NAS 没有公网 IP,所有在 NAS 和 华为云,腾讯云机器上都安装 Tailscale 组建局域网
- 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 呢
- 域名的 DNS 都需要解析到这台机器
- 集群的 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
所有使用 来提供 Storage Class,方便后续创建 PV 和 PVC
nfs-subdir-external-provisioner
kubernetes-sigs • Updated Aug 29, 2023
Example
安装完成之后,创建 PV 的例子
监控
# TODO