vSphere with Tanzu 使用 embedded or external Harbor 方式

已經開始玩 Tanzu 一陣子的朋朋們,應該一直都有一個糾結是,embedded Harbor (內嵌式私倉) 一鍵啟用、很方便,但是不能隨意新增專案,只能跟著 namespace 創建、彈性不高;external Harbor (外接式私倉) 就能隨心所欲,但是就要把憑證一個一個丟進去每一台 cluster node 才行。

整理一下原本的步驟:

  1. 登進去SC 拿 secret 來 SSH 進去 TKG nodes (最速登入 guest cluster node 方法
  2. 拿 TKG cluster 的 kubeconfig 檔案
  3. vsphere login 進去 TKC
  4. 拿到每個 TKG nodes 的 ip
  5. 丟憑證到每一個 TKG nodes 然後還要複製到每一台的憑證路徑
  6. 每一台重開 docker ..^^

別擔心,在 vSphere with Tanzu 7 U2 之後,可以透過客製化 Supervisor Cluster (SC) 的 TkgServiceConfiguration 這隻服務,讓塞憑證達到讓自動化:


/ 準備憑證 /

兩種方法 openssl or Harbor 本身的 UI 。

第一種-用 openSSL :

  1. 先去連我們的私倉 Harbor

    1
    $ openssl s_client -connect <harbor url>:443 
  2. 複製憑證區

  3. echo '貼上上面複製的憑證' | base64 如:

  4. 拿到囉!Harbor 私倉的憑證(下面反白的那段):

第二種- 到 harbor UI :

到 project 裡面下載 (如圖):

打開檔案一樣後用上面第3步的 base64 加密就行~


/ 開始 /

1. 登入 Supervisor Cluster (SC)

1
kubectl-vsphere login --vsphere-username [email protected] --server=xxx.xxx.xxx.xxx

2. 修改 TkgServiceConfiguration

1
kubectl edit TkgServiceConfiguration

找不到的話就表示你進錯 context 囉!要去SC~

3. 進編輯模式後,加入憑證

原本的模樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TkgServiceConfiguration
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"run.tanzu.vmware.com/v1alpha1","kind":"TkgServiceConfiguration","metadata":{"annotations":{},"name":"tkg-service-configuration"},"spec":{"defaultCNI":"antrea"}}
creationTimestamp: "2021-07-01T16:30:35Z"
generation: 1
name: tkg-service-configuration
resourceVersion: "2948"
selfLink: /apis/run.tanzu.vmware.com/v1alpha1/tkgserviceconfigurations/tkg-service-configuration
uid: f01e03b4-6c6b-4e76-9c82-a2cf4d5f2b05
spec:
defaultCNI: antrea

新增憑證後的模樣(15~18行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TkgServiceConfiguration
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"run.tanzu.vmware.com/v1alpha1","kind":"TkgServiceConfiguration","metadata":{"annotations":{},"name":"tkg-service-configuration"},"spec":{"defaultCNI":"antrea"}}
creationTimestamp: "2021-07-01T16:30:35Z"
generation: 1
name: tkg-service-configuration
resourceVersion: "2948"
selfLink: /apis/run.tanzu.vmware.com/v1alpha1/tkgserviceconfigurations/tkg-service-configuration
uid: f01e03b4-6c6b-4e76-9c82-a2cf4d5f2b05
spec:
defaultCNI: antrea
trust:
additionalTrustedCAs:
- name: harbor
data: 貼上加密憑證

4. 結束啦!驗證成功與否

等待他更新後,用 SSH去看既有的 tkc 那幾台/etc/ssl/certs/ 目錄下面有沒有「tkg-harbor.pem 」。
或是登入你的 harbor ,直接部署你有的 image 看看有沒有成功部署:

。:.゚ヽ(*´∀`)ノ゚.:。

當然同樣的也可以用這種方式塞內嵌式Harbor。
以上就是讓整座 vSphere with Tanzu 都連到私倉的方式啦!

想看影片操作的可以參考 Kendrick 哥的示範: Set Up a Harbor Registry with Self-Signed Certificates for Tanzu Kubernetes Clusters


/ 常見 troubleshooting /

-查看 pod status

分享一個簡單的除錯方式,部署後用 kubectl get pod 來進行檢查:

1. 若 Status 為 ErrImagePull

併發症狀是” x509: certificate signed by unknown authority “,這就表示你憑證放錯或是沒有放進去,通常都是忘記 base64 加解密造成的,重新塞在 TkgServiceConfiguration 然後等待rolling update就好。

2. 若 Status 為 ImagePullBackOff

這基本上就是表示連得到,憑證也沒錯,但 authorization 出錯。
遇到這種 error 就是檢查 secret 有沒有塞錯,或是注意 docker login 要出現 login success ,以及像是用 docker Desktop UI 有沒打錯帳號密碼。

這部分感謝 Cormac Hogan 大大分享,溫馨無比 ( ´•̥̥̥ω•̥̥̥` )

-升級 vSphere 7U2 前作法 *非production作法

還沒升級至 vSphere 7U2 之前的環境,可以參考 Cormac 的文章塞憑證: Integrating embedded vSphere with Kubernetes Harbor Registry with TKG (guest) clusters
(*TKG guest cluster = vSphere with Tanzu’s TKC)

不過只有用本文的 TkgServiceConfiguration 自動化方式才能開 support ticket 除錯,所以不建議在生產環境使用!!
(上述為本文時間點狀態,以官網設置手冊為準)
官網文檔: Using Container Registry with Tanzu Kubernetes Clusters


接著可能會遇到的延伸問題:我司需要個別組織有其專屬的 Harbor ,例如只能給某個R&D team 連上單獨的私倉的話怎麼辦?可以參考我另外一篇文章:
Tanzu k8s cluster 個別使用多個 Harbor 方式

至於自己的組織到底適合用 embedded or external Harbor 呢? it depends. 有預算的話推薦直接接洽 專業服務團隊 ,從環境健康檢查到組織需求訪談、從 infra 到 ap 及文化和使用習慣,由架構師幫公司設計最符合企業的模式是最理想的。