Homelab 集群搭建

最近将我的 Homelab 进行了一次完全的更新,从 docker 迁移到了 k3s, 因为随着我的各种服务越来越多,docker 显得有些不足了,而且 k3s 还能做到高可用,何乐而不为呢。

我将我大部分的配置都已经放到了 Github 上,此处基本是搬运自仓库,欢迎参考。

目录:

1. 总览
2. 网络环境配置
3. NAS 配置
4. 虚拟机集群配置
5. K3s 配置
6. 应用配置


1. 总览

为什么要做 Homelab 到集群

之前我的所有服务基本都是跑在 Windows Server 和一个 Ubuntu Server 中的,但是随着东西越来越多,维护也变得愈加麻烦,而且有时候要系统更新,所有的服务就都挂掉了。为了高可用性,我决定采用虚拟机来做集群。

硬件环境

NAS

CPU:  AMD 速龙 200GE
主板: 华硕 B450M PRO
内存: 镁光 4G
硬盘: SSD:   西数  SN550        1TB  NVME           系统, 缓存
      HDD:  东芝  MD04ACA600   6TB  3.5-Inch SATA  校验
      HDD:   西数  WD40EJRX     4T   3.5-Inch SATA  数据
      HDD:   希捷  ST4000VX007  3T   3.5-Inch SATA  数据
网卡: RTL8125B 2.5GbE
      Intel I225 GbE x4
系统: Windows Server 2022 Datacenter (MSDN订阅送的key)

详细内容参考 3. NAS 配置

Server:

主机: Dell PowerEdge R430 1U 服务器
CPU:  Intel(R) Xeon(R) CPU E5-2620 v4
内存: 镁光 RECC 64G
硬盘: SSD:   致钛  SC001        512GB  2.5-Inch SATA  系统,VM
      HDD:   希捷  ST1000LM048  1TB    2.5-Inch SATA  VM
      SMB:   NAS   -            -      -              模板
      ISCSI: NAS   -            1TB    -              模板,VM
系统: VMware vSphere Hypervisor(ESXi Free) 7.0

网络:

路由器: J4125 工控机,Intel I255 GbE NIC x4, OpenWrt R21.11.11自编译Lean源码
交换机: TP-LINK TL-SH1008 2.5G 交换机 8 口
        TP-LINK TL-SG1008D 1G 交换机 8口
网线:   纯手工捏制超 6 类线

详细内容参考 2. 网络环境配置

VM集群及软件

VMs: Debian 11 x3
     Windows Server 2022
     macOS Monterty
     Ubuntu Server 22.04

详细内容参考 4. 虚拟机集群配置


2. 网络配置

路由器是选择的 J4125 工控机,自带 4 个 1GbE 网口,系统是自编译的 Lean Lede

交换机选择了 TP-LINK 22 年新出的 8 口 2.5G 交换机,这是现在能买到的性价比最高的 2.5G 了,不带 VLAN 功能,我选择在路由器上做软件 VLAN
还有一个 8 口 1G 的交换机,暂时没有用到 (2.5G 的还没插满)

老规矩先上网络拓扑图 (可能不太对,没好好学计算机网络):

Network-Topology

然后是openwrt接口图:

Openwrt-Interface


从图中就可以大致看出我的所有配置了。

首先要解决桥接模式下无法访问光猫的问题,要用到静态路由。
添加一个接口 tomodem,协议设置为静态地址,ipv4 地址为 192.168.1.254,不要配置dhcp,物理接口为 wan 口,防火墙区域为wan,然后设置一条 tomodem 的静态路由规则:

接口     对象         掩码             网关           跃点数  MTU   路由类型
tomodem  192.168.1.1  255.255.255.255  192.168.1.254  0       1500  unicast

我在子网中划分了两个vlan,分别是 192.168.2.0/24 和 172.16.2.0/24,ipv6 则是 *:*:*:f150/64 和 *:*:*:f151/64
我的大部分物理设备,包括电脑,手机等等都在 vlan0 里边,而虚拟机及 k3s 集群则是在 vlan2 里边,这样做一是为了环境隔离,二是为了隔离广播域。
再次说一下 openwrt 如何创建软件vlan,只需要在物理端口开启桥接,并在自定义端口中输入类似 eth0,2 这样的格式即可,如果有多个端口,一个一个添加即可。

