---
# System prepended metadata

title: Exsi 與 Pfsense 的Rke2群集建立 (包含對外分流負載)
tags: [pfsense, Exsi, rke2, Public]

---

---
title: 'Exsi 與 Pfsense 的Rke2群集建立 (包含對外分流負載)'
disqus: hackmd
---

Exsi 與 Pfsense 的Rke2群集建立 (包含對外分流負載)
===
此方案主要為說明在Exsi(Single Host)上透過pfsense建置基礎的網絡環境並建置Rke2的k8s開發群集，建置群集後開需相關對應的相關服務安裝機制(主要用於針對團隊的使用服務安裝使用)。

## 注意事項
* 由於僅一台實體伺服器Exsi系統，因此Master僅設定1個，其餘均為Worker(3個)
* 此安裝說明不包含Rancher管理的應用系統，僅rke2的群集基礎部屬服務參考，Rancher的管理應用將獨立於其他文件內來做為說明參考。
* 在這裡的分流負載主要以連線者的來源IP做分流，使不同IP來源間的使用者可以在不同的節點上連線，但是同一個來源IP的每次連線均可在同一個節點上(避免發生的連線session資訊不同)

## 索引

[TOC]

## 虛擬機相關設定

帳號密碼 ubuntu:ubuntu

### 虛擬機類別
此類別xlarge與2xlarge主要參考公有雲AWS上EC2運算優化大小清單，而採用運算優化是因為此系統採用分散式的區塊儲存型態(會需要大量CPU運算來做分散式區塊運算)

:warning: pfSense防火牆同時兼顧DNS、LoadBalancer外，也可選擇性的作為OpenVPN(VPN)、IPSec(VPN)、Suricata(入侵檢測系統)來防護外部虛擬機與群集應用的網路安全。<- 選擇性的部分要按照實際需求來決定是否需要額外安裝。

| 類別 | vCPU | 記憶體 | 硬碟大小 | 備註 |
| -------- | -------- | -------- | -------- | -------- |
| pfSense防火牆 | 8vCPU | 8 | 64G | 用於網路分流附載與HA | 
| 運算優化(xlarge) | 4 | 8 | 120G | 儲存可SAS或HDD，資金足夠的話可再之後換成SSD |
| 運算優化(xlarge) | 4 | 8 | 240G | 儲存可SAS或HDD，資金足夠的話可再之後換成SSD |
| 運算優化(2xlarge) | 8 | 16 | 480G | 儲存可SAS或HDD，資金足夠的話可再之後換成SSD |
| 運算優化(2xlarge) | 8 | 16 | 960G | 儲存可SAS或HDD，資金足夠的話可再之後換成SSD |

### 虛擬機OS安裝配置(建議最低可運作，但是後續可以無損升級到下一階段)
:warning: 下方是若Master在一般SAS或是HDD儲存狀況則建議僅部屬1個即可XD，因為Master若三個但是在讀寫IO不足的狀況下群集系統會直接掛掉XDDD

| 主機角色 | 類別 | 最小數量 | 擴增數量 | 備註 |
| -------- | -------- | -------- | -------- | -------- |
| 維護與管理容器(Master) | 運算優化(xlarge) | 1 | 奇數倍數增加 | 硬碟大小可以是64G即可，但是建議用SSD |
| 容器應用附載 | 運算優化(xlarge) | 3 | 持續+1按照需求增加 | 提供網路分流附載與主要資料儲存 |

### 虛擬機OS安裝配置(最小方向建議1)
:warning: 此參考建議主要是考慮到Gitlab與Harbor支援物件儲存的形式會有較大儲存需求。
:warning: 下方是若Master在一般SAS或是HDD儲存狀況則建議僅部屬1個即可XD，因為Master若三個但是在讀寫IO不足的狀況下群集系統會直接掛掉XDDD

| 主機角色 | 類別 | 最小數量 | 硬碟大小 | 擴增數量 | 備註 |
| -------- | -------- | -------- | -------- | -------- |  -------- |
| 維護與管理容器(Master) | 運算優化(xlarge) | 1 | 64G |奇數倍數增加 | 硬碟大小可以是64G即可，但是建議用SSD |
| 容器應用附載 | 運算優化(2xlarge) | 3 | 480* 3 |持續+1按照需求增加 | 提供網路分流附載與主要資料儲存 |

### 虛擬機OS安裝配置(最小方向建議2)
:warning: 此參考建議主要是考慮到Gitlab與Harbor支援物件儲存的形式會有較大儲存需求。
:warning: 下方是若Master在一般SAS或是HDD儲存狀況則建議僅部屬1個即可XD，因為Master若三個但是在讀寫IO不足的狀況下群集系統會直接掛掉XDDD

