0%

[Rancher 系列文] - 安裝第一套 Rancher

前言

本篇文章將會示範如何使用 Rke + Helm 來搭建一個基於 RKE 叢集的 Rancher 服務。
該 RKE 叢集會有三個節點,因此環境方面就會準備三台 VM,這三台 VM 前面就會架設一個 Load-Balancer 來幫忙將流量導向後方服務。
同時也會準備一個 rancher.hwchiu.com 的 DNS 紀錄,這樣之後存取時會更為簡單與方便。

環境準備

接下來的環境都會基於 Azure 雲端環境來使用,包含了 VMs 與 LoadBalancer 的設定
本文章不會探討 Azure 雲端該如何使用,事實上讀者可以使用任意的公有雲服務,甚至是地端機器都可。
下述為相關的軟體版本資訊

  • VM: Azure VM
  • OS: Ubuntu 20.04.2 LTS
  • Rke: v1.2.11

整個架構如圖下

Imgur

整個環境的概念如下

  1. 準備三個 VM,這些 VM 本身都沒有任何 Public IP,同時這三個 VM 會作為 RKE 叢集裡面的節點。
  2. 準備一個 Load-Balancer,該 Load-Balancer 未來會將流量都導向前述三個 VM,包含 Rancher UI/API 等相關流量
  3. 為了方便安裝 RKE 到前述三個節點,會額外準備一個 management server,該伺服器可以透過 ssh 存取前述三台 VM
  4. 我們會於 Management server 上透過 RKE 指令來安裝 RKE 叢集。

建置 Rancher

整個安裝步驟會分成下列步驟,如

  1. 環境檢查並且於 Management server 下載安裝 rke 指令
  2. 於 Management server 透過 rke 指令來安裝 rke 叢集到 Server{1,2,3}
  3. 透過 Helm 將 Rancher 安裝到該 RKE 叢集中
  4. 嘗試透過瀏覽器存取 Rancher 服務

環境檢查並且於 Server1 下載安裝 rke

這個步驟一開始我準備了下列環境

  1. Management Server 以及 Server{1,2,3}
    • Management Server 能夠透過 ssh 存取 server{1,2,3}
  2. LoadBalancer
    • backend pool 設定 server{1,2,3}
    • 轉發 80/443
  3. Domain Name (rancher.hwchiu.com)
    • 該 domain name 指向該 LoadBalancer 的 public IP。

透過 SSH 登入到 Management Server 之後,我們要來安裝 rke 這個指令。
官方 Github 上面有針對不同平台的安裝檔案,我的環境需要使用的 rke_linux-amd64

1
2
wget https://github.com/rancher/rke/releases/download/v1.2.11/rke_linux-amd64
sudo install -m755 rke_linux-amd64 /usr/local/bin/rke

安裝完畢後可以直接嘗試使用看看 rke 這個指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[email protected]:~$ rke
NAME:
rke - Rancher Kubernetes Engine, an extremely simple, lightning fast Kubernetes installer that works everywhere

USAGE:
rke [global options] command [command options] [arguments...]

VERSION:
v1.2.11

AUTHOR:
Rancher Labs, Inc.

COMMANDS:
up Bring the cluster up
remove Teardown the cluster and clean cluster nodes
version Show cluster Kubernetes version
config Setup cluster configuration
etcd etcd snapshot save/restore operations in k8s cluster
cert Certificates management for RKE cluster
encrypt Manage cluster encryption provider keys
util Various utilities to retrieve cluster related files and troubleshoot
help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:
--debug, -d Debug logging
--quiet, -q Quiet mode, disables logging and only critical output will be printed
--trace Trace logging
--help, -h show help
--version, -v print the version

同時確認該 management server 可以使用 ssh 連結到上述 Server{1,2,3}

1
2
3
4
5
6
[email protected]:~$ ssh 10.0.0.10 "hostname"
rke-serve000004
[email protected]:~$ ssh 10.0.0.8 "hostname"
rke-serve000002
[email protected]:~$ ssh 10.0.0.7 "hostname"
rke-serve000001

接者也要確認上述 server{1,2,3} 都安裝好 docker 並且當前非 root 使用者可以執行,因為 rke 會需要透過 docker 去創建基本服務。