然后要怎么样去解决服务访问的问题呢,我只想让 vlan0 去访问 vlan2 的服务,但不让 vlan2 去访问 vlan0 中的设备。这里要借助 openwrt 的防火墙。
在防火墙中建立 vlan0,vlan2 两个区域,分别绑定到两个桥接端口中,luci 可以直接设置区域转发,设置一个从 vlan0 到 vlan2 的转发即可。或者也可以在通信规则中手动添加一条转发规则,并在静态路由中添加一条 vlan0 到 vlan2 的路由规则。

这时遇到了一个问题,我要在集群中用 NAS 做存储服务,但是 NAS 在vlan0 中,集群访问不到 NAS。最开始我的办法是添加了一条静态路由,172.16.2.0/24 -> 192.168.2.2,这样确实可以访问了,但是跨网段访问有风险和协议开销,于是我在 NAS 上额外插了一个网卡,并分配了 vlan2 的地址 172.16.2.2,这时 vlan0 和 vlan2 都可以访问到 NAS,而且也是隔离的。

现在的网络环境还有一个很大的问题,我现在只有一个 AP(WIFI),是在 vlan0 网段的,一些智能设备,比如米家,是通过 wifi 去联网的,还有访客网络,这些设备也可以访问到我的私人设备,比如 PC,这是一个巨大的隐患,这些设备应该独立在自己的网段,不能与任何非 IOT 设备交互。等以后搬进新房的时候要解决,独立出一个 vlan-254-iot 网段,一个 vlan-253-guest 网段, 并且在 AP 上配置两个访客网络,一个供智能家居使用,另一个供访客使用,而且不与任何 vlan 网段做转发和路由。


接下来说一下 ESXi 的网络配置。

ESXi 的网络比较简单了,默认的 Management 和 VM Network 不动,VM Network 默认就是 vlan0。新建一个端口组,vlan id 设置为 2,这个是大部分 VM 要用到的端口。
考虑到吞吐量,iSCSI 单独用一个物理接口,新建一个 VMKernel 网卡,绑定到 iSCSI 接口,然后新建一个端口组绑定。在存储-适配器设置下添加软件 iSCSI 适配器,端口绑定到新建的 VMKernel即可。


3. 自搭建 NAS 配置

操作系统选择

NAS 我最终选择了使用 Windows Server 来搭建,原因有几点:

  • RDP 方便管理
  • NTFS 文件系统
  • 自己家的 SMB,速度比其他的不知道高到哪里去了
  • 服务器管理器可以十分方便的设置 SMB/NFS/iSCSI 共享
  • 十分成熟而且稳定的操作系统
  • 买了 MSDN 给的 key 不用白不用

可能有很多人会觉得 Windows 系统不适合做服务器,认为会像 Win10 一样经常崩溃+自动更新。但是作为一个 Windows/.Net 开发程序员,至少在我使用时基本没崩溃过。公司一大批服务也都是用 Windows 或者 Windows Container 部署的。还是要看自己的运维技术 🙂

当然我也尝试了基于 BSD 的 TrueNAS,还有 unraid,ovm,TrueNAS Core 这些基于 Linux 的 NAS 系统。
TrueNAS,使用的是zfs文件系统,需要大容量 ecc 内存支持(再见,我 cpu 不支持)而且我个人十分不喜 ZFS,在家用环境中 ZFS 没有太大的收益,反而大大增加了操作难度。重要数据还是要多重镜像+冷备。

unraid 就是个玩具,不解释,虽然校验做的确实不错。

ovm 还是不错的,可以组软件 RAID,也可以通过 UnionFS 和 SnapRAID 来做条带+校验,但是考虑之后还是选择了 Windows,NTFS 太方便了。

文件系统选择

