Kubernetes 基礎介紹

Posted by Alan Zhan on Monday, February 14, 2022

終於要來好好深入探討 Kubernetes ,因為 Kubernetes 是基於 golang 這門語言開發的,所以在稍早已經先針對 golang 深度研究了,不過對於 Docker 與 container 技術有經有深入研究過了,小弟就就不針對 Docker 技術展開了,如果也想看的話,歡迎敲碗,接下來就會好好的針對 Kubernetes 有一系列的文章介紹。

Kubernetes

甚麼是 Kubernetes (k8s)? K8s 是 Kubernetes 的縮寫,因為 K 到 s 中間有八個字母,所以稱為 Kubernetes ,它是 Google 的開源容器集群管理系統,是 Google 多年大規模容器管理技術 Borg 的開源版本,主要功能包括:

  • 基於容器的應用佈署、維護和滾動升級。
  • 附載均衡和服務發現。
  • 跨機器與跨地區的集群調度。
  • 自動擴展。
  • 無狀態服務和有狀態服務。
  • 插件機制保證擴展性。

Imperative VS Declarative

  • Imperative : 命令式系統,是寫出解決某個問題、完成某個任務或者達到某個目標的明確步驟。此方法明確寫出系統應該執行某個指令,並且期待系統返回期望結果。像是電視機遙控器對電視的命令。
  • Declarative : 聲明式系統,關注的是做甚麼,而不是怎麼做。僅限於描述要達到甚麼目的,如何達到該目的就交給系統處理就好。像是冷氣遙控器對冷氣操作。

聰明的你應該會覺得很奇怪,我不是要學習 Kubernetes 嗎?幹嘛跟我說這個?會在這邊說是因為 Kubernetes 是基於聲明式的方式而打造出來的系統,那命令式與聲明式的優缺點,這邊就不深入探討各自的優缺點了,有興趣的同學可以自己深入探討。

核心物件

  • Pod : 用來描述應用的實例,包括鏡像地址、資源需求等。Kubernetes 中最核心的物件,也是打通應用和基礎架構的秘密武器。
  • Namespace : 資源隔離的基本單位,可以理解為文件系統中的目錄結構或者程式語言中的 namespace 。
  • Node : 計算節點的抽象,用來描述計算節點的資源抽象、健康狀態等。
  • Service : 服務如何將應用發布成為服務,實質上是附載均衡與域名服務的聲明。

Pod

Pod 本身的意思是豆莢,為什麼會取名為這個呢?因為豆莢會把很多個豆子包覆在一起,使得這些豆子成為一體。

  • Pod 是一組緊密關聯的容器集合,他們共享 PID 、 IPC 、 Network 和 UTS namespace ,是 Kubernetes 調度的基本單位。
  • Pod 的設計裡面是支持多個容器在一個 Pod 中共享網路和文件系統,可以通過進程之間通信和文件共享,簡單又高效的方式組合完成服務。
  • 同一個 Pod 中不同容器可以共享資源
    • 共享網路 namespace
    • 通過掛載 Volumn 共享儲存
    • 共享 Security Context

Namespace

Namespace 是對一組資源和物件的抽象集合,可以用來將系統內部的物件劃分不同的群組或用戶組。

常見的 pods 、 services 、 replication controllers 和 deployments 都是屬於某一個 namespace 的 (默認 default),而 Node 、 persistentVolumes 等則不屬於任何 Namespace。

Node

在 Kubernetes 的世界中,Node 通常就代表著一台實體機或者虛擬機,用來運行 Pod,為了管理 Pod ,每個 Node 至少需要運行 container runtime 、 kubelet 和 kube-proxy。Node 可以分為 master node 跟 worker node。

  • master node : Kubernetes 的指揮中心,負責管理所以的 node,這個主節點還有以下較為重要的組件。
    • kube-apiserver
      • 管理整個 kubernetes 所需要的 API 。
      • 負責跟 node 之間的溝通橋樑。
      • 負責跟 kubernetes 中的請求身分認證和授權。
    • etcd
      • 一個強大的、穩定的、高可用的 key/value 存儲庫,被 kubernetes 用於長久儲存所有的 API 物件。
    • kube-controller-manager
      • 運行著著所以處理 cluster 日常任務的控制器,包括 Node Controller、Replication Controller 等等。
      • controller manager 的監視與嘗試更新,都蓄要通過訪問 kube-apiserver。
    • kube-scheduler
      • scheduler 會監控新建的 pods,並且將其分配給 node。
  • worker node :
    • kubelet
      • 該 node 的管理員,負責管理該 node 上的所有 Pods 的狀態,並且與 master 溝通。
    • kube-proxy
      • 該 Node 的傳訊員,負責更新該 Node 的 iptables ,讓 Kubernetes 中部在該 Node 上的其他物件,可以得知該 Node 上所以 Pods 的最新狀態。
    • Container Runtime
      • 可以運行 container 的執行程式,例如 : Docker 。

Service

Service 是應用服務的抽象,通過 labels 為應用提供附載均衡和服務發現。match labels 的 Pods IP 和 port 列表組成 endpoints ,由 kube-proxy 負責將服務 IP 負載均衡到這些 endpoint 上。

每一個 Service 都會自動分配一個 cluster IP (僅只能在 Cluster 內部訪問的虛擬地址) 和 DNS 名,其他容器可以通過該地址或者 DNS 來訪問服務,而不需要了解背後容器的運行。

總結

今天先初步分享 kubernetes 的基礎組件與一些知識,如果有興趣的同學可以自己安裝 kubernetes ,之後會再展開一系列的文章,就讓我們繼續看下去。

歡迎到我的 Facebook Alan 的筆記本 留言,順手給我個讚吧!你的讚將成為我持續更新的動力,感謝你的閱讀,讓我們一起學習成為更好的自己。

參考