OpenShift 安裝規劃思考以及Internal Registry 安裝

最近在協助合作夥伴安裝 OpenShift 4.8 的時候,剛好遇到一些資源設定不足的部分,導致工作節點一多就裝不起來的問題,在這邊紀錄一下 trouble shooting 的過程以及反思。

另外也會附上安裝好之後要部署 Internal Registry 的做法,在 OpenShift 要使用 s2i 或是自動構建容器映像檔,都會需要 Internal Registry,身為 OpenShift 管理員是一定要裝這個的。

♖ 環境

OpenShift 4.8.13

♖ 安裝規劃

這張圖是我從 Red Hat OpenShift Installation Guide 拷貝下來的,可以看到前置作業都做好了之後,安裝流程會從 Bootstrap 機(點火機)開始、Controller Nodes (別稱 Master 節點)安裝、Computer Nodes (別稱 Worker 節點)安裝完畢。
upload successful

基本上我在做建置規劃的時候,會參考 Red Hat 官方文件 - Installing a user-provisioned cluster on bare metal 做資源的規劃。如果環境不一樣,比方說使用公有雲、或是有地端虛擬化的環境也沒關係,看 Bare Metal 文件就是標竿,使用 User Provision Installation 在任何環境都可以裝起來,只是手動的部分有點小麻煩。

Minimum Resource Requirements 這個小節可以看到 OpenShift 最低需要配置的數量:
upload successful

可以看到這張表格微妙的沒有寫出節點數量,這是因為我們除了安裝之外還需要考慮後續的擴展能力,經過測試,如果是在 master nodes 4 vCPU / 16 GB 的條件下,在 OpenShift 4.8.13 版本下可以同時啟動兩個 worker nodes,如果是三台 worker nodes,會在 worker nodes 安裝過程發現有些 cluster operators 永遠起不來。

這是因為 OpenShift 在安裝過程中非常吃 master nodes 的 CPU 運算資源,如果使用 ssh 指令觀察,會發現 master 的 kubernetes-api 有非常多的溝通紀錄。安裝過後 CPU 的資源就會緩和下來,不會再維持這麼高的消耗率。

那如果 CPU 不夠用怎麼辦,是不是安裝會比較慢? 一般來說,CPU 資源不夠常見結果就是效能變差,但是現在是在安裝的過程,所以有可能 worker 節點呼叫 master節點的 API 叫不到,有些重要的元件就安裝不起來,安裝過程就有可能失敗。

所以最保險的做法是,把 master 節點的資源規劃的充裕一點,比方說 8 vCPU / 16 GB memory

♖ Trouble Shooting 方法

安裝完成可以透過 oc get nodes 以及 oc get co 兩條指令確認是否安裝完畢。

1
2
3
4
5
6
7
[root@bastion install-dir]# oc get nodes
NAME STATUS ROLES AGE VERSION
master0 Ready master 9h v1.21.1+a620f50
master1 Ready master 9h v1.21.1+a620f50
master2 Ready master 9h v1.21.1+a620f50
worker0 Ready worker 8h v1.21.1+a620f50
worker1 Ready worker 8h v1.21.1+a620f50

像前一章提到的 master nodes 資源不足的情況,在下 oc get co命令之後,會發現有部分的 cluster operatorsAVAILABLE 狀態是呈現 False 的狀態。
upload successful

另外分享兩個官方寫的 trouble shooting 文件給大家,在安裝過程中可能會需要針對節點和容器進行除錯,建議把這兩份文件列出來的指令複製貼上到自己整理的 hackmd 或是文字筆記本上,就不用一次記那麼多的指令了:

♖ Internal Registry 建置

安裝完成之後,我們會需要試著部署容器測試這座 OpenShift 叢集是否可用
通常我會透過 Developer ConsoleDeveloper Catalog 頁面部署 Red Hat 提供的模板做確認。
upload successful

如前言所述,因為 Internal Registry 部署沒有成功,所以也無法透過 s2i 的方式部署模板,啟動 pod 的時候會顯示如下錯誤訊息:
upload successful

根據某個 Red Hat 的某個 ticket 敘述(我忘記在哪邊看到@@),openshift SDN 啟動的過程如果有 restart 的情況發生,會影響 registry 的啟動,所以我們先找出有 restart 紀錄的 pods:

