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

More Related Content

What's hot (20)

PPTX
Kubernetes Introduction
Martin Danielsson
 
PPTX
Kubernetes
Henry He
 
PPTX
Kubernetes for Beginners: An Introductory Guide
Bytemark
 
PPTX
ISTIO Deep Dive
Yong Feng
 
PDF
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
Edureka!
 
PDF
Kubernetes security
Thomas Fricke
 
PPSX
CI-CD Jenkins, GitHub Actions, Tekton
Araf Karsh Hamid
 
PDF
Introduction to kubernetes
Gabriel Carro
 
PPTX
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構
Andrew Wu
 
PDF
Kubernetes - introduction
Sparkbit
 
PDF
スペシャリストになるには
外道 父
 
PDF
Introduction to Nexus Repository Manager.pdf
Knoldus Inc.
 
PDF
Cloud native-apps-architectures
Capgemini
 
PDF
BDD-Driven Microservices
John Ferguson Smart Limited
 
PDF
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
 
PPTX
微服務的基礎建設 - Service Discovery, Andrew Wu
Andrew Wu
 
PPTX
Introduction to Kubernetes
rajdeep
 
PDF
GKE Tip Series how do i choose between gke standard, autopilot and cloud run
Sreenivas Makam
 
PPTX
SRE-iously! Reliability!
New Relic
 
PDF
eBPF - Observability In Deep
Mydbops
 
Kubernetes Introduction
Martin Danielsson
 
Kubernetes
Henry He
 
Kubernetes for Beginners: An Introductory Guide
Bytemark
 
ISTIO Deep Dive
Yong Feng
 
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
Edureka!
 
Kubernetes security
Thomas Fricke
 
CI-CD Jenkins, GitHub Actions, Tekton
Araf Karsh Hamid
 
Introduction to kubernetes
Gabriel Carro
 
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構
Andrew Wu
 
Kubernetes - introduction
Sparkbit
 
スペシャリストになるには
外道 父
 
Introduction to Nexus Repository Manager.pdf
Knoldus Inc.
 
Cloud native-apps-architectures
Capgemini
 
BDD-Driven Microservices
John Ferguson Smart Limited
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
 
微服務的基礎建設 - Service Discovery, Andrew Wu
Andrew Wu
 
Introduction to Kubernetes
rajdeep
 
GKE Tip Series how do i choose between gke standard, autopilot and cloud run
Sreenivas Makam
 
SRE-iously! Reliability!
New Relic
 
eBPF - Observability In Deep
Mydbops
 

Similar to 開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018 (20)

PPTX
Windows Container 101: dotNET, Container, Kubernetes
Will Huang
 
PPTX
Oh K8s Is Swag - Kubernetes Basics
Okis Chuang
 
PDF
Kvmopt osforce
meecheng
 
PDF
Debug Your Kubernetes Network
HungWei Chiu
 
PDF
基于MySQL开放复制协议的同步扩展
Sky Jian
 
PDF
ElasticSearch Training#2 (advanced concepts)-ESCC#1
medcl
 
PDF
豆瓣网技术架构变迁
reinhardx
 
PPT
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Lei (Harry) Zhang
 
PPTX
如何盡量避免 Throttling 在 K8s 中 (How to reduce throttling in k8s)
Kiwi Lee
 
PPTX
Track2 -刘继伟--openstack in gamewave
OpenCity Community
 
PDF
Develop Your Own Operating System
National Cheng Kung University
 
PDF
美团技术团队 - KVM性能优化
美团点评技术团队
 
PDF
OpenStack Introduction Ecosystem
NUTC, imac
 
PDF
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
YingSiang Geng
 
PPTX
SQL Server 資料庫版本控管
Will Huang
 
PDF
淘宝主备数据库自动切换
mysqlops
 
PDF
Open Street Map安裝指引 (Ubuntu 12.04)
Marc Huang
 
PDF
Bypat博客出品-利用cent os快速构建自己的发行版
redhat9
 
PDF
Java线上应用问题排查方法和工具(空望)
ykdsg
 
PPTX
Nosql三步曲
84zhu
 
Windows Container 101: dotNET, Container, Kubernetes
Will Huang
 
Oh K8s Is Swag - Kubernetes Basics
Okis Chuang
 
Kvmopt osforce
meecheng
 
Debug Your Kubernetes Network
HungWei Chiu
 
基于MySQL开放复制协议的同步扩展
Sky Jian
 
ElasticSearch Training#2 (advanced concepts)-ESCC#1
medcl
 