在 Windows Server 上也只有两种选择

  1. NTFS
  2. REFS

我选择了 NTFS。REFS 是微软 Windows Server 2012上 新推出的文件格式,前几年被 Win10 支持是大家都在讨论,但是后来还是在家用系统中删掉了。在我的理解中 REFS 就是个带校验的 RAID 5,单盘就能做奇偶校验,高科技。而且在数据级别上有更强大的功能,永远不需要做磁盘检查。配合 Windows 的存储池使用更酸爽。

但是缺点也不少,首先最重要的一点,没有数据恢复工具,这也意味着盘坏了数据就全损了,企业和数据中心用 raid 肯定是没问题,但是我是拒绝 raid 的。
其次是我这几块硬盘有一块是从 PC 上薅下来的,上边已经有了十分多的数据,如果换成 REFS 要花费很长时间去迁移数据,主要是NTFS 和 REFS 不支持合并到一起。

因此我最终选择了 NTFS

联合文件系统

Windows 上做联合 FS 的话也有多种方案。

  • 硬件 RAID
    我的 NAS 是有硬件 RAID 卡的,可以做硬件 RAID。但是我也说过了我不喜欢 RAID,于是改成了 HBA 模式。

  • Windows 存储池
    现在改名叫存储空间了。做一个简单的存储池非常方便,UI 上边点一点就 OK 了,RAID 0/1/5 都能够很轻松的做,而且不像 zfs 一样扩容十分麻烦,即插即扩。

    缺点的话,raid 0,条带化导致一块硬盘坏了直接 gg。raid 1,少一半空间,我并不需要这么高的容错率。这两个和 zfs 一样的。raid 5 则是十分的慢,非常慢,尤其是写入.不知道微软做了什么手脚。虽然可以通过加入 SSD 缓存盘来加速写入,但是读取还是慢而且这样要全程 Powershell 操作。

  • 跨区卷
    简单的把每块硬盘都拼接在一起,每块硬盘还可以单独访问文件。但是已经被微软停止支持了,继任者就是存储池。

  • 第三方软件
    StableBit DriverPool,Windows 上只有这一个好用的,类似于 Linux 的 UnionFS 和刚刚说的跨区卷。但是要收费,买断制或者订阅。

我选择了用 StableBit DriverPool。

数据保护

StableBit DriverPool 自带类似于 raid 1 的重复保护,可以做到指定文件同时向 N 块硬盘写入,N 也可以自定义。我把一些重要数据,比如给集群 share 的共享存储,esxi 使用的共享,数据文件夹,备份文件夹,都做了重复保护。这样就算一块挂了也不会丢失,StableBit DriverPool 会将备份继续复制到还存活的硬盘上。
同时 StableBit DriverPool 还支持检测硬盘的 Smart 信息及好坏程度,如果有硬盘即将损坏,他会自动将数据转移出去,这点非常棒。
然后其他非重要数据我是用了 SnapRAID 来做奇偶校验。在校验时排除了已经加了重复保护的数据。然后每过一段时间手动去做一次 sync。不自动 sync 是为了防止硬盘突然挂掉而我还不知道,他自动把数据给 sync 没了。

SnapRAID 配置见此 配置文件


4. 集群服务以及独立服务

K3s 集群

虚拟机配置:

CPU:  4 vCPU
内存: 4 G
硬盘: 120 G SCSI
网卡: VMXNET3
启动: UEFI
系统: Debian 11

我一共配置了 3 台虚拟机来做集群,这样可以很方便的配置 HA。虽然esxi 没有做 HA,因为只有一台服务器。但是尽管只是虚拟机做集群,如果想要升级或者迁移某台机器的时候吗,也可以保证服务不会中断。
K3s 默认的迁移策略是 5 分钟,也就是机器挂掉 5 分钟后才会迁移,所以如果要更改配置的话要手动钱迁移 Pod。
我将 3 台机器都配置成了 Master 和 etcd 节点,感觉在 Homelab 环境下没有太大必要去加 Worker 节点了,除非是 K8s 那种默认 Master 不干活。