1
2
3
4
5
6
[email protected]:~$ ssh 10.0.0.7 "docker ps "
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[email protected]:~$ ssh 10.0.0.8 "docker ps "
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[email protected]:~$ ssh 10.0.0.10 "docker ps "
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

透過 rke 於 Server1 安裝 rke 叢集

接下來使用 rke 的指令來創建 rke 創建叢集,首先要讓 rke 指令知道我們有三台伺服器,同時這些伺服器要登入的 IP/SSH Uername 以及相關的 k8s 角色,我們需要準備一個 cluster.yaml 作為設定檔案。

首先透過 rke 指令確認當前支援的 kubernetes 版本

1
2
3
4
5
[email protected]:~$ rke config --list-version --all
v1.17.17-rancher2-3
v1.19.13-rancher1-1
v1.18.20-rancher1-2
v1.20.9-rancher1-1

當前支援最高的版本是 v1.20.9-rancher1-1,所以準備一個下列的 cluster.yaml,其描述了

  1. 三台伺服器的 IP 以及 ssh 角色名稱
  2. 每個角色都要扮演 k8s controlplane, k8s worker 以及 etcd.
  3. network 使用 calico 作為 CNI
  4. 啟動 etcd 並且啟動自動備份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cluster_name: ithome-rancher
kubernetes_version: "v1.20.9-rancher1-1"
nodes:
- address: 10.0.0.7
user: azureuser
role: [controlplane,worker,etcd]
- address: 10.0.0.8
user: azureuser
role: [controlplane,worker,etcd]
- address: 10.0.0.10
user: azureuser
role: [controlplane,worker,etcd]
services:
etcd:
backup_config:
enabled: true
interval_hours: 6
retention: 60
network:
plugin: flannel

準備好上述檔案後,透過 rke up 來創建 cluster

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[email protected]:~$ rke up --config cluster.yaml
INFO[0000] Running RKE version: v1.2.11
INFO[0000] Initiating Kubernetes cluster
INFO[0000] [certificates] GenerateServingCertificate is disabled, checking if there are unused kubelet certificates
INFO[0000] [certificates] Generating admin certificates and kubeconfig
INFO[0000] Successfully Deployed state file at [./cluster.rkestate]
INFO[0000] Building Kubernetes cluster
INFO[0000] [dialer] Setup tunnel for host [10.0.0.8]
INFO[0000] [dialer] Setup tunnel for host [10.0.0.10]
INFO[0000] [dialer] Setup tunnel for host [10.0.0.7]
INFO[0000] [network] Deploying port listener containers
INFO[0000] Pulling image [rancher/rke-tools:v0.1.77] on host [10.0.0.7], try #1
INFO[0000] Pulling image [rancher/rke-tools:v0.1.77] on host [10.0.0.8], try #1
INFO[0000] Pulling image [rancher/rke-tools:v0.1.77] on host [10.0.0.10], try #1
....
INFO[0284] [dns] DNS provider coredns deployed successfully
INFO[0284] [addons] Setting up Metrics Server
INFO[0284] [addons] Saving ConfigMap for addon rke-metrics-addon to Kubernetes
INFO[0284] [addons] Successfully saved ConfigMap for addon rke-metrics-addon to Kubernetes
INFO[0284] [addons] Executing deploy job rke-metrics-addon
INFO[0301] [addons] Metrics Server deployed successfully
INFO[0301] [ingress] Setting up nginx ingress controller
INFO[0301] [addons] Saving ConfigMap for addon rke-ingress-controller to Kubernetes
INFO[0301] [addons] Successfully saved ConfigMap for addon rke-ingress-controller to Kubernetes
INFO[0301] [addons] Executing deploy job rke-ingress-controller
INFO[0306] [ingress] ingress controller nginx deployed successfully
INFO[0306] [addons] Setting up user addons
INFO[0306] [addons] no user addons defined
INFO[0306] Finished building Kubernetes cluster successfully

