基本上我們安裝好PKS後,如果之前準備的NSX-T網路可以藉由路由或NAT連到網際網路的話,理論上以PKS建立起來的K8S Cluster已經可以連到Internet下載Docker Container來執行應用;由於Harbor和PKS產品設計時,原本就是緊密整合的,所以PKS的控制主機群和PKS所建立的Kubernetes的虛擬機皆可用安裝產品時的憑證做通訊,但通常現實狀況下,大多數使用者會使用除了上述以外的機器來連接Harbor,例如開發人員的桌機、CI/CD工具 (如Concourse)等等,所以我們今天介紹使用者的終端如何連線Harbor,除此之外,我們也簡單的介紹如何將Docker Registry上的Image複製一份到Harbor內,並實際從Harbor部署一個服務。

h15.png

設定終端與Harbor的連線

  • 終端電腦必須安裝Docker,因為未來我們是用docker client連到Harbor

# apt install -y docker.io

  • 當安裝好Harbor後我們將底下畫面的憑證內容複製到Client端的一個檔案內 (例如ca.crt)

# vi /etc/docker/certs.d/harbor.pks.zpod.io/ca.crt

h0

h1.png

  • 在終端電腦執行以下命令

# mkdir -p /etc/docker/certs.d/harbor.pks.zpod.io

# mkdir -p ~/.docker/tls/harbor.pks.zpod.io\:4443/

# cp /etc/docker/certs.d/harbor.pks.zpod.io/ca.crt ~/.docker/tls/harbor.pks.zpod.io\:4443/

# cp /etc/docker/certs.d/harbor.pks.zpod.io/ca.crt /usr/local/share/ca-certificates/

# update-ca-certificates

# service docker restart

這樣就完成終端連線(管理員或開發人員)所需的準備工作了!

匯入Docker container映像

這時候我們來驗證一下我們的Harbor是否可以從Internet匯入一個Docker容器映像檔。

  • 首先在Harbor GUI內新增一個Project,這裡我建立一個名為Project1的專案 (畫面省略)
  • 在終端電腦登入harbor

# docker login harbor.pks.zpod.io

  • 從Internet拉下(pull)一個Nginx到終端電腦下

# docker pull nginx

  • 然後將已經拉下來的nginx貼個標籤到我們剛剛在Harbor中建好的專案名稱下

# docker tag nginx harbor.pks.zpod.io/project1/nginx:latest

  • 最後執行下列命令將實際映像傳到Harbor裡去,這樣就完成了Docker容器映像複製到Harbor的動作了!

# docker push harbor.pks.zpod.io/project1/nginx:latest

h2

  • 到Harbor GUI裡面驗證一下我們要的映像檔已經存在

h3.png

h4.png

在K8S Cluster中安裝應用

當我們已經了解如何在Harbor內存放我們要的Docker容器映像檔後,我們(通常是開發人員)就可以開始在建好的PKS Cluster中,從Harbor安裝應用服務,為何要從Harbor去安裝的原因有可能是因為公司不允許K8S叢集的電腦可以直接和外網連線,或因為效能原因,或因為安全考量等等,在此就不多做介紹,有興趣的讀者可以參考這裡以便了解更多Harbor的功能。

  • 在終端電腦登入harbor

# docker login harbor.pks.zpod.io

我們必須先把未來佈署服務需要用到的Docker映像檔從Internet上的Docker Registry轉存放到Horbor內:(我們要安裝的是一個三層架構的餐廳投票系統,原作者把它放在這裡)

  • 首先把Image下載到本地端:

# docker pull mreferre/yelb-ui:0.3
# docker pull mreferre/yelb-appserver:0.3
# docker pull mreferre/yelb-db:0.3
# docker pull redis:4.0.2

  • 如同上一小節所述,我們需要先將這些Image貼上標籤,但這次我們把它放到預設的library專案下

# docker tag mreferre/yelb-ui:0.3 harbor.pks.zpod.io/library/yelb-ui:0.3
# docker tag mreferre/yelb-appserver:0.3 harbor.pks.zpod.io/library/yelb-appserver:0.3
# docker tag mreferre/yelb-db:0.3 harbor.pks.zpod.io/library/yelb-db:0.3
# docker tag redis:4.0.2 harbor.pks.zpod.io/library/redis:4.0.2

  • 然後將這些Image推送到我們的Harbor儲存空間內:

# docker push harbor.pks.zpod.io/library/yelb-ui:0.3
# docker push harbor.pks.zpod.io/library/yelb-appserver:0.3
# docker push harbor.pks.zpod.io/library/yelb-db:0.3
# docker push harbor.pks.zpod.io/library/redis:4.0.2

  • 利用以下命令查看映像檔的資訊是否無誤

# docker images

h6

  • 也可到Harbor GUI裡驗證一下這些檔案都被導入到Harbor了

h5

  • 接著可以到這裡下載K8S Deployment Spec安裝檔

目前我們的環境都準備妥當,我們也知道我們要佈署的K8S Cluster名為louis-07

(pks create-cluster louis-07 –external-hostname louis-07.pks.zpod.io –plan small)

  • 查看利用PKS或CSE 2.0已事先建立好的K8S Cluster訊息

# pks cluster louis-07

h7

  • 獲得登入louis-07的K8S Cluster的憑證,此時我們就可對這個叢集執行相關操作動作,需注意master host需要在DNS登錄相關名稱解析記錄

# pks get-credentials louis-07

h9

  • 利用以下指令查看目前環境這個叢集有多少worker node (筆者的叢集只有一台Worker)

# kubectl get nodes -o wide

h10

  • 執行以下命令開始佈署yelb服務:

# kubectl create namespace yelb

# kubectl apply -f yelb-harbor.yaml

# watch -n 1 kubectl get pods –namespace yelb

h11

  • 直到所有應用都是Running狀態,我們執行以下命令以獲取應用程式UI的內部POD名稱,因為我們需要連進UI驗證服務執行狀態

#  kubectl get pods –namespace yelb

h12

  • 當知道UI的名字後,用底下命令查看UI的IP,得知是172.15.8.3,安裝配置文件(yelb-harbor.yaml)中有指定要連接的網路端口為30001。(安裝配置文件沒有指定這個服務需要外部自動設定負載均衡服務,但實際生產環境則需將此納入考量,一般生產環境比較少用NAT,因為不太適合做應用的自動擴展或縮小,當有指定loadbalance時,PKS會自動從當初安裝PKS時的IP Floating Pool的網段,指定一個VIP給到這個應用,要注意這個VIP是要能夠從外部網路路由的到的)

# kubectl describe pod yelb-ui-dcb8746fb-2bshc –namespace yelb

h13

P.S:如果yaml檔是指定有用Load Balancer為服務的接入口,我們可用以下方式得知LB的服務IP和port number,下圖顯示得知LB IP為10.96.59.107,port number為80.

# kubectl get svc -n yelb

p4

h14

這樣我們就大致完成CSE 2.0所需要的NSX-T/PKS的底層環境要求了,希望對讀者有一些幫助,接下來我會介紹這個環境如何和vCloud Director及CSE 2.0互相整合,謝謝!

Notes:

  • 安裝過程中得到VMware Dr. Shawn Ho和Sean Chung的協助非常多,在此要大力感謝他們的熱心協助!
  • 內容所及皆為測試環境的建置測試說明,由於PaaS解決方案牽涉的範圍不僅僅為基礎設施部分,還包含運維模式的改變,運營商如要導入CSE 2.0/PKS解決方案,請務必尋求原廠專業服務部門的支援。

P.S: 如何刪除NSX-T的遺留物件,例如想要刪除某個NSX-T的IP Pools,但發現刪除不了,因為是之前PKS以Superuser的身份自動建立出來的,如今有可能PKS的Cluster已經刪除,但NSX-T上卻還有系統沒有同步刪除的Orphan元件:

可參考這篇,或用以下NSX-T API的方式刪除:

例如想要刪除某個IP Pools,先查出它在NSX-T的UUID,然後用NSX-T的API強迫刪除,筆者是用Postman的工具,用法如下畫面:

P1P2P3

設定好點擊”Send”按鈕,看到Status 200 OK就完成了!