另外在这里加一下 Debian 配置静态 ip 的配置文件

auto ens192
allow-hotplug ens192
iface ens192 inet static
    address 172.16.2.11
    netmask 24
    gateway 172.16.2.1
    dns-nameservers 172.16.2.1
    dns-search chiyuki.life

iface ens192 inet6 static
    address *:*:*:f151::0011
    netmask 64
    gateway *:*:*:f151::1
    dns-nameservers *:*:*:f151::1
    dns-search chiyuki.life

其他独立服务

  • Windows Server 一台,用来跑一些不重要的只有 windows 的或者带 gui 的服务。
  • Arch Linux 一台,没啥大用,一般用来做测试,build docker image 等等。
  • Veeam Backup Server(Windows)一台,装了 Veeam 用来备份虚拟机,会定时备份 K3s 集群虚拟机到 NAS 上,这样即使存放 K3s 的硬盘坏掉了也可以从备份恢复。
  • Ubuntu Server 一台, 有一部分服务是用 docker 在上边跑的,在逐步迁移到 K3s。
  • Windows Server 另一台,以前的大部分服务都在上边,在逐步迁移到 K3s。
  • Windows Server 再一台,用来当远程桌面的跳板机

5. K3s 配置

安装 K3s

用以下命令来安装一个支持 IPv4/IPv6 双栈协议的 K3s server,在此启用了内置的 etcd,并禁用掉了自带的 traefik,稍后我们会自行安装 traefik

export token=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 24; echo;)
export ipv4=$(ip -4 a | grep inet | awk -F '[ \t]+|/' '{print $3}' | grep -v ^127.)
export ipv6=$(ip -6 a | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80)

curl -sfL https://get.k3s.io | \
  K3S_TOKEN=${token} sh -s - server \
  --cluster-init --disable traefik \
  --node-ip ${ipv4},${ipv6} \
  --cluster-cidr 10.42.0.0/16,2001:abcd:42:0::/56 \
  --service-cidr 10.43.0.0/16,2001:abcd:42:1::/112
echo "k3s token is ${token}"

安装完成后可以输入 kubectl get nodes 来查看一下节点状态,也可以在输入 kubectl describe nodes 来看一下是否成功的配置好了双栈
接下来要把其他两个机器也安装好 k3s 并加入集群,首先复制下生成的 token,然后在其他机器上安装。在这里我是把三台机器都安装成了 server(master) 节点。

export ipv4=$(ip -4 a | grep inet | awk -F '[ \t]+|/' '{print $3}' | grep -v ^127.)
export ipv6=$(ip -6 a | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80)
curl -sfL https://get.k3s.io | \
  K3S_TOKEN=#生成的token \
  K3S_URL=https://k3s-s01:6443 sh -s - server \
  --disable traefik \
  --node-ip ${ipv4},${ipv6} \
  --cluster-cidr 10.42.0.0/16,2001:abcd:42:0::/56 \
  --service-cidr 10.43.0.0/16,2001:abcd:42:1::/112

然后稍等片刻输入 kubectl get nodes 查看下节点是否都已经 Ready

配置 K3s

复制 config

首先将 config 复制到这里,不然 helm 等工具用不了,写入之后也就不用每次都 sudo 了

echo "export KUBECONFIG=~/.kube/config" >> ~/.zshrc # 我用的zsh
sudo cat /etc/rancher/k3s/k3s.yaml > .kube/config

配置 IPv6 的 NAT

K8s/K3s 的 pods 默认情况下无法直接通过 ipv6 去访问外部网络,也就是说,即使我们配置的是双栈协议,pod 里边的服务也没法去 ping/curl ipv6 地址,ipv6 的用处只是容器内通信和与主机通信。
这里我使用了 ip-masq-agent 这个组件,可以很轻松的实现 ipv6 的 NAT。
这里注意如果直接用官方的 DaemonSet yaml 的话是没有 ipv6 的,默认是禁用的,要手动打开。