RKE已經正式創建完畢,當前目錄下會產生一個 KUBECONFIG 的目錄,檔案名稱為 “kube_config_cluster.yaml”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[email protected]:~$ mkdir .kube
[email protected]:~$ install -m400 kube_config_cluster.yaml ~/.kube/config
[email protected]:~$ kubectl get nodes
[email protected]:~$ sudo chmod 400 .kube/config
[email protected]:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.0.0.10 Ready controlplane,etcd,worker 10m v1.20.9
10.0.0.7 Ready controlplane,etcd,worker 10m v1.20.9
10.0.0.8 Ready controlplane,etcd,worker 10m v1.20.9
[email protected]:~$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx default-http-backend-6977475d9b-xrmv9 1/1 Running 0 9m34s
ingress-nginx nginx-ingress-controller-bl7p9 1/1 Running 0 9m34s
ingress-nginx nginx-ingress-controller-g476g 1/1 Running 0 9m34s
ingress-nginx nginx-ingress-controller-nqlqv 1/1 Running 0 9m34s
kube-system calico-kube-controllers-7ddcfb748f-tvnkp 1/1 Running 0 10m
kube-system calico-node-f42dt 1/1 Running 0 10m
kube-system calico-node-gsn8f 1/1 Running 0 10m
kube-system calico-node-p98tx 1/1 Running 0 10m
kube-system coredns-55b58f978-7j85f 1/1 Running 0 9m36s
kube-system coredns-55b58f978-l4smb 1/1 Running 0 10m
kube-system coredns-autoscaler-76f8869cc9-t2s6f 1/1 Running 0 9m58s
kube-system metrics-server-55fdd84cd4-m96ql 1/1 Running 0 9m43s
kube-system rke-coredns-addon-deploy-job-7l8zs 0/1 Completed 0 10m
kube-system rke-ingress-controller-deploy-job-pjvns 0/1 Completed 0 9m36s
kube-system rke-metrics-addon-deploy-job-ddct7 0/1 Completed 0 9m55s
kube-system rke-network-plugin-deploy-job-gprzz 0/1 Completed 0 10m

Install Rancher

前述篇章透過 rke 的指令創建了一個基於三節點的 Kubernetes 叢集,接下來我們要透過 Helm 指令將 Rancher 給安裝到我們的 RKE 之中。

