More Related Content Similar to 開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018 (20) More from Will Huang (20) 開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 20182. 2
分享大綱
• 了解 Docker 運作方式
• 了解 Kubernetes 的運作架構
• 了解 Kubernetes 的常用物件
• 了解 Kubernetes 的部署方式
• 那些年開發人員經常在 K8S 遇到的鬼
6. 6
認識 Docker 映像階層架構 (Image Layers)
• Docker 映像檔採用一種
分層堆疊的運作方式
– 採用了 aufs 檔案系統
– 映像其實是由多個映像
堆疊而成的
– 建立映像的同時,
每個步驟都會建立一層映像
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
管理容器映像生命週期與基本指令
• 列出所有容器映像 ( 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
11. 11
Kubernetes 的主要用途
• K8S 是一個 微服務應用程式 的 協調器
( An Orchestrator for Microservice Apps )
• K8S 可全自動化的管理與調度容器執行!
全自動的配置容器要在叢集內的哪些節點執行
• K8S 用一種「抽象化」的方式管理容器執行
12. 12
Kubernetes 的主要元件
• Master
– 叢集的大腦,負責控制所有 "節點" 執行必要的容器
– 負責調度有哪些 Pods 要安排到哪些 Nodes 運作
– 負責儲存叢集運作過程的所有狀態
• Nodes ( Minions )
– 負責管理所有容器執行
– 負責將指派要執行的 Pods 實體化
– 負責監控所有 Pod 執行的健康狀況
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
認識 Desired State (期望狀態)
• 期望狀態 (Desired State)
– 我們透過建立 Kubernetes 物件來告知叢集該如何運行,
藉此建立一種 期望狀態 (Desired State)!
• 例如我們有個服務希望至少執行 3 個 Pods
– 這時 K8S 就會盡力幫我們在叢集中達成這個期望狀態
– 但是狀態經常會改變,例如人為變更或有 Nodes 掛掉
– 此時 Kubernetes 就會依據期望狀態盡力回復原狀
22. 22
開發人員還需要認識的 Kubernetes 物件
• ConfigMaps
– 可以用來保存應用程式常用的參數設定
• SMTP IP
• LogPath
• 其他應用程式設定
• Secrets
– 可以用來保存應用程式需要安全保存的設定參數
• Passwords
• Password Salt
• Connection String
• Private Keys
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
25. 25
應用程式佈署標準流程
• 建置好應用程式的容器映像 ( Image )
• 先確認在本機 Docker 進行測試執行無誤
• 將容器映像推送到 Docker Registry 保存
• 撰寫 Deployment 佈署腳本 (YAML)
• 建立 Deployment 物件
• 進入服務監控程序
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
28. 28
部署到 K8S 的 Pods 怎樣都無法啟動
• 檢查步驟:
– 可以在本機 Docker 啟動程式嗎?
• 有沒有正確使用 Tag 在 Image 上?
– 執行時 Image 是否被快取住?
• imagePullPolicy: Always
• AlwaysPullImages
– 是否因為 Secrets 設定錯誤導致抓不到 Image
– kubectl describe
– kubectl logs
– /var/log/syslog
29. 29
必須學會的偵錯技巧
• kubectl describe
– 從 K8S 叢集的角度看 Pod 的運作狀況
• 先看 Events 事件紀錄
• 如果看不懂 Events 事件說明,就要在繼續往下追查
• kubectl logs
– 查詢目前 Pods 中的 Console Logs
• kubectl logs --previous
– Pod 必須要有 Restart 才可以看出前一版的 Pod 紀錄
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
服務不穩定 ( 每 10 ~ 15 天會當掉一次 )
• 真實案例
– 硬碟配置 50GB / 系統用掉 10GB 左右
– 每 10 ~ 15 天有個 Pod 會自動死掉
– 不是每次都會發現 Pod 死掉 (查的時候硬碟空間都還有)
• 問題分析
– 我們有個 Pod 由於流量大,每 3 天會寫入 8GB 資料
– 當硬碟不夠時,K8S 會開始自動清空用不到的資源,
最後會清除死掉的物件 (Pod),並且將記錄清空!(死無對證)
– 如果當 Pod 因為資源不足而被砍掉之後,所有 Logs 就
會消失,因此會查不出問題在哪!
– Configure Out Of Resource Handling
32. 32
服務不穩定 ( 服務經常不明原因斷線 )
• 問題描述
– 原本的服務都非常正常
– 但有一天服務開始不穩定連線 (經常斷線)
– 沒有人知道為什麼
• 問題分析
– 剛開始用的時候,K8S 只有一個 Pod
– 所以一直以來都設定為同一個 Label
– 開始加入其他 Pods 時,開發人員不知道要調整 Label
– 最後導致 Service 經常選錯 Pod 連線!
– Labels and Selectors - Kubernetes
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
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
聯絡資訊
• 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