基本操作

當GKE Cluster建立起來之後,後續的操作基本上與K8S幾近相同,所有操作都是透過kubectl來使用,下面簡單介紹一下透過kubectl指令在GKE的環境上建立主機與服務。

K8S的結構

GKE在架構上透過Pod來封裝一個以上的container作為部署的最小單位,並且透過deployment來封裝pod,讓pod本身可以被監控與執行scale或rolling update等動作,整體的概念如下圖所示:

  • Pod封裝container作為部署的最小單位

  • 透過deployment或是relicaset等方式封裝pod運作的細節,如份數等等資訊

  • 最後透過service或是ingress連結對外的開放端口提供服務

而在這之中,GKE為管理整個K8S cluster的角色,透過GKE底層的instance group的操控,即可進一步做到底層資源的橫向擴展。

手動執行模式

kubectl提供指令"run"來手動執行單一個pod,可以作為一次性部署或是臨時操作使用。

建立Nginx服務為例

我們可以簡單的指定image名稱來啟動一個nginx起來...

kubectl run --image=nginx nginx-app --port=80 --env="DOMAIN=cluster"

仔細看,其實該nginx會被封裝到deployment中,而該deployment預設會以剛剛給定的image啟動一個pod

$ kubectl run --image=nginx nginx-app --port=80 --env="DOMAIN=cluster"
deployment "nginx-app" created
$ kubectl get deploy nginx-app
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-app 1 1 1 1 14s

因此跑起來的nginx-app,基本上可以透過deployment來操作scale out與rolling update等動作..

將服務掛載內部IP

到這個階段,啟動階段所掛載的port是container內部的port,如果想要讓外部可以存取您的nginx,可以透過expose的方式來掛載service到pod上...

kubectl expose deployment nginx-app --port=80 --name=nginx-http

操作無誤後,可以透過get service的方式來找到所有expose的設定...

kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.99.240.1 <none> 443/TCP 1d
nginx-http 10.99.255.30 <none> 80/TCP 1h

在這個時候,您可以直接登入該container所掛載的位置,並且透過docker ip來做存取,例如:

curl http://10.99.255.30:80

不過這樣的存取方式僅限於server內部使用,或是具備存取該node權限的服務使用。

對服務掛載LoadBalancer (外部IP)

如果要完全open您的服務供外部連線使用,需要透過LoadBalancer的參數指定來連線GKE的外部Network Load Balancer,才可以直接讓服務對外。

kubectl expose deployment nginx-app --type="LoadBalancer"

檢視服務掛載IP後:

kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.99.240.1 <none> 443/TCP 1d
nginx-app 10.99.249.119 130.211.254.181 80/TCP 2m

此時,service已經有外部的IP位置,可以透過外部IP來存取:

curl http://130.211.254.181:80

總結

透過剛剛的演練,大概說明了K8S的一些基本操作,包含:

  • 如何啟動一個Deployment,包含使用指定的Image來建立

  • 使用expose來串接service,串接外部Load Balancer

而K8S持續在演化與發展當中,請大家持續關注K8S帶來更好的部署概念!