豆瓣网技术架构变迁
reinhardx
 
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Lei (Harry) Zhang
 
如何盡量避免 Throttling 在 K8s 中 (How to reduce throttling in k8s)
Kiwi Lee
 
Track2 -刘继伟--openstack in gamewave
OpenCity Community
 
Develop Your Own Operating System
National Cheng Kung University
 
美团技术团队 - KVM性能优化
美团点评技术团队
 
OpenStack Introduction Ecosystem
NUTC, imac
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
YingSiang Geng
 
SQL Server 資料庫版本控管
Will Huang
 
淘宝主备数据库自动切换
mysqlops
 
Open Street Map安裝指引 (Ubuntu 12.04)
Marc Huang
 
Bypat博客出品-利用cent os快速构建自己的发行版
redhat9
 
Java线上应用问题排查方法和工具(空望)
ykdsg
 
Nosql三步曲
84zhu
 
Ad

More from Will Huang (20)

PPTX
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
Will Huang
 
PPTX
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
Will Huang
 
PPTX
ASP.NET Core 6.0 全新功能探索
Will Huang
 
PPTX
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
Will Huang
 
PPTX
你一定不能不知道的 Markdown 寫作技巧
Will Huang
 
PPTX
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
Will Huang
 
PPTX
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
Will Huang
 
PPTX
Micro-frontends with Angular 10 (Modern Web 2020)
Will Huang
 
PPTX
從實戰經驗看到的 K8S 導入痛點
Will Huang
 
PPTX
RxJS 6 新手入門
Will Huang
 
PPTX
极速 Angular 开发:效能调校技巧 (ngChina 2019)
Will Huang
 
PPTX
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
Will Huang
 
PPTX
Protractor: The Hacker way (NG-MY 2019)
Will Huang
 
PPTX
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
Will Huang
 
PPTX
Angular 开发技巧 (2018 ngChina 开发者大会)
Will Huang
 
PPTX
Angular 7 全新功能探索 (Angular Taiwan 2018)
Will Huang
 
PPTX
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
Will Huang
 
PPTX
AKS 與開發人員體驗 (Kubernetes 大講堂)
Will Huang
 
PPTX
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
Will Huang
 
PPTX
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
Will Huang
 
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
Will Huang
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
Will Huang
 
ASP.NET Core 6.0 全新功能探索
Will Huang
 
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
Will Huang
 
你一定不能不知道的 Markdown 寫作技巧
Will Huang
 
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
Will Huang
 
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
Will Huang
 
Micro-frontends with Angular 10 (Modern Web 2020)
Will Huang
 
從實戰經驗看到的 K8S 導入痛點
Will Huang
 
RxJS 6 新手入門
Will Huang
 
极速 Angular 开发:效能调校技巧 (ngChina 2019)
Will Huang
 
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
Will Huang
 
Protractor: The Hacker way (NG-MY 2019)
Will Huang
 
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
Will Huang
 
Angular 开发技巧 (2018 ngChina 开发者大会)
Will Huang
 
Angular 7 全新功能探索 (Angular Taiwan 2018)
Will Huang
 
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
Will Huang
 
AKS 與開發人員體驗 (Kubernetes 大講堂)
Will Huang
 
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
Will Huang
 
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
Will Huang
 
Ad

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

  • 1. 開發人員必須知道的 Kubernetes 核心技術 多奇數位創意有限公司 技術總監 黃保翕 ( Will 保哥 ) 部落格:http://blog.miniasp.com/ Kubernetes Summit 2018
  • 2. 2 分享大綱 • 了解 Docker 運作方式 • 了解 Kubernetes 的運作架構 • 了解 Kubernetes 的常用物件 • 了解 Kubernetes 的部署方式 • 那些年開發人員經常在 K8S 遇到的鬼
  • 6. 6 認識 Docker 映像階層架構 (Image Layers) • Docker 映像檔採用一種 分層堆疊的運作方式 – 採用了 aufs 檔案系統 – 映像其實是由多個映像 堆疊而成的 – 建立映像的同時, 每個步驟都會建立一層映像
  • 7. 7 開發人員必須了解的事 1. 管理容器生命週期 2. 管理容器映像生命週期 3. 看得懂 Dockerfile 檔案 4. 了解容器發行管理的過程
  • 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 執行的健康狀況
  • 13. 13
  • 14. 14
  • 15. 15
  • 16. 16
  • 17. 17
  • 18. 18
  • 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