從第一次聽到 Kubernetes 以來,已經有一年多了,永遠都記得 k8s 名稱的由來只是保留「開頭 K」及「結尾 S」,然後中間的英文字母數量剛好是 8 個英文字就這樣命名了…。全球三大雲服務商,AWS、Azure 和 GCP 都有提供託管 Kubernetes 集群服務( EKS、AKS、GKE ),可見其有名火熱程度。現在終於有機會在工作上碰到這項技術,就來寫些簡單筆記吧 !


k8s 簡介

  • open source container orchestration tool
  • origin developed by Google
  • helps you manage containerized applications in different deployment environments

K8s Features

  • high availability

    基本上避免停機,no downtime, it’s always accessible by the users

  • scalability

    代表高性能 high performance

  • disaster recovery

    面對資料毀所只能依靠 backup 和 restore


Kubernetes Architecture

基本概念有 :

  • Control Plane ( master node )
  • some Worker nodes
    • each worker node has a kubelet process running on it

kubelet 是做甚麼呢 ?

communicate master and worker; can execute tasks

以下會概述說明一下

  • 安排容器調度的 Control Plane Components
  • 容器運行的機器 Worker Node Components。

控制平面組件(Control Plane Components)

Control Plane 功能是主控 cluster 狀態和調度容器,且通常 Control Plane 內,不會運行任何 container 應用,可參閱 Creating Highly Available Clusters。Control Plane 身為 Kubernetes 運作中心,負責管理所有其他 Node,有幾個重要組件:

  • kube-apiserver
  • etcd
  • kube-scheduler
  • kube-controller-manager
  • cloud-controller-manager(optional)

為了簡單起見,通常會在同一個機器上,安裝所有控制平面組件。因為都在同一個機器,所以舊稱是 master node,但其實控制平面組件,可以分散在不同機器上運行,所以為了避免誤會中央控管只能在一台機器上,使用 Control Plane 是比較好的描述。

kube-apiserver

kubectl 就是把指令送到這裏 ,負責 Node 之間的溝通橋樑。每個 Node 彼此不能直接溝通,必須要透過 apiserver 轉介。

etcd

用來存放 Kubernetes Cluster 的資料作為備份,可以透過 etcd 幫我們還原 Kubernetes 的狀態。類似 terraform state 的存放處

kube-controller-manager

controller 就是 Kubernetes 裡一個個負責監視 Cluster 狀態的 Process,不符和時會更新。

kube-scheduler

Kubernetes 的 Pods 調度員,scheduler 會監視新建立但還沒有被指定要跑在哪個 Node 上的 Pod,選一個最適合放置的 Node 把 Pod 放上去。

cloud-controller manager (Optional)

Cloud Controller Manager 會把集群連接到雲提供商的 API 之上,若在自己私有的環境中運行 Kubernetes ,就有cloud-controller manager。有些 k8s 功能會需要依賴雲平台,例如 Service yaml 設定 load-balancer type


Node Components

Node 也被經常稱呼為 worker, Node Components 主要有:

  • kubelet
  • kube-proxy
  • Container Runtime 這些會在每個 node 上運行,負責維護運行的 Pod 並提供 Kubernetes 運行環境。

kubelet

kubelet 負責與 API Server 溝通,確保 containers 處於運行狀態且健康。 kubelet 它保證 containers 都運行在 Pod 中,且不會管理不是由 Kubernetes 創建的容器。

kube-proxy

維護節點上的一些網絡規則,實現 Kubernetes Service 概念的一部分。透過 kube-proxy 允許從集群內部或外部的網路與 Pod 進行通信。

Container Runtime

Kubernetes 支持許多容器運行環境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器運行環境接口) 的其他任何實現。