curl https://raw.githubusercontent.com/kubernetes-sigs/ip-masq-agent/masq-2-7-0/ip-masq-agent.yaml -o ip-masq-agent.yaml # 注意版本,现在最新的是2.7.0
sed -i '/image: k8s.gcr.io/a \
        args:\
          \-\ \-\-masq-chain=IP\-MASQ\
          \-\ \-\-enable-ipv6=true' \
ip-masq-agent.yaml # 注意空格
kubectl apply -f ip-masq-agent.yaml

配置 SMB 存储

在这里我使用了 csi-driver-smb 这个 csi 驱动
我选择了用 Helm 安装,首先安装 Helm

sudo apt update
sudo apt install -y gpg apt-transport-https
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

通过 Helm 安装

helm repo add csi-driver-smb https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/charts
helm repo update
helm install csi-driver-smb csi-driver-smb/csi-driver-smb --namespace kube-system --version v1.8.0 # 注意版本,现在最新的是1.8.0

创建一个 secret 用来存储账号密码

kubectl create secret generic nas-smb-creds --from-literal username=username --from-literal password="password" --from-literal domain=chiyuki.life

然后创建一个 Storage Class 来替换默认的存储

cat << EOF > sc-smb-default.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sc-smb-default
provisioner: smb.csi.k8s.io
parameters:
  source: "//172.16.2.2/k3s/data/default"
  csi.storage.k8s.io/provisioner-secret-name: "nas-smb-creds"
  csi.storage.k8s.io/provisioner-secret-namespace: "default"
  csi.storage.k8s.io/node-stage-secret-name: "nas-smb-creds"
  csi.storage.k8s.io/node-stage-secret-namespace: "default"
volumeBindingMode: Immediate
reclaimPolicy: Delete
mountOptions:
  - dir_mode=0755
  - file_mode=0644
EOF
kubectl create -f sc-smb-default.yaml
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

配置 Traefik Ingress

使用 Helm 安装 Traefik

helm repo add traefik https://helm.traefik.io/traefik
helm repo update
kubectl create ns traefik
helm install traefik traefik/traefik -n traefik

创建 values.yaml,我们要自定义一下 Traefik

cat << EOF > values.yaml
experimental:
  http3:
    enabled: true

ingressRoute:
  dashboard:
    enabled: false

persistence:
  enabled: true
  name: data
  accessMode: ReadWriteOnce 
  size: 5G
  storageClass: sc-traefik
  path: /data

additionalArguments:
  - "--serversTransport.insecureSkipVerify=true" 
  - "--api.insecure=true" 
  - "--api.dashboard=true" 
  - "--certificatesresolvers.chiyukilife.acme.email=xxx@outlook.com" # 改成你自己的邮箱 以及 acme 名
  - "--certificatesresolvers.chiyukilife.acme.storage=/data/acme.json" 
  - "--certificatesresolvers.chiyukilife.acme.dnschallenge=true" 
  - "--certificatesResolvers.chiyukilife.acme.dnsChallenge.provider=alidns"
  - "--certificatesResolvers.chiyukilife.acme.caServer=https://acme-v02.api.letsencrypt.org/directory" # 正式证书
  # - "--certificatesResolvers.chiyukilife.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory" # 测试证书

ports:
  bt:
    port: 6881
    expose: true
    exposedPort: 6881
    protocol: TCP
  bt-udp:
    port: 6881
    expose: true
    exposedPort: 6881
    protocol: UDP

entryPoints:
  bt:
    address: ':6881'
  bt-udp:
    address: ':6881/udp'

envFrom:
  - secretRef:
      name: traefik-alidns
EOF

说明一下 values.yaml 文件,因为要部署 https,所以需要配置一个 Storage Class,这个下边会讲,然后额外参数要加入 acme 相关的内容,由于我的域名是在阿里云上边的,我直接用了 alidns 的 provider。另外我还额外开放了 6881 的 TCP/UDP 端口,是给 bt/pt 使用的,以及打开了http3(没啥用)

创建 Traefik 的 Storage Class 文件