| 主機角色 | 類別 | 最小數量 | 硬碟大小 | 擴增數量 | 備註 |
| -------- | -------- | -------- | -------- | -------- | -------- |
| 維護與管理容器(Master) | 運算優化(xlarge) | 1 | 64G |奇數倍數增加 | 硬碟大小可以是64G即可，但是建議用SSD |
| 容器應用附載 | 運算優化(xlarge) | 6 | 240G* 6 或是120* 6 | 持續+1按照需求增加 | 提供網路分流附載與主要資料儲存 |

### 虛擬機OS安裝配置(B30f當前，混合式按照需求調整擴增)
B30f由於需要嚴格管理儲存空間使用，因此虛擬機大小採用滾動式調整

| 主機角色 | 類別 | 當前數量 | 備註 |
| -------- | -------- | -------- | -------- |
| 維護與管理容器(Master) | 運算優化(xlarge) | 1 | 這裡沒有SSD所以1個 |
| 容器應用附載 | 運算優化(xlarge) | 4 | 持續+1按照需求增加 | 提供網路分流附載與主要資料儲存 |
| 容器應用附載 | 運算優化(2xlarge) | 2 | 持續+1按照需求增加 | 提供網路分流附載與主要資料儲存 |

![](https://i.imgur.com/yez3YEW.png)

主要以單一Master與6個worker

| 虛擬機名稱 | 虛擬機HOSTNAME | 註解 | 目前狀態 |
| -------- | -------- | -------- | -------- |
| Rke2群集架構整合(非HA) | rke2-master | 這裡負責主要k8s元件 | READY |
| Rke2群集架構-Worker1 | rke2-worker | 這裡負責分擔Ingress與其他相關應用服務部屬 | READY |
| Rke2群集架構-Worker4 | rke2-worker4 | 這裡負責分擔Ingress與其他相關應用服務部屬 | READY |
| Rke2群集架構-Worker5 | rke2-worker5 | 這裡負責分擔Ingress與其他相關應用服務部屬 | READY |
| Rke2群集架構-Worker6 | rke2-worker6 | 這裡負責分擔Ingress與其他相關應用服務部屬 | READY |
| Rke2群集架構-Worker8 | rke2-worker8 | 這裡負責分擔Ingress與其他相關應用服務部屬 | READY |
| Rke2群集架構-Worker9 | rke2-worker9 | 這裡負責分擔Ingress與其他相關應用服務部屬 | READY |

![](https://i.imgur.com/wmhd7jd.png)
![](https://i.imgur.com/lmlnL8I.png)
![](https://i.imgur.com/6kf5qyw.png)
![](https://i.imgur.com/G5wOikx.png)
![](https://i.imgur.com/aOLdhew.png)
![](https://i.imgur.com/aZp3rUi.png)

### 虛擬機網路固定配置

![](https://i.imgur.com/VoS7Ymf.png)
![](https://i.imgur.com/BZknVRB.png)

| IP位址 | MAC位址 | HOST NAME | CPU排程相似 | CPU共用 |
| ----- | ------ | -------- | -------- | -------- |
| 192.168.30.7  | 00:0c:29:fe:cf:80 | rke-master   | 44,45,46,47 | 高 |
| 192.168.30.13 | 00:0c:29:a1:4f:c7 | rke2-worker5 | 20,21,22,23 | 正常 |
| 192.168.30.12 | 00:0c:29:37:c6:3d | rke2-worker4 | 24,25,26,27 | 正常 |
| 192.168.30.11 | 00:0c:29:b3:b3:55 | rke2-worker3 | 28,29,30,31 | 正常 |
| 192.168.30.10 | 00:0c:29:c3:51:ce | rke2-worker2 | 32,33,34,35 | 正常 |
| 192.168.30.9  | 00:0c:29:b6:48:bc | rke2-worker1 | 36,37,38,39 | 正常 |
| 192.168.30.8  | 00:0c:29:a1:4f:c7 | rke2-worker  | 40,41,42,43 | 正常 |

:warning: 請注意虛擬機host-name不可重複

### 設定Master網絡

![](https://i.imgur.com/wmerXp8.png)
![](https://i.imgur.com/OKCkF18.png)
![](https://i.imgur.com/iGQ8B6B.png)
![](https://i.imgur.com/RTzTPjY.png)

* 監控 
![](https://i.imgur.com/mfbpZf1.png)

### 安裝Master

```
sudo mkdir -p /etc/rancher/rke2/
sudo nano /etc/rancher/rke2/config.yaml
```

* config.yaml內容

```plantuml
@startyaml
node-name: rke2-master
token: 1qaz2wsx3edc    
tls-san:
  - rke2.b30f.systex.com
  - rke2.b30f.systex.192.168.30.5.nip.io
  - rke2.b30f.systex.192.168.30.5.xip.io
node-taint:
  - "CriticalAddonsOnly=true:NoExecute"
@endyaml
```

* 驗證與測試tls可用
```
ping rke2.b30f.systex.com
ping rke2.b30f.systex.192.168.30.5.nip.io
ping rke2.b30f.systex.192.168.30.5.xip.io
```

### 安裝Worker
```
sudo mkdir -p /etc/rancher/rke2/ && \
sudo nano /etc/rancher/rke2/config.yaml
```

#### worker0 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker0
server: https://rke2.b30f.systex.com:9345
token: 1qaz2wsx3edc
@endyaml
```

#### worker1 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker1
server: https://rke2.b30f.systex.com:9345
token: 1qaz2wsx3edc    
@endyaml
```

#### worker2 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker2
server: https://rke2.b30f.systex.192.168.30.5.nip.io:9345
token: 1qaz2wsx3edc    
@endyaml
```

#### worker3 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker3
server: https://rke2.b30f.systex.192.168.30.5.nip.io:9345
token: 1qaz2wsx3edc    
@endyaml
```

### worker4 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker4
server: https://rke2.b30f.systex.192.168.30.5.nip.io:9345
token: 1qaz2wsx3edc    
@endyaml
```

### worker5 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker5
server: https://rke2.b30f.systex.192.168.30.5.nip.io:9345
token: 1qaz2wsx3edc    
@endyaml
```

### worker6 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker6
server: https://rke2.b30f.systex.192.168.30.5.nip.io:9345
token: 1qaz2wsx3edc    
@endyaml
```

### worker7 config.yaml內容

```plantuml
@startyaml
node-name: rke2-worker7
server: https://rke2.b30f.systex.192.168.30.5.nip.io:9345
token: 1qaz2wsx3edc    
@endyaml
```

## 開始進行安裝前檢測
```
nslookup rke2.b30f.systex.192.168.30.5.nip.io
```

### 管理與存取群集
此方法僅供參考，建議在後續安裝Rancher管理介面並以該介面進行k8s的服務管理。

* (在root)模式安裝後
`cp /etc/rancher/rke2/rke2.yaml /home/ubuntu/kubeconfig`


```
export KUBECONFIG=/home/ubuntu/kubeconfig
## 測試
kubectl get pods --all-namespaces
helm ls --all-namespaces
```

### 設定對外網路流量的分流負載
![](https://i.imgur.com/jJefooQ.png)
![](https://i.imgur.com/ICzBQum.png)
![](https://i.imgur.com/NyXK2PV.png)
![](https://i.imgur.com/bLVn7qR.png)
這裡顯示Worker共計三個節點，會按照來源使用者的IP來源來進行各節點網路流量的分流負載。
![](https://i.imgur.com/ALn4kny.png)
用於使用者網路流量分流的k8s節點
![](https://i.imgur.com/pIEmja0.png)
以使用者來源IP來進行分流
![](https://i.imgur.com/Es4TPaI.png)
以基本的Socket檢測來檢測各k8s節點的健康狀況，(這樣如果有節點關機或掛掉的話，系統也會馬上就關閉掉該節點的對外網路服務流量，確保使用者僅可連線到健康的k8s節點)
:warning: 預設每秒檢測一次節點的ingress服務健康狀況

## Longhorn分散式儲存機制
![](https://i.imgur.com/Kgjx2Il.png)

## 主機汰除紀錄
| Rke2群集架構-Worker1 | rke2-worker1 | 這裡負責分擔Ingress與其他相關應用服務部屬 | 已汰除 |
| Rke2群集架構-Worker2 | rke2-worker2 | 這裡負責分擔Ingress與其他相關應用服務部屬 | 已汰除 |
| Rke2群集架構-Worker3 | rke2-worker3 | 這裡負責分擔Ingress與其他相關應用服務部屬 | 已汰除 |
| Rke2群集架構-Worker5 | rke2-worker7 | 這裡負責分擔Ingress與其他相關應用服務部屬 | 底層儲存異常 |

## Reference and FAQ
* [rke2 quickstart](https://docs.rke2.io/install/quickstart/)

:::info
**Find this document incomplete?** Leave a comment!
:::

###### tags: `Public` `rke2` `Exsi` `pfsense`
