2018年11月15日星期四

Docker 上的 Kubernetes

上一回【Docker Network 及 Docker Compose 教學

k8s_1.png

自 18.06 Stable 版本起,安裝 Docker CE 會包含 Kubernetes,於本機執行,不能設定的 single-node cluster,作為開發及測試用。

以入門來說,是個好選擇,熟悉後再上 Google Kubernetes Engine 服務。

Deploy on Kubernetes
https://docs.docker.com/docker-for-windows/kubernetes/



———————————簡易的分隔線————————————

  Docker with Kubernetes 名詞及結構︰


Docker-Kubernetes-single-node-cluster

看起來超複雜?換個角度,在 Docker 基礎上加 K8s,只需留意 Cluster 內及 kubectl。

Cluster


只是在圈地,反正不能設定,現在先放置,去到 GCP ( Google Cloud Platform ) 再說。

Node


都說 single node cluster 了,甚麼是 node?如果不是 single node cluster 的話,node 可分為 master node 及 worker node。

打個比喻,現在你有間公司 ( cluster ),你是老闆 ( kubectl ),下面有四個員工 ( node ),一個高層 ( master node ),三個下屬 ( worker node )。

你給高層指令 ( 用 kubectl 透過 API Server ),高層發號司令 ( controller ),分派工作、資源、訊息等等東西,命令下屬做事。下屬做了甚麼事後,匯報給高層 ( 透過 API Server ),例如造好了某建設 ( TomEE Server )。

現在要開記者招待會,公告公司有甚麼重大服務推出 ( expose service ),希望公眾使用。何時有見過小職員能在記招說話?都是高層出面沾光……

以上假設很美好……如果是蚊型公司的話,就是 single node cluster,master node 是你,worker node 也是你,你不能分身,因此無人代替,只要你倒下,公司一起倒。

Pod


一個 node 裡面可以有很多個 container,通常是一個 pod 一個 container,為甚麼?看到 pod 裡有 volume 吧?K8s 目標在於 decoupled system,沒必要把 container 都往一個 pod 裡放,docker 起 pod 預設也是一個 pod 放一個 container 。

K8s 的 volume 概念與 Docker 不同,有更多選擇。Pod 死,未必連 volume 一起死,那是看你選了怎樣的 volume,詳情請參考以下官網。

Pod 的 IP 及 port 與 container 共享,只要在同一個pod,containers 都可以用 localhost 互相溝通。

Pod Overview
https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/

Volumes
https://kubernetes.io/docs/concepts/storage/volumes/

Service


由於 K8s 設計包含 fault-tolerant 及 load-balance 等目標,並不會有固定 IP,那麼會有甚麼問題呢?

例如 JDBC connection 需要 URL 連接,問題是你不會知道實際 IP 是甚麼,這個時候需要靠 DNS 之類服務來固定實際名字,再由名字查出 IP 是甚麼。

把服務 ( 如 Derby、TomEE ) 打上 label,由多個 pod 拿著相同 label,然後使用者查冊 key-value pairs 後找到服務。

Services
https://kubernetes.io/docs/concepts/services-networking/service/

Labels and Selectors
https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors

Deployments


Kubernetes 要透過 deployment 建立 pod,docker 版 K8s 做法也差不多。

Deployments
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

Deploy on Kubernetes
https://docs.docker.com/docker-for-windows/kubernetes/

———————————簡易的分隔線————————————

開啟及設定 Kubernetes︰


Kubernetes kubectl setup env

首先設定 KUBECONFIG 這個 environment variable。

Enable Kubernetes in docker

在 Docker setting 中開啟 Kubernetes。

Select Kubernetes context

選擇 context。

Enable K8s for windows CE
https://docs.docker.com/docker-for-windows/#kubernetes

———————————簡易的分隔線————————————

修改 yml 及 .env 檔︰


由於 .env 不能用在 docker stack deploy 指令,而且 volumes mount 要作修改,才可以 deploy。

yml 及 .env source
https://gist.github.com/IntegrityKnight/edc33f17c9cf7aeebaee794995eed341/c9010b34df88fb03bf7c2711dcf755aab8d0693a

Variable substitution

Fixing Volumes in Docker Toolbox

k8s-deploy_1

在 project 的 working directory 中輸入以下 command, 結合 .env 與 yml,輸出做一個 yml。

  • docker-compose config > k8s.yml

然後嘗試做 deploy︰

  • docker stack deploy --compose-file k8s.yml mystack

失敗了…… 為甚麼?檔案輸出過程中,程式自動把 .env 的 ( / ) 轉換成 ( \ ) …… 拿去 linux container 用,當然出問題,所以只好自動手動修改輸出檔案。

replace slash

用 replace 功能一次過替代檔案中 ( \ ),換成 ( / ),如果看不到 k8s.yml 檔案,refresh eclipse GUI 可以看到。

docker stack deploy with compose file on k8s

再嘗試 deploy …… 成功!

back slash and forword slash
https://stackoverflow.com/questions/1589930/so-what-is-the-right-direction-of-the-paths-slash-or-under-windows

Deploy on Kubernetes

———————————簡易的分隔線————————————

使用 kubectl︰


查看 pod 及對外 service IP︰



deploy 功能後,怎知道內裡有甚麼?這時候需要用 kubectl 去看。


  • kubectl get pods
  • kubectl get services

圖中可看到 EXTERNAL-IP,是 localhost,所以可以試試在 browser 開來看看。
http://localhost:8080/TomEE-JNDI-Derby-Example/datasource.jsp


假如發生錯誤,可能是 Database 不正確關閉,而留下 .lck 檔案,手動刪除,再重新 deploy 一次。

移除 stack︰


用以下 command 可關閉 stack。不是即時關閉,要再用 kubectl get pods 確認是否關好。


  • docker stack rm mystack

docker stack rm

kubectl cheatsheet

———————————簡易的分隔線————————————

總結︰


用 Docker 的 K8s 練習,然後再試 GCP 。GCP 優惠期有限,有一定認識後,再上 GCP,這樣做就不會浪費限時優惠在學習上。

Google Kubernetes Engine

沒有留言:

發佈留言

設有留言驗證及審查,檢閱後,才會顯示留言。
本人惰性很高,留言或許會石沉大海。