cat << EOF > sc-traefik.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sc-traefik
provisioner: smb.csi.k8s.io
parameters:
  source: "//172.16.2.2/k3s/data/traefik"
  csi.storage.k8s.io/node-stage-secret-name: "nas-smb-creds"
  csi.storage.k8s.io/node-stage-secret-namespace: "default"
volumeBindingMode: Immediate
reclaimPolicy: Delete
mountOptions:
  - dir_mode=0777
  - file_mode=0600 # 这里要注意,traefik的acme.json文件必须设置为 600 权限,不能是644
  - uid=65532
  - gid=65532
EOF

创建阿里云修改 dns 解析的 accesstoken secret,token 去阿里云生成

kubectl create secret generic traefik-alidns --from-literal ALICLOUD_ACCESS_KEY=key --from-literal ALICLOUD_SECRET_KEY=secret --from-literal ALICLOUD_REGION_ID=cn-beijing -n traefik

然后更新 Traefik

kubectl create -f sc-traefik.yaml
helm upgrade traefik traefik/traefik -n traefik -f values.yaml

完成之后配置一个 Ingress Route 来访问 Traefik 自带的 Dashboard

cat << EOF > dashboard.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: dashboard
  namespace: traefik
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(\&#x60;app.chiyuki.life\&#x60;) && (PathPrefix(\&#x60;/dashboard\&#x60;) || PathPrefix(\&#x60;/api\&#x60;))
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService
  tls: 
    certResolver: chiyukilife
    domains: 
      - main: "*.chiyuki.life"
EOF
kubectl apply -f dashboard.yaml

现在打开 https://app.chiyuki.life/dashboard/ 就可以访问到 Traefik 的 Dashboard 了
接下来配置下 http 到 https 的跳转

cat << EOF > ir-http-redirect.yaml
apiVersion: traefik.containo.us/v1alpha1 
kind: Middleware 
metadata: 
  name: middleware-redirect-https
  namespace: traefik
spec: 
  redirectScheme: 
    scheme: https
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ir-redirect-https-chiyuki-life
  namespace: traefik
spec:
  entryPoints:
    - web
  routes:
    - match: Host(\&#x60;app.chiyuki.life\&#x60;)
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService
      middlewares: 
        - name: middleware-redirect-https
EOF
kubectl apply -f ir-http-redirect.yaml

现在访问 http://app.chiyuki.life/dashboard/ 会直接跳转到 https 下了

配置 kubernetes Dashboard

kubernetes Dashboard 是 K8s 官方自己的面板,虽然正经人都不会用这玩意来做运维,但是光浏览数据的话还不错

按照官方步骤来就行

GITHUB_URL=https://github.com/kubernetes/dashboard/releases
VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml

cat << EOF > rbac.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

cat << EOF > traefik-ingress.yaml
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: strip-kdashboard-path
  namespace: kubernetes-dashboard
spec:
  stripPrefix:
    prefixes:
    - /kdashboard
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-ingress-kdashboard
  namespace: kubernetes-dashboard
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(\&#x60;app.chiyuki.life\&#x60;) && PathPrefix(\&#x60;/kdashboard\&#x60;)
      middlewares:
        - name: strip-kdashboard-path
      kind: Rule
      services:
        - name: kubernetes-dashboard
          port: 443
  tls: 
    certResolver: chiyukilife
    domains: 
      - main: "*.chiyuki.life"
EOF

kubectl create -f rbac.yaml
kubectl apply -f traefik-ingress.yaml

登录 token 获取:

kubectl describe secret admin-user-token -n kubernetes-dashboard | grep '^token'

6. 应用配置

接下来说一下正在使用的一部分 app,基本上我把一个 app 的所有的 config 都写到一个 yaml 文件里了,可以直接 apply -f 。点击 app 可以跳转到我的 Github 页面去查看源码。

其他 app 还在逐步从 Windows 机器迁移,之后会继续更新。

本站原创内容均采用 CC BY-SA 4.0 协议,转载请注明原作者 IllyaTheHath 及本文链接。
Homelab 集群搭建 https://chiyuki.cc/posts/homelab/