再次提醒,針對 Rancher v2.5 與之後的版本請使用 Helm v3 來安裝,官方已經不再支援使用 Helm v2,如果你舊版的 Rancher 是使用 Helm v2 安裝然後想要將其升級到 Rancher v2.5 系列,則必須要先針對 Helm v2 -> Helm v3 進行轉移。
轉移的方式可以參考 [Helm Plugin helm-2to3](https://github.com/helm/helm-2to3),官方頁面有介紹詳細的用法,注意使用前先對所有 helm 的檔案進行備份以免不熟悉釀成不可恢復的情況

第一步先將 Rancher 官方的 Helm Repo 給加入到 Helm 清單中,官方提供三種不同的 Helm Repo 供使用者使用,包含

  1. Latest: https://releases.rancher.com/server-charts/latest
  2. Stable: https://releases.rancher.com/server-charts/stable
  3. Alpha: https://releases.rancher.com/server-charts/alpha

根據不同的需求採用不同的版本,如果不是 Rancher 開發者的話,我認為 Alpha 沒有使用的需求,而 Latest 則是讓你有機會可以嘗試目前最新的版本,看看一些新功能或是一些舊有 Bug 是否有被移除。大部分情況下推薦穩穩地使用 stable 版本,遇到問題也比較有機會被解決。

本次安裝將採用 stable 作為來源版本

1
2
3
4
5
6
[email protected]:~$ helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
"rancher-stable" has been added to your repositories
[email protected]:~$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "rancher-stable" chart repository
Update Complete. ⎈Happy Helming!⎈

要安裝 Rancher 之前,有一個要處理的東西就是所謂的 SSL 憑證,官網有提供不同選項的教學,主要可以分成

  1. Rancher 自簽憑證
  2. 自行準備憑證
  3. 透過 Let’s Encrypt 獲得的憑證

為了後續連線順利與方便,大部分都不會考慮使用自簽憑證而是會採用(2)/(3)兩個選項,而 Let’s Encrypt 使用上還是相對簡單與輕鬆。
Kubernetes 生態系中針對 Let’s Encrypt 來產生憑證的專案也不少,其中目前最熱門且最多人使用的非 cert-manager 莫屬。
同時 Rancher 官方也推薦使用 cert-manager 來使用,因此接下來就會使用 cert-manager 來輔助 Let’s Encrypt 的處理。

這邊要注意的是, Rancher 官網有推薦使用的 Cert-Manager 版本,該版本通常都會比 Cert-Manager 慢一些,因此使用上請以 Rancher 推薦的為主,不要自行的升級 cert-manager 到最新版本,以免 Rancher 沒有進行測試整合而發生一些不預期的錯誤,到時候除錯起來也麻煩。

如同前述環境指出,本範例會使用的域名是 rancher.hwchiu.com,該域名會事先指向 Load-Balancer,並且將 HTTP/HTTPS 的連線都導向後方的三台伺服器 server{1,2,3}。

接者透過 helm 安裝 cert-manager 到環境中,整個步驟跟 Rancher 非常雷同,準備相關的 repo 並且透過 helm 安裝。

1
2
3
4
5
6
7
8
9
10
[email protected]:~$ helm repo add jetstack https://charts.jetstack.io
"jetstack" has been added to your repositories
[email protected]:~$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "rancher-stable" chart repository
Update Complete. ⎈Happy Helming!⎈
[email protected]:~$
[email protected]:~$ kubectl create namespace cert-manager
[email protected]:~$ helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.0.4 --set installCRDs=true

確認 cert-manager 的 pod 都起來後,下一步就是繼續安裝 Rancher

1
2
3
4
5
[email protected]:~$ kubectl -n cert-manager get pods
NAME READY STATUS RESTARTS AGE
cert-manager-6d87886d5c-fr5r4 1/1 Running 0 2m
cert-manager-cainjector-55db655cd8-2xfhf 1/1 Running 0 2m
cert-manager-webhook-6846f844ff-8l299 1/1 Running 0 2m

首先於 rke 叢集中創立個給 rancher 使用的 namespace,接者透過 helm 指令加上一些參數,這些參數主要是告訴 Rancher 我們的 Ingress 想要使用 letsEncrypt 來產生相關的 SSL 憑證,希望指向的域名是 rancher.hwchiu.com.

Rancher Helm Chart 就會針對這些參數去產生 cert-manager 需要的物件,如 Issuer,接者 cert-manager 就會接替後續行為來透過 ACME 產生一組合法的 TLS 憑證。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[email protected]:~$ kubectl create namespace cattle-system
[email protected]:~$ helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.hwchiu.com \
--set replicas=3 \
--set ingress.tls.source=letsEncrypt \
--set [email protected] \
--version 2.5.9
NAME: rancher
LAST DEPLOYED: Sun Aug 8 20:14:03 2021
NAMESPACE: cattle-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Rancher Server has been installed.

NOTE: Rancher may take several minutes to fully initialize. Please standby while Certificates are being issued and Ingress comes up.

Check out our docs at https://rancher.com/docs/rancher/v2.x/en/

Browse to https://rancher.hwchiu.com

Happy Containering!

註: 預設情況下 ACME 會採用 HTTP 挑戰的方式來驗證域名的擁有權,所以 load-balancer 記得要打開 80/443 的 port,將這些服務導向後端的 rke 叢集。Rancher 會使用 cert-manager + ingress 等相關資源自動處理憑證。

安裝完畢後,等待相關的服務被部署,確認 cattle-system 這個 namespace 下的服務都呈現 running 後,打開瀏覽器連上 https://rancher.hwchiu.com 就會看到下述的登入畫面

因為是第一次登入,系統會要求你更新密碼,同時可以選擇預設的瀏覽模式,由於我們想要使用 Rancher 去管理多個 Cluster,因此我們選擇左邊的格式。接者下一步再次確認要存取的 URL

一切順利的話,就可以正式進入到 Rancher 的主要介面,這時候可以看到如下畫面

Rancher Server 安裝完畢後,會把 用來部署 Rancher 的 Kubernetes 叢集 也加入到 Rancher 的管理視角中,並且使用 local 這個名稱來表示這個 cluster。
其中可以注意到的是該叢集的 Provider 是顯示為 Imported,這意味者這個 Kubernetes 叢集並不是由 Rancher 幫你創造,而是把一個已經運行的叢集給匯入到 Rancher 中。

網頁可以順利存取就意味我們第一個 Rancher 服務順利的架設起來,下一篇文章就會來仔細介紹對於一個 IT Team 的管理人員來說,從系統層面來看 Rancher 的設定有哪些,每個設定對團隊有什麼益處與好處。

最後來看一下 kubernetes 的相關服務,觀察一下一個基本的 Rancher 服務有哪些一些 Pod,未來要除錯時才有概念應該要去哪個 namespace 看哪些服務。
cattle-system 與 kube-system 內都有相關的服務,這邊要注意的是 kube-system 放的是我們最初安裝 RKE 時部署的資源,而 cattle-system 則是我們透過 helm 部署 Rancher 用的。所以基本上就是三個 rancher Pod 以及一個 webhook。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[email protected]:~$ kubectl get pods -A  | awk '{print $1"\t"$2}'
NAMESPACE NAME
cattle-system helm-operation-56h22
cattle-system helm-operation-bjvmx
cattle-system helm-operation-jtwf6
cattle-system helm-operation-stv9x
cattle-system helm-operation-ttxt4
cattle-system helm-operation-xtznm
cattle-system rancher-745c97799b-fqfsw
cattle-system rancher-745c97799b-ls8wc
cattle-system rancher-745c97799b-nhlz6
cattle-system rancher-webhook-6cccfd96b5-grd4q
cert-manager cert-manager-6d87886d5c-fr5r4
cert-manager cert-manager-cainjector-55db655cd8-2xfhf
cert-manager cert-manager-webhook-6846f844ff-8l299
fleet-system fleet-agent-d59db746-hfbcq
fleet-system fleet-controller-79554fcbf5-b7ckf
fleet-system gitjob-568c57cfb9-ncpf5
ingress-nginx default-http-backend-6977475d9b-hk2br
ingress-nginx nginx-ingress-controller-8rtpv
ingress-nginx nginx-ingress-controller-bv2lq
ingress-nginx nginx-ingress-controller-mhfm6
kube-system coredns-55b58f978-545dx
kube-system coredns-55b58f978-qznqj
kube-system coredns-autoscaler-76f8869cc9-hrlqq
kube-system kube-flannel-44hvn
kube-system kube-flannel-rhw7v
kube-system kube-flannel-thrln
kube-system metrics-server-55fdd84cd4-wqdkw
kube-system rke-coredns-addon-deploy-job-pjdln
kube-system rke-ingress-controller-deploy-job-m7sj2
kube-system rke-metrics-addon-deploy-job-vtnfk
kube-system rke-network-plugin-deploy-job-mv8nr
rancher-operator-system rancher-operator-595ddc6db9-tfgp8

一但使用 Helm 安裝 Rancher,未來的升級大部分都可以透過 Helm 這個指令繼續升級,升級的概念也非常簡單

  1. 檢查當前版本的 release note,看看有什麼升級需要注意的事項
  2. 更新 helm repo
  3. 透過 helm 更新 rancher 這個 release,並且透過 –version 指名使用新的版本
  4. 如果不想要每次都輸入前述一堆關於 SSL 的參數,可以把哪些參數變成一個 values.yaml 給傳入

詳細資訊建議參閱官網文章來看看更詳細的升級策略。
如果不想要透過 rke 來維護 Rancher 的話,官網也有如何使用 EKS/AKS/GKE 等公有雲 kubernetes 服務維護 Rancher 的相關教學。

個人資訊

我目前於 Hiskio 平台上面有開設 Kubernetes 相關課程,歡迎有興趣的人參考並分享,裡面有我從底層到實戰中對於 Kubernetes 的各種想法

詳細可以參閱
線上課程詳細資訊: https://course.hwchiu.com/

另外,歡迎按讚加入我個人的粉絲專頁,裡面會定期分享各式各樣的文章,有的是翻譯文章,也有部分是原創文章,主要會聚焦於 CNCF 領域
https://www.facebook.com/technologynoteniu

如果有使用 Telegram 的也可以訂閱下列頻道來,裡面我會定期推播通知各類文章
https://t.me/technologynote

你的捐款將給予我文章成長的動力

Welcome to my other publishing channels