2 minute read

近期有機會用到, 把之前的筆記整理上來, 順便review一下

Cluster

  • master node: 維持kubernetes cluster基礎設施的節點, 自帶taint, 任務不會被調度至master上
  • worker node: 工作節點, scheduler會把任務分配至該節點上
graph LR
    subgraph kubernetes
        subgraph master

        end
        subgraph worker1
            pod1
            pod2
        end
        subgraph worker2
            pod3
            pod4
        end
        subgraph workerN..
            podN...
        end

    end

Node

主機節點

  • master node
  • worker node

master Node

  • ApiServer: 基於restful的api服務,提供kubernetes的所有操作
  • Kube-controller-manager: kubernetes的資源管理器, 負責管理各個類型的資源控制器
  • cloud-controller-manager(Optional): 負責與第三方雲端平台的控制器API交互
  • Kube-scheduler: 基於調度算法將各個pod調度至各個節點上
  • etcd: 分布式key-value資料庫, 負責記錄整個kubernetes集群的狀態, 可理解成kubernetes的資料庫
graph TD
    master ---> apiServer
    master ---> kube-controller-manager
    master ---> cloud-controller-manager
    master ---> kube-scheduler
    master ---> etcd

Worker Node

kubelet: 負責管理該node上的容器生命週期

kube-proxy: 負責該Node上的proxy load balance (若有service的cluster IP 被請求, 背後若是node的pod, 就會被轉進來) 與 service的服務發現(會監控api-server,若有apply新資源,對依照資源類型執行相對應的操作,如 設置ipvs規則,pod啟動…) 這邊proxy為 level 4 (tcp/udp)

container-runtime: container的運行工具, e.g. docker, containerd, CRI-O…

graph TD
    worker ---> kubelet
    worker ---> kube-proxy
    worker ---> container-runtime

Pod

kubernetes 最小單位


graph LR
    subgraph Pod
        Pause
        Container1 --- Pause
        ContainerN... --- Pause
    end
  • Pause: root container, 負責Pod的基礎設施(使pod內部變成類主機), 生命週期
    • 網路機制: 使其形成類似本機網路, 內部container可直接使用localhost通訊
    • hostname: 共用hostname
    • 文件機制: 內部文件系統共享
    • PID: 內部進程PID皆會相同

Resource

kubernetes 內部抽象化資源

基本cluster元件

type description
Namespace 用於隔絕資源
Node 非實際藉由k8s創建, 只是將存在的Node抽象化為k8s的資源

Pod

k8s最小單位, 一個或多個container組成, 並共享網路,文件系統, PID

Pod Controller

type description
ReplicationController 確保指定數量的pod副本在運行, 並在pod被刪除後創建新的pod
ReplicaSet 同上,新增selector功能,可更靈活使用label綁定pod
Deployment 同上,新增image update rollback scaling …
StatefulSet 同上, 但創建刪除皆具有順序性, 且創建的pod 名稱一致, 有穩定的dns
DaemonSet 確保每個node上運行一個pod副本, 並在node加入/離開時創建/刪除pod
Job 執行一次性任務, 並確保任務完成後pod被刪除, 並可設定重試機制
CronJob 執行定時任務, 並可設定重試機制, 並確保任務完成後pod被刪除

Service

為 level4 的代理, 為內部Pod提供一個endpoint, 可從內/外部訪問, 並提供負載均衡

type description
ClusterIP(default) 提供僅供內部使用的ip, 自動負載均衡 application
NodePort 開啟特定Port (30000-32767)並將服務暴露至外部網路,基於ClusterIP, KubeProxy會將 nodeIP:port 轉至該service, nodeIP可以是任意節點
LoadBalancer 將雲端服務商的load balance 抽象化成 service, 並與pod進行連結
ExternalName 可將外部的url轉成 kubernetes內部的DNS, 同namespace下更可直接使用service name訪問
  • ClusterIP
graph LR
    InternalTraffic --> Service
    Service --> Pod1
    Service --> Pod2
    Service --> Pod3
  • NodePort
graph LR
    subgraph Node
        Service --> Pod1
        Service --> Pod2
        Service --> Pod3
    end

    Traffic -->|NodeIP:Port| Service

  • Load Balancer
graph LR
    subgraph cluster
        Service --> Pod1
        Service --> Pod2
        Service --> Pod3
    end

    Traffic --> LoadBalance --- Service
  • ExternalName
graph TD
    subgraph Cluster
        ExternalName
        PodA --->|dependency| ExternalName
        PodB --->|dependency| ExternalName
        PodC --->|dependency| ExternalName
    end
    ExternalService ---|DNS| ExternalName

Ingress

反向代理外部流量至內部service , 為 level7 的代理

  • Ingress: 反向代理rule的 抽象化資源, 可理解成config概念
  • Ingress controller: 負責將存在的Ingress資源轉換成對應的rule, 並將rule應用至實際的代理服務, 可理解成web server概念

Ingress Controller為cluster level, ingress 為 namespace level

graph TD
    subgraph cluster
        A["Ingress Controller"] --> Service1
        Service1 --> PodA1
        Service1 --> PodA2
        Service1 --> PodA3
        A -.-> Service2
        Service2 -.-> PodB1
        Service2 -.-> PodB2
        Service2 -.-> PodB3
    end
    Traffic1 -->|example1 . domain . com| A
    Traffic2 -.->|example2 . domain . com| A

Volume

Pod內部的資料持久化, 列出常見的

Type description
EmptyDir Pod中共享目錄, 目錄生命週期與Pod綁定
HostPath Pod中共享目錄, 且目錄同時會掛載於實體節點
NFS Pod中共享目錄, 且目錄掛載於NFS

kubernetes volume的抽象化元件

Type description
PersistentVolume k8s的持久化物件,可將volume機制抽象化為k8s內部資源
PersistentVolumeClaim 可理解成PV 需求的抽化化物件, 會自行綁定符合條件的PV, 可靜態或動態(自行創建pv)

Config

可將設定檔/環境變數/密碼等資訊抽象化為k8s內部資源

Type description
ConfigMap 明文設定檔/key value
Secret 具加密/編碼的 設定檔/ key value (default: Opaque 為base64)
DownwardAPI 將Pod的資訊(metadata)共享至container內 (透過 環境變數 or volume)

Auth

身份驗證的抽象化資源

Type description
ServiceAccount Pod身份驗證
UserAccount 管理員或開發者身份驗證

RBAC

Type description
Role namespace level role
RoleBinding attach role to resource
ClusterRole cluster level role
ClusterRoleBinding attach cluster role to resource