Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018

6,276 views

Published on

對一個完全沒有接觸過 Kubernetes 的開發人員來說,要憑空想像這個全新架構,經常鴨子聽雷,摸不著頭緒。多奇數位創意在導入 Kubernetes 的過程中,就遇到了這個問題。

以至於在開發人員與 IT 人員溝通的過程中,產生了極大落差。保哥將在本次演說分享,多奇數位創意如何在實際導入 Kubernetes 架構的過程中,如何有效跟開發人員溝通,讓大家了解這個全新的平台跟開發人員之間的關係為何。

講者的話:
讓開發人員也能了解 Kubernetes 為他們帶來的效益,以及在 DevOps 的過程中如何有效溝通。

https://summit.ithome.com.tw/kubernetes/

Published in: Technology
  • Be the first to comment

開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018

  1. 1. 開發人員必須知道的 Kubernetes 核心技術 多奇數位創意有限公司 技術總監 黃保翕 ( Will 保哥 ) 部落格:http://blog.miniasp.com/ Kubernetes Summit 2018
  2. 2. 2 分享大綱 • 了解 Docker 運作方式 • 了解 Kubernetes 的運作架構 • 了解 Kubernetes 的常用物件 • 了解 Kubernetes 的部署方式 • 那些年開發人員經常在 K8S 遇到的鬼
  3. 3. Understanding Docker 了解 DOCKER 運作方式
  4. 4. 4 了解「虛擬機器」與「容器」的差異 硬體層的虛擬化技術 作業系統層的虛擬化技術
  5. 5. 5 認識 Docker 主從式架構
  6. 6. 6 認識 Docker 映像階層架構 (Image Layers) • Docker 映像檔採用一種 分層堆疊的運作方式 – 採用了 aufs 檔案系統 – 映像其實是由多個映像 堆疊而成的 – 建立映像的同時, 每個步驟都會建立一層映像
  7. 7. 7 開發人員必須了解的事 1. 管理容器生命週期 2. 管理容器映像生命週期 3. 看得懂 Dockerfile 檔案 4. 了解容器發行管理的過程
  8. 8. 8 管理容器生命週期與基本指令 • 建立映像實體 ( image instance ) ( container ) – docker run -it IMAGE COMMAND • 列出所有容器 – docker ps -a • 啟動指定容器 – docker start CONTAINER • 在指定容器中執行命令 – docker exec -it CONTAINER cmd • 顯示容器執行過程的主控台訊息 – docker logs CONTAINER • 停止指定容器 – docker stop CONTAINER • 刪除指定容器 – docker rm CONTAINER
  9. 9. 9 管理容器映像生命週期與基本指令 • 列出所有容器映像 ( container image ) – docker images • 搜尋容器映像 ( Docker Hub ) – docker search TERM • 下載容器映像 – docker pull IMAGE • 建立容器映像 ( 從現有容器建立 ) – docker commit CONTAINER IMAGE • 建立容器映像 ( 從 Dockerfile 建立 ) – docker build -t REPO:TAG PATH • 標記指定容器映像 – docker tag IMAGE[:TAG] NEWIMAGE[:TAG] • 刪除指定容器映像 – docker rmi IMAGE
  10. 10. Understanding Kubernetes 了解 KUBERNETES的運作架構
  11. 11. 11 Kubernetes 的主要用途 • K8S 是一個 微服務應用程式 的 協調器 ( An Orchestrator for Microservice Apps ) • K8S 可全自動化的管理與調度容器執行! 全自動的配置容器要在叢集內的哪些節點執行 • K8S 用一種「抽象化」的方式管理容器執行
  12. 12. 12 Kubernetes 的主要元件 • Master – 叢集的大腦,負責控制所有 "節點" 執行必要的容器 – 負責調度有哪些 Pods 要安排到哪些 Nodes 運作 – 負責儲存叢集運作過程的所有狀態 • Nodes ( Minions ) – 負責管理所有容器執行 – 負責將指派要執行的 Pods 實體化 – 負責監控所有 Pod 執行的健康狀況
  13. 13. 13
  14. 14. 14
  15. 15. 15
  16. 16. 16
  17. 17. 17
  18. 18. 18
  19. 19. 了解 KUBERNETES 的常用物件 The Kubernetes Objects
  20. 20. 20 認識 Kubernetes 物件 • Pod K8S 部署應用程式的最小單位 • Deployment 定義應用程式部署的條件與參數 • Service 讓 Pod 提供對外連線的服務 • DaemonSet 讓 Pod 自動跑在所有 Nodes • Volume 設定檔案存取的方式 (nfs, hostPath, …) • Persistent Volume (PV) – 將 Volume 物件封裝起來並提供額外的附加資訊 (capacity/accessModes) • Persistent Volume Claim (PVC) – 設定所需儲存空間的條件,並自動比對/取出適合的 PV 物件。 – 如果比對不到合適的 PV 物件,就會透過 StorageClasses 動態建立 PV • Storage Classes – 將儲存空間進行分類,幫助 PVC 動態建立 PV 物件 – 包含 provisioner, parameters, 與 reclaimPolicy 等欄位
  21. 21. 21 認識 Desired State (期望狀態) • 期望狀態 (Desired State) – 我們透過建立 Kubernetes 物件來告知叢集該如何運行, 藉此建立一種 期望狀態 (Desired State)! • 例如我們有個服務希望至少執行 3 個 Pods – 這時 K8S 就會盡力幫我們在叢集中達成這個期望狀態 – 但是狀態經常會改變,例如人為變更或有 Nodes 掛掉 – 此時 Kubernetes 就會依據期望狀態盡力回復原狀
  22. 22. 22 開發人員還需要認識的 Kubernetes 物件 • ConfigMaps – 可以用來保存應用程式常用的參數設定 • SMTP IP • LogPath • 其他應用程式設定 • Secrets – 可以用來保存應用程式需要安全保存的設定參數 • Passwords • Password Salt • Connection String • Private Keys
  23. 23. 23 • kubectl create configmap idpw --from-literal=password=123456 • kubectl get configmap idpw -o yaml • kubectl create secret generic idpw --from-literal=password=123456 • kubectl get secret idpw -o yaml
  24. 24. 了解 KUBERNETES 的部署方式 Deployments
  25. 25. 25 應用程式佈署標準流程 • 建置好應用程式的容器映像 ( Image ) • 先確認在本機 Docker 進行測試執行無誤 • 將容器映像推送到 Docker Registry 保存 • 撰寫 Deployment 佈署腳本 (YAML) • 建立 Deployment 物件 • 進入服務監控程序
  26. 26. 26 示範一個完整的 K8S 開發佈署流程 • dotnet new mvc -n k8sdemo • cd k8sdemo • code . • F1 > Docker: Add Docker files to Workspace • 修改 Dockerfile • docker build -t willh/k8sdemo:latest . --no-cache • docker push willh/k8sdemo:latest • docker run --rm -p 8080:80 willh/k8sdemo:latest • kubectl run k8sdemo --image=willh/k8sdemo:latest • kubectl expose deployment k8sdemo --type=NodePort • kubectl get svc k8sdemo • 撰寫 k8sdemo.deployment.yaml • kubectl create -f k8sdemo.deployment.yaml • kubectl delete -f k8sdemo.deployment.yaml
  27. 27. 佈署到 K8S 之後的常見問題 Common Problems for Developers
  28. 28. 28 部署到 K8S 的 Pods 怎樣都無法啟動 • 檢查步驟: – 可以在本機 Docker 啟動程式嗎? • 有沒有正確使用 Tag 在 Image 上? – 執行時 Image 是否被快取住? • imagePullPolicy: Always • AlwaysPullImages – 是否因為 Secrets 設定錯誤導致抓不到 Image – kubectl describe – kubectl logs – /var/log/syslog
  29. 29. 29 必須學會的偵錯技巧 • kubectl describe – 從 K8S 叢集的角度看 Pod 的運作狀況 • 先看 Events 事件紀錄 • 如果看不懂 Events 事件說明,就要在繼續往下追查 • kubectl logs – 查詢目前 Pods 中的 Console Logs • kubectl logs --previous – Pod 必須要有 Restart 才可以看出前一版的 Pod 紀錄
  30. 30. 30 追查 kubelet 的詳細訊息記錄 • 每台 Node 都有個 kubelet 程式 • kubelet 主要用來接收 Master 下達的命令 • kubelet 會依據 Master 的命令對 Node 進行操作! • 因此查看 kubelet 的訊息紀錄對了解問題幫助很大 • 你可以從系統記錄檔中看出 kubelet 在背後做了多 少事,包含硬碟爆掉會依序對 Pod 做什麼事情都一 清二楚,唯一的缺點是 Logs 非常多! • 常見路徑 – /var/log/syslog (Ubuntu/Debian) – /var/log/messages (RedHat Family)
  31. 31. 31 服務不穩定 ( 每 10 ~ 15 天會當掉一次 ) • 真實案例 – 硬碟配置 50GB / 系統用掉 10GB 左右 – 每 10 ~ 15 天有個 Pod 會自動死掉 – 不是每次都會發現 Pod 死掉 (查的時候硬碟空間都還有) • 問題分析 – 我們有個 Pod 由於流量大,每 3 天會寫入 8GB 資料 – 當硬碟不夠時,K8S 會開始自動清空用不到的資源, 最後會清除死掉的物件 (Pod),並且將記錄清空!(死無對證) – 如果當 Pod 因為資源不足而被砍掉之後,所有 Logs 就 會消失,因此會查不出問題在哪! – Configure Out Of Resource Handling
  32. 32. 32 服務不穩定 ( 服務經常不明原因斷線 ) • 問題描述 – 原本的服務都非常正常 – 但有一天服務開始不穩定連線 (經常斷線) – 沒有人知道為什麼 • 問題分析 – 剛開始用的時候,K8S 只有一個 Pod – 所以一直以來都設定為同一個 Label – 開始加入其他 Pods 時,開發人員不知道要調整 Label – 最後導致 Service 經常選錯 Pod 連線! – Labels and Selectors - Kubernetes
  33. 33. 33 Logs 太多導致 k8s 爆掉的解決方案 • 解決方案 1: 定時砍掉所有的 Pods – 這是開發人員自己的決定 ( 很髒,但有效 XD ) – 正確示範:kubectl delete pod -l component=web – 錯誤示範:kubectl delete deployment -l component=web – Logging at the node level • 解決方案 2: 不要寫 Logs 在 Console – 自己寫 Logs 在自訂檔案 (hostPath volume) – 再搭配 logrotate 壓縮或備份 Logs • 解決方案 3: 自己 hack Docker logs 的 logrotate 機制 – 由 Infra Team 負責撰寫這部分 Shell Script
  34. 34. 學習資源 Learning Resources
  35. 35. 35 相關連結 • Docker - Build, Ship, and Run Any App, Anywhere • Kubernetes | Production-Grade Container Orchestration • What are some good ways of learning Kubernetes? - Quora • Kubectl tips and tricks - Discuss Kubernetes • kubectl Cheat Sheet | Kubernetes • JSON to YAML • Play with Docker Classroom • Play with Docker • Play with Kubernetes • Kubernetes - Visual Studio Marketplace ( GitHub ) • Visual Studio Kubernetes Tools (Preview) • Azure Dev Spaces - Rapid, Iterative Kubernetes Development in Azure
  36. 36. 36 聯絡資訊 • The Will Will Web 記載著 Will 在網路世界的學習心得與技術分享 – http://blog.miniasp.com/ • Will 保哥的技術交流中心 (臉書粉絲專頁) – http://www.facebook.com/will.fans • Will 保哥的噗浪 – http://www.plurk.com/willh/invite • Will 保哥的推特 – https://twitter.com/Will_Huang

×