0%

Kubernetes 筆記 - Monolithic to Microservice 0

前言

在玩轉 Kubernetes 這個炫砲的技術之前,我們必須要先瞭解它到底在解決什麼樣的問題以及整個來龍去脈。該文章主要先探討 Monlithic 作為歷史背景下常用的開發模式,一直到使用 Microservice 時遇到的處境以及相對應工具的搭配,來呈現在應用程式微服務化的情境底下如何管理大量的微服務。系列文章是 Kubernetes in action 讀後的筆記文。

Monolithic 的缺點

  1. 隨時間而變肥大且複雜,軟體難以重構。在除錯時也難以尋找。
  2. 不能依據不同服務的流量需求來 水平擴展 ,而是一次部署整體支應用程式造成不必要的資源成本增加。

Microservice 的優點

  1. 開發上的可以做到良好的解隅 (Decouple)
  2. 擁有水平擴展的能力 (依然需要看情境)
  3. 不同的微服務可以獨立維護部署

困難點

  • 😂 重新抽象軟體架構

  • 😂 API 要變成 stateless (*註解ㄧ)

  • 😍 由於系統變得龐大且複雜,所以在除錯上會更加困難 Zipkin

  • 😍😎 當有大量的微服務 相互依賴 時會讓你要去決定誰去要一起被部署

  • 😎 微服務造成環境的多樣性更高,在開發和部署環境上更不容易維護

  • 😎 環境需求的不同,程式想要不同版本的 shared libs

註解一:

  1. 當你的服務不需要在內部維持請求之間的狀態時就是 stateless service ,反之就是 stateful service (需要開 sticky session)。
  2. 微服務應該將狀態資訊儲存在外部而非內部,這才有利於服務的擴展。

stateful vs stateless

解決

  • 😂 依賴軟體團隊的經驗設計

  • 😍 服務的顆粒度(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?

歷史

  1. Kubernetes(又稱為 k8s)是一個開放原始碼的 容器編排管理系統 container orchestrator,用於自動化應用程序的部署,擴展和管理。
  2. Google 於 2014 年中首次宣布 Kubernetes ,現由 Cloud Native Computing Foundation (CNCF) 負責維護。
  3. 原以 C++ 編寫,後以 Golang 重構。
  4. 發音 koo ~ ber ~ natis,又稱作 k8s

叢集架構

  1. Pod 最基本的部署單位。
  2. Service 代表一組功能相同的 Pods 群體。訪問 Service 時會自動 load balance 到該群體底下任意的 Pod 上。
  3. Label 可以將任意物件 貼上標籤 ,方便將物件進行分組還有分配任務
  4. 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 輕鬆地上下擴展服務的工作負載。