前言
在玩轉 Kubernetes 這個炫砲的技術之前,我們必須要先瞭解它到底在解決什麼樣的問題以及整個來龍去脈。該文章主要先探討 Monlithic 作為歷史背景下常用的開發模式,一直到使用 Microservice 時遇到的處境以及相對應工具的搭配,來呈現在應用程式微服務化的情境底下如何管理大量的微服務。系列文章是 Kubernetes in action 讀後的筆記文。
Monolithic 的缺點
- 隨時間而變肥大且複雜,軟體難以重構。在除錯時也難以尋找。
- 不能依據不同服務的流量需求來 水平擴展 ,而是一次部署整體支應用程式造成不必要的資源成本增加。
Microservice 的優點
- 開發上的可以做到良好的解隅 (Decouple)
- 擁有水平擴展的能力 (依然需要看情境)
- 不同的微服務可以獨立維護部署
困難點
😂 重新抽象軟體架構
😂 API 要變成 stateless (*註解ㄧ)
😍 由於系統變得龐大且複雜,所以在除錯上會更加困難 Zipkin
😍😎 當有大量的微服務 相互依賴 時會讓你要去決定誰去要一起被部署
😎 微服務造成環境的多樣性更高,在開發和部署環境上更不容易維護
😎 環境需求的不同,程式想要不同版本的 shared libs
註解一:
- 當你的服務不需要在內部維持請求之間的狀態時就是 stateless service ,反之就是 stateful service (需要開 sticky session)。
- 微服務應該將狀態資訊儲存在外部而非內部,這才有利於服務的擴展。
解決
😂 依賴軟體團隊的經驗設計
😍 服務的顆粒度(Granularity)應該以獨立的業務邏輯來解決之間因 相互依賴 導致 除錯困難 的問題
😎 We ease the pain with the help of docker and kubernetes.
介紹
因應大量容器部署管理的困難,所以才需要有一個容器管理工具來解決 (e.g. 某公司測試用 8000 個 container)
Container management solutions
- docker-compose
- 適用在 單節點 的環境上,可以快速部署多個容器。
- openshift
- now base on kubernetes
- red hat cloud 較不有名
- kubernetes
- 在 public cloud 得到最完整的支援
- 儼然成為 Container Management 的標準
- minikube
- local 的單節點 k8s。適合拿來練習
- k3s (閹割)
- 沒有 add-ons ,不夠彈性
- microk8s
- 有 add-ons ,可彈性抽換不同 component
What’s the Kubernetes?
歷史
- Kubernetes(又稱為 k8s)是一個開放原始碼的 容器編排管理系統 container orchestrator,用於自動化應用程序的部署,擴展和管理。
- Google 於 2014 年中首次宣布 Kubernetes ,現由 Cloud Native Computing Foundation (CNCF) 負責維護。
- 原以 C++ 編寫,後以 Golang 重構。
- 發音 koo ~ ber ~ natis,又稱作 k8s。
叢集架構
- Pod 最基本的部署單位。
- Service 代表一組功能相同的 Pods 群體。訪問 Service 時會自動 load balance 到該群體底下任意的 Pod 上。
- Label 可以將任意物件 貼上標籤 ,方便將物件進行分組還有分配任務
- Ingress 用於管理從外部對叢集中的 Service 進行訪問(HTTP, HTTPS)。必須部署到 master node 上面。
系統元件
- master node : 負責管理和控制所有 worker node 的主機。
- Worker node : 運行微服務的主機。
- API server : 提供 Kubernetes API ,讓使用者可以透過它管理和設定整個系統。
- etcd : 儲存整個 k8s 叢集中物件的規格。
- Scheduler : 負責決定 Pod 要部署到哪一個節點上。
- Kubelets : 視為每個節點的大腦。
- 作為 master node 和 worker node 溝通的媒介。
- 負責管理 Pod,包括在 Pod 發生故障時創建新的 Pod。
- cAdvisor : 搜集該節點上所有資源的資訊,透過 kubelet 隨時回報給 master node。
- Kube-Proxy : 維護節點上的網絡規則。負責網路流量的傳送。
特性
Velocity 速度
- 可達成短時間多次的不停機更新。
- 可達成短時間多次的不停機更新。
Immutability 不變性
- 當軟體版本更新時
- ✅ (immutable) 重新 build 一個更新的 image
- ❌ (mutable) 進入 container 更新
- 當軟體版本更新時
Declarative configuration 宣告式設定
- 命令式命令 (imperative commands) 定義了 行為 。「執行A,執行B,然後再執行C…」
- 宣告式設定 (declarartive configurations) 定義了 狀態 。「我需要三個A程式」
Self-healing 自我修復
- 隨時維護當前所需的狀態設定。
Scalability 擴展性
- 通過新增或刪除 Pod 輕鬆地上下擴展服務的工作負載。