More Related Content Similar to How to use kubernetes build microservices 如何運用 Kubernetes 打造微服務生態圈
Similar to How to use kubernetes build microservices 如何運用 Kubernetes 打造微服務生態圈 (20) How to use kubernetes build microservices 如何運用 Kubernetes 打造微服務生態圈5. Copyright ITRI 工業技術研究院
傳統架構 vs 微服務
2019/3/25 5
Source: Testing microservices - Los Techies
https://lostechies.com/andrewsiemer/2016/01/11/testing-microservices/
6. Copyright ITRI 工業技術研究院
微服務架構的挑戰
• 複雜度
微服務天生為分散式架構,自然無法避免分散式服務帶來的各種挑戰
• 開發與測試
由於架構複雜度提升,針對應用整合的開發就會變得更加困難
• 資料一致性與完整性
個別服務各自維護私有資料,如何將資料同步將是難題
• 版本控制
個別服務獨立開發,維護彼此間合適的適用版本將成為挑戰。另一方
面,在服務佈署上,容忍不同版本的相同服務一起工作也是個挑戰
• 維運
微服務提供了維運人員更精細的應用控制,但同時也加重了維護分散
式系統正確運作的難度
2019/3/25 6
8. Copyright ITRI 工業技術研究院
使用kubernetes的好處
• 複雜度
– 提供Pod/ReplicationSet/Deployment 給容器應用程式,
DNS為基礎的服務探索機制
• 開發與測試
– 引入Namespaces 進行應用隔離; RBAC做權限控制
• 資料一致性與完整性:
– ConfigMap 描述服務堆疊
• 版本控制
– 採組態檔案設置,並使用etcd儲存重要資訊
• 維運
– 提供API/CLI工具進行各種工作,遇到單點錯誤有機會
自動恢復,內建漸進式更新/回滾版本機制
2019/3/25 9
9. Copyright ITRI 工業技術研究院
微服務架構 vs Kubernetes
2019/3/25 10
Source: Spring Cloud for Microservices Compared to Kubernetes
https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes/
11. Copyright ITRI 工業技術研究院
DNN農場
• 1 個主要節點(Master)
• 7 個工作節點(Worker)
– 4台Nvidia DGX-1,個別內含8個V-100圖形處理
器
– 3台DIY工作站,個別內含8個Nvidia GTX-
1080Ti
• 2 儲存節點
– FTP服務進行資料傳輸, 容器透過NFS連接資料
– kubernetes 用來管理使用者的 GPU 容器服務
以及服務管理元件
2019/3/25 12
13. Copyright ITRI 工業技術研究院
AI大資料雲端服務
• 5個主要節點(Master)
– 包含VIP/HA,硬體防火牆整合與負載平衡,etcd
HA等功能
• 252個工作節點(Worker)
– 皆內含8張Nvidia V-100的客製化水冷機器,以及
infiniband、GPFS以及S3整合
– 可根據組態,動態分割資源給最多8個使用者,或
讓單一使用者獲得整台機器的資源
– 節點角色可透過管理系統切換為Slurm或K8S
• kubernetes 用來提供GPU容器服務以及
GPGPU工作排程,進行AI開發與應用串接工作
2019/3/25 14
15. Copyright ITRI 工業技術研究院
從零開始
$ kubectl run alpaca-prod --image=gcr.io/kuar-
demo/kuard-amd64:1 --
labels="ver=1,app=alpaca,env=prod”
deployment.apps/alpaca-prod created
• 與docker相似的啟動指令
– Docker run –-name alpaca-prod gcr.io/kuar-
demo/kuard-amd64:1
2019/3/25 16
17. Copyright ITRI 工業技術研究院
公開服務
$ kubectl expose deployment alpaca-prod
--port=8080
service/alpaca-prod exposed
$ kubectl edit service alpaca-prod
// 修改 spec.type 為 NodePort
• 現在,服務已對外公開,可被外部存取
2019/3/25 18
19. Copyright ITRI 工業技術研究院
“Expose”實際發生的事
• 另外一組元件kube-
dns(或CoreDNS) 提供
基於DNS查詢的服務探
索功能
• Pod中的應用程式可用
“podName.namespacesN
ame.svc.clusterName”
存取到其他Pod的公開服
務
– 例如:在 PodA 使用DNS
位址“PodB.default”找
到PodB的服務
2019/3/25 20
20. Copyright ITRI 工業技術研究院
擴展應用程式
$ kubectl scale --replicas=3
deployment/alpaca-prod
deployment.extensions/alpaca-prod scaled
• 現在,三個實體Kuard將同時提供服務
– 同時,負載平衡器自動介入,將流量平均分布
到各個Pod
– 也可以”縮小”應用程式,僅需改變replicas即可
2019/3/25 21
23. Copyright ITRI 工業技術研究院
Kubernetes的HA
• ReplicationSet 提供分散式服務與自動故障
轉移的基礎
– 建立副本: 提供分散負載
– 故障轉移: 提供高可用性*
– 線上修改: 提供故障端點即時隔離與線上除錯
– 垂直自動擴展: 搭配heapster,提供資源使用率
為主的自動擴展
* 另需搭配Pod 內的健康檢查機制,實作Liveness及/或Readiness探測器,以實現完整的無
中斷故障轉移,單一問題端點自動隔離,以及在定義strategy物件的情況下,提供非破壞性
漸進式滾動升級(rolling-upgrade)與回滾(rollback)等功能。
2019/3/25 24
25. Copyright ITRI 工業技術研究院
宣告式佈署
• 本節範例皆為指令佈署
– 建議僅用於開發階段或緊急修正問題
• 已存在的佈署可轉存為YAML或JSON檔案
– 將佈署設定加入版本控制
$ kubectl get deployments alpaca-prod –export –o
yaml > alpaca-prod.yaml
$ kubectl replace –f alpaca-prod.yaml –save-
config
2019/3/25 26
26. Copyright ITRI 工業技術研究院
滾動更新
• 更新佈署檔案alpaca-prod.yaml,加入
strategy物件
– 決定滾動更新的方式與頻率
$ kubectl apply –f alpaca-prod.yaml
• Kubernetes套用更新後,將會開始Rollout !
– 執行rollout來觀看更新進度:
$ kubectl rollout status deployment alpaca-prod
– 觀察ReplicaSets來管理不同版本:
$ kubectl get replicasets –o wide
2019/3/25 27
27. Copyright ITRI 工業技術研究院
穩定滾動更新的策略
• maxUnavailable:最大不可用的Pod數量
• maxSurge:於更新時,最多允許的額外資源
• minReadySeconds: 確認新的Pod保持健康的時
間
– maxUnavailable = 25%: 允許最多兩成五的性能損失
– maxSurge = 20%: 允許過程中,使用相當於額外20%的
副本數量來建立新的Pods
– minReadySeconds = 60: 在新的Pod建立並由
Readiness檢查通過後,執行下一次滾動前的等待時間
• 搭配ReadinessProbe,確保穩定健康的更新
2019/3/25 28
29. Copyright ITRI 工業技術研究院
更多功能…
• Label & Annotation: k8s連結各個物件的關
鍵
• Job: 建構平行處裡或工作隊列
• ConfigMap和Secret: 存放設定
• PresistentVolume: 整合外部儲存
2019/3/25 30
36. Copyright ITRI 工業技術研究院
Resources
• https://kubernetes.io/
• http://tinyurl.com/ycw6bpq7
• https://summit.ithome.com.tw/kubernetes/
• https://jimmysong.io/kubernetes-handbook/
2019/3/25 37