---
# System prepended metadata

title: vSphere with Tanzu 使用 embedded or external Harbor 方式
tags: [work hack, VMware, blog posted, harbor, repository, Tanzu, cert]

---

# vSphere with Tanzu 使用 embedded or external Harbor 方式
> [time= July, 2021]
> https://sapphirelin.github.io/20210716-Tanzu-%E9%8F%A1%E5%83%8F%E5%80%89%E5%BA%AB%E6%86%91%E8%AD%89%E5%AE%89%E8%A3%9D%E6%B3%95/

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

整理一下原本的步驟：
> 1. 登進去SC 拿 secret 來 SSH 進去 TKG nodes （[最速登入 guest cluster node 方法](https://hackmd.io/1zXLry-aS1m80taMel0d9Q?view)）
> 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
```
$ openssl s_client -connect <harbor url>:443 
```
2. 複製憑證區
![](https://i.imgur.com/nB4a8e5.png)

3. 下 `echo '貼上上面複製的憑證' | base64 ` 如：
![](https://i.imgur.com/E8vPHMY.png)

4. 拿到囉！Harbor 私倉的憑證（下面反白的那段）：
![](https://i.imgur.com/FePrQxG.jpg)


### 第二種－ 到 harbor UI 的 project 裡面下載 (如圖)：
![](https://i.imgur.com/O6osaYD.png)
打開檔案一樣後用上面第3步的 base64 加密就行～

---

### / 開始 /

#### 1. 登入 Supervisor Cluster (SC)
```
kubectl-vsphere login --vsphere-username user@domain.com --server=xxx.xxx.xxx.xxx
```

#### 2. 修改 `TkgServiceConfiguration`
```
kubectl edit TkgServiceConfiguration
```
找不到的話就表示你進錯 context 囉！要去SC~

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

原本的模樣：
```yaml=
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
```
![](https://i.imgur.com/I9WwqZL.png)

新增憑證後的模樣（15~18行）：
```yaml=
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: 貼上加密憑證

```
![](https://i.imgur.com/Qb8TrXd.jpg)

#### 4. 結束啦！驗證成功與否
等待他更新後，用 [SSH去看既有的 tkc ](https://hackmd.io/1zXLry-aS1m80taMel0d9Q?view) 那幾台`/etc/ssl/certs/` 目錄下面有沒有「`tkg-harbor.pem` 」。
或是登入你的 harbor ，直接部署你有的 image 看看有沒有成功部署：
![](https://i.imgur.com/5d4jQAs.png)



｡:.ﾟヽ(*´∀`)ﾉﾟ.:｡

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

想看影片操作的可以參考 Kendrick 哥的示範：  [Set Up a Harbor Registry with Self-Signed Certificates for Tanzu Kubernetes Clusters](https://www.youtube.com/watch?v=sqC9bP8gwQ0)

---
### / 常見 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](https://cormachogan.com/2020/06/23/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](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-376FCCD1-7743-4202-ACCA-56F214B6892F.html)

---

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

至於自己的組織到底適合用 embedded or external Harbor 呢？ it depends. 有預算的話推薦直接接洽 [專業服務團隊](https://www.vmware.com/tw/professional-services.html) ，從環境健康檢查到組織需求訪談、從 infra 到 ap 及文化和使用習慣，由架構師幫公司設計最符合企業的模式是最理想的。

Tschüss! (ﾉ>ω<)ﾉ

###### tags: `blog posted` `work hack` `VMware` `Tanzu` `harbor` `repository` `cert` 