1
2
3
4
5
6
7
8
9
10
11
12
oc get pods -n openshift-sdn

[root@bastion install-dir]# oc get pods -n openshift-sdn
NAME READY STATUS RESTARTS AGE
sdn-controller-dmzqb 1/1 Running 3 4h16m
sdn-controller-qwqvf 1/1 Running 0 4h16m
sdn-controller-vt4bp 1/1 Running 0 4h16m
sdn-gdtbf 2/2 Running 2 4h16m
sdn-l5dft 2/2 Running 2 4h16m
sdn-pdt2h 2/2 Running 3 4h16m
sdn-v2w6k 2/2 Running 0 3h2m
sdn-xmlrx 2/2 Running 0 3h1m

然後把有 restart 紀錄的 pods 全砍了,放心的砍沒關係,反正 pods 會重啟:

1
2
3
4
5
6
7
8
9
10
[root@bastion install-dir]# oc get pods -n openshift-sdn
NAME READY STATUS RESTARTS AGE
sdn-74l2h 2/2 Running 0 2d22h
sdn-controller-76p99 1/1 Running 0 2d22h
sdn-controller-qwqvf 1/1 Running 0 3d2h
sdn-controller-vt4bp 1/1 Running 0 3d2h
sdn-rg8nh 2/2 Running 0 2d22h
sdn-v2w6k 2/2 Running 0 3d1h
sdn-v8s26 2/2 Running 0 2d22h
sdn-xmlrx 2/2 Running 0 3d1h

砍完之後依照建置叢集的類別,選擇其中一種方式更新 image registry 的設定:

  • 測試用的 OpenShift 叢集
1
oc patch configs.imageregistry.operator.openshift.io cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
  • 正式的 OpenShift 叢集 (比方說 production 環境)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
oc patch config.imageregistry.operator.openshift.io/cluster --type=merge -p '{"spec":{"rolloutStrategy":"Recreate","replicas":1}}'

## create pvc yaml file and apply it
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: image-registry-storage
namespace: openshift-image-registry
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi

成功部署的話,在 openshift-image-registry project 會有image-registry-xxxx pod 存在:
upload successful

♖ 自動 Approve CSRs

OpenShift 安裝過程有點漫長,在安裝快要結束時,下達 oc get csr 命令可以看到這些 CSRs,接著我們可以透過 oc get csr -o name | xargs oc adm certificate approve 去 approve 這些 CSRs。

Day-2 維運時,部分 Cluster Operators 在更新後也會產生 CSRs,這時候我們可以參考這個 repo建立 batch,這個 batch 文件可以透過每一個小時執行一次上面所講的 approve 命令自動 approve CSRs,不然的話,有可能會出現 Pending 狀態而無法完成叢集更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@bastion install-dir]# oc get csr
NAME AGE REQUESTOR CONDITION
csr-2vnqs 10d system:node:crc-4gdnp-master-0 Pending
csr-4lpf5 10d system:node:crc-4gdnp-master-0 Pending
csr-4n67j 10d system:node:crc-4gdnp-master-0 Pending
csr-4pv76 10d system:node:crc-4gdnp-master-0 Pending
csr-5t449 10d system:node:crc-4gdnp-master-0 Pending
csr-6rpkz 10d system:node:crc-4gdnp-master-0 Pending
csr-88dx8 10d system:node:crc-4gdnp-master-0 Pending
csr-9cphd 10d system:node:crc-4gdnp-master-0 Pending
csr-br5fx 47m system:node:crc-4gdnp-master-0 Pending
csr-c8cds 10d system:node:crc-4gdnp-master-0 Pending
csr-cp9z4 35m system:node:crc-4gdnp-master-0 Pending
csr-d249k 10d system:node:crc-4gdnp-master-0 Pending
csr-g8n9z 10m system:node:crc-4gdnp-master-0 Pending

以上是本次的分享。

♖ Reference

Red Hat OpenShift Installation Guide
Installing a user-provisioned cluster on bare metal
♞ [Recommended host practices] (https://docs.openshift.com/container-platform/4.8/scalability_and_performance/recommended-host-practices.html)
Troubleshooting installations
Investigating pod issues
Configuring the registry for vSphere
vchintal/ocp4-auto-approve-csr