建立 RKE2 叢集並且安裝 Rancher / istio
目錄
我初期在公司建立地端 Kubernetes 叢集以進行 POC 時,都是使用 kubeadm 這套官方工具進行的 (我早期文章就是基於此撰寫的)。
但是當需要將 Kubernetes 拓展到其他單位時,那相對複雜的安裝與管理方式卻是第一個難以躍過的門檻。
因此,後續改用 RKE2 建立,並且導入 Rancher 進行 Kubernetes 叢集管理。從 2022 年末使用至今,由於我們公司的運用情境相對簡單,因此沒出現太多難以處理的問題。
這篇紀錄我的 RKE2 + Rancher 的安裝命令,主要內容都是依據 iThome Kubernetes Summit 2022 時我參與的 SUSE 工作坊講師提供的資訊進行調整,並適度的加上一些說明。
RKE2 Install
1 運作環境
資訊
OS | Ubuntu 20.04 | |
RKE2 | v1.24.11+rke2r1 | 應配合 Rancher 選擇版本 |
Rancher | v2.7.9 | 應配合 RKE2 選擇版本 |
2 First Node
2.1 download rke2 install file
#預設不給 type 就是 server 了,所以不用特地給 type
#curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="server" sh -
curl -sfL https://get.rke2.io --output install.sh
chmod +x install.sh
2.2 Create RKE2 Config
sudo mkdir -p /etc/rancher/rke2/
cat <<EOF | sudo tee /etc/rancher/rke2/config.yaml
# 主機名稱
node-name:
- "rke2-node-01"
# k8s 各主機溝通用的憑證簽章
tls-san:
- rke2-node-01 # node host
- rke2-node-01.local.vm # node host domain
- rke2-cluster.local.vm # k8s cluster api server domain
- 1.1.1.1 # k8s cluster api server domain 的 vip,看參考資料多半都有設定
#如果要做純 k8s master 的話可已加入以下設定,RKE2 預設是混合 NODE
#node-taint:
# - "CriticalAddinsonly=true:NoExecute"
#以下參數所有 master node 都要相同
# 由於我的環境主要使用 istio,因此關掉 nginx 的 ingress
disable: rke2-ingress-nginx
cni:
- cilium
EOF
2.3 Run Install
sudo INSTALL_RKE2_CHANNEL=v1.24.11+rke2r1 ./install.sh
export PATH=$PATH:/opt/rke2/bin
sudo systemctl enable rke2-server
#這邊執行後會要等一下
sudo systemctl start rke2-server
2.4 Set Config and Kubectl
mkdir .kube
sudo cp /etc/rancher/rke2/rke2.yaml .kube/config
#如果不是用 root 登入的話,需要另外給予權限
#sudo chown rancher .kube/config
sudo cp /var/lib/rancher/rke2/bin/kubectl /usr/local/bin/
2.5 Get rke2 token
資訊
這邊是用來給其他 Master Node 用的,如果只打算建立一台 Master Node,則可以忽略此步驟
sudo cat /var/lib/rancher/rke2/server/token
3 Other Master Node
資訊
基本流程大致一樣,只有 config 會有些許差異,因此此節僅保留差異處
3.1 Create rke2 Config
資訊
config 最大的差異是在第二台以後的 master 都需要加上 token / server 等欄位
sudo mkdir -p /etc/rancher/rke2/
cat <<EOF | sudo tee /etc/rancher/rke2/config.yaml
token: --
#這邊 server 有人用第一台主機的 domain,有人用叢集 domain,只要能連上主要的 master 主機並使用 9345 port 即可
#port 的部分 RKE2 預設使用 9345,但是仍有開通 6443 來供一般使用
server: https://rke2-node-01.local.vm:9345
# 主機名稱
node-name:
- "rke2-node-02"
# k8s 各主機溝通用的憑證簽章
tls-san:
- rke2-node-02 # node host
- rke2-node-02.local.vm # node host domain
- rke2-cluster.local.vm # k8s cluster api server domain
- 1.1.1.1 # k8s cluster api server domain 的 vip,看參考資料多半都有設定
#如果要做純 k8s master 的話可已加入以下設定,RKE2 預設是混合 NODE
#node-taint:
# - "CriticalAddinsonly=true:NoExecute"
#以下參數所有 master node 都要相同
# 由於我的環境主要使用 istio,因此關掉 nginx 的 ingress
disable: rke2-ingress-nginx
cni:
- cilium
EOF
4 uninstall
ubuntu
直接執行 /usr/local/bin/rke2-uninstall.sh
就好,輕鬆愜意,會把所有自訂設定等資料全部清空,所以設定檔記得留備份
centos
直接執行 /usr/bin/rke2-uninstall.sh
就好,輕鬆愜意,會把所有自訂設定等資料全部清空,所以設定檔記得留備份
Istio / Rancher 等其他服務安裝
資訊
由於後續的操作都會需要連上 kubernetes,因此請記得運用 Set Config and Kubectl 章節中的命令將工具與設定檔抓出來
1 Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
2 Helm Repo
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo add jetstack https://charts.jetstack.io
helm repo update
3 istio
資訊
這邊只安裝 istio 的基礎工具,ingress 以及其他配合 rancher 的設定會跟 rancher 的安裝一起進行
kubectl create namespace istio-system
helm install istio-base istio/base -n istio-system --wait
helm install istiod istio/istiod -n istio-system --wait
4 cert-manager
資訊
rancher 官方有說明目前最新版本對於 cert-manager 的版本測試狀況,可依據自己的需求進行相關版本調整
如果網路環境有硬體可以處理外部憑證,可以忽略此套件的安裝,並且在安裝 rancher 時使用外部憑證 (並搭配無憑證設定的 istio ingress)
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.7.1 --wait
5 rancher
資訊
這邊配合前面安裝的 RKE2 版本而使用 2.7.9 的 Rancher
5.1 basic install
kubectl create namespace cattle-system
helm install rancher rancher-stable/rancher --namespace cattle-system --set hostname=my-rancher.local.vm --version 2.7.9
# use external tls
# helm install rancher rancher-stable/rancher --namespace cattle-system --set hostname=my-rancher.local.vm --version 2.7.9 --set external-tls
5.2 set istio
helm install istio-ingressgateway istio/gateway -n cattle-system --wait
sudo mkdir -p ~/istio-setting
cat <<EOF | sudo tee ~/istio-setting/gateway.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: rancher-gateway
namespace: cattle-system
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- my-rancher.local.vm
port:
name: http
number: 80
protocol: HTTP
# 如果是使用外部憑證的話,這邊設定可以省去或是要另外調整
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- my-rancher.local.vm
tls:
# mode: PASSTHROUGH
mode: SIMPLE
credentialName: cattle-system/tls-rancher-ingress
EOF
cat <<EOF | sudo tee ~/istio-setting/virtualservice.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: rancher-vs
namespace: cattle-system
spec:
gateways:
- rancher-gateway
hosts:
- my-rancher.local.vm
http:
- headers:
request:
set:
x-forwarded-proto: https
route:
- destination:
host: rancher.cattle-system.svc.cluster.local
port:
number: 80
# 如果是使用外部憑證的話,這邊設定可以省去或是要另外調整
tls:
- match:
- port: 443
sniHosts:
- my-rancher.local.vm
route:
- destination:
host: rancher.cattle-system.svc.cluster.local
port:
number: 443
EOF
kubectl apply -f ./