Concept

What is Kubernetes

用來管理 App 的備援(Replica 的管理)。

  • 平衡負載。
  • Storage Orchestration。
  • 自動降版。
  • Automatic bin packing:可以定義每個 container 可以存取的 CPU 及 RAM。
  • 自動修復:如果 App 掛了,會自動重啟 container 並取代之。
  • 敏感資料管理。

Control Plane Component

由數個小型服務組成,這些小型服務不需要建置在同台機器上。

  • kube-apiserver:Kubernetes API server,可以不只一顆。
  • etcd:用來儲存所有 cluster 的 data(應該是設定檔)。
    • 簡單的鍵值對。
  • kube-scheduler:用來管理新建的 pods 要放到哪個 node 去。
  • kube-controller-manager:
    • Node Controller
    • Replication Controller
    • Endpoints Controller
    • Service Account & Token Controllers
  • cloud-controller-manager

Node Component

跑在 Node 上,管理運行中的 Pod、提供 K8S 需要的 Runtime 環境。

  • kubelet:負責管理 Pod 及其中的 Container。
    • 依照 PodSpec 管理 Pod。
  • kube-proxy:管理 Node 上的網路,讓網路能夠跟 Pod 通訊。
  • Container runtime

Addon

好像沒什麼好說的... 就是可以裝 addon 的意思...

Cluster

由一個 Master, 即至少 1 個 Node 組成。

Master

管理整個 Cluster 及 Nodes。

Node

用來執行 Cluster 的業務/工作。

  • 運行容器化的 App。
  • 可以是個 VM、實體電腦。
  • kubelet:用來管理 Node 並與 Master 溝通。
  • 包含管理 Container 的工具,例如:Containerd、Docker。

Kubernetes Deployment

用來告訴 Kubernetes 如何建立/更新 App(應用程式)的 Instances。

  • 創建 Instance 後,Kubernetes Deployment Controller 會持續監控 Instance。如果該 Instance 壞掉,Controller 會用其他 Node 上的 Instance 替代。
  • Deployment 會創建 Pod(s) 來管理 App Instancec。

kubectl create deployment [DEPLOYMENT_NAME] --image=[DOCKER IMAGE]

建立 Deployment 並部署 App(應用程式)。

  • Step 1. 搜尋合適的 Node 。
  • Step 2. 安排(schedule)運行 App 在該 Node 上。
  • Step 3. 控制 Cluster 以在需要的時候重新安排(reschedule)App Instance。

kubectl delete deployment [DEPLOYMENT_NAME]

刪除 Deployment。

Viewing Pods and Nodes

Pod

  • 內含至少 1 個 Containerized App。
  • 內含用以管理內部 Apps 的資訊。例如:Image Version、Ports 的使用狀況。
  • Pod 內的 Apps 共用儲存空間(ex. Volumn)。
  • Pod 內的 Apps 共用 Cluster 派發的 IP 及 Port。
  • 有生命週期,跟著 Node。

範例:

一 Pod 內包含

  • Container 執行 Node.js app server
  • Container 執行 Node.js data server

app server 自 data server 獲取需要的資訊

Pods Overview

kubelet get pods

取得所有 pods 的列表

kubelet describe pods

取得所有 pods 的資訊

kubelet logs [POD_NAME]

印出 pod 中的 log

kubelet exec [POD_NAME] -- [CMD]

在 pod 中執行 commandline 指令

Node

  • 用來運行 Pod。
  • 一個 Node 上可以運行多個 Pod。
  • 可為 VM、實體電腦。
  • 至少包含:
    • Kubelet:與 Master 溝通;並管理旗下的 Pods、Container Runtime。
    • Container Runtime:用以運行 App。

Node Overview

Service

A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.

  • 可以透過 .ymal 檔定義。
  • 解開 Pods 間的耦合。
  • 可以用 LabelSelector 來控制 Service 要用哪一組 Pods。

Export Pod IP

可以透過定義 ServiceSpec 的 type,來進行 export。type 有以下幾種類型:

  • ClusterIP:預設值;只能在 Cluster 中存取 Service。

  • NodePort:[NODE_IP]:[NODE_PORT],ClusterIP 的父集合。

  • LoadBalancer:固定 IP,NodePort 的父集合。

  • ExternalName:有點類似自定義的 DNS 的 Domain Name。

從 Deployment 到 Service

  • Step 1:創建 Deployment
  • Step 2:kubectl expose deployments/[DEPLOYMENT_NAME] --type=[SERVICE_TYPE] --port=[EXPORTED_PORT]
    • [SERVICE_TYPE]ClusterIPNodePortLoadBalancerExternalName
    • [EXPORTED_PORT]:Pod 中要被外部存取的 port

kubectl describe services/[DEPLOYMENT_NAME] 中的 NodePort 即可透過 localhost:XXXX 存取。

透過上述方式創建的 Service 會由 K8S 指派 Label app=[DEPLOYMENT_NAME] 一樣。

可以透過 kubectl delete service [SERVICE_NAME] 刪除 service

增加 App 的分身 (Replica)

增加 App 的分身(Replicas);也就是增加 Pod。

kubectl scale deployments/[DEPLOYMENT_NAME] --replicas=[NUMBER]

更新 App

Kubernetes 更新 app 時為漸進式的,能夠在服務不中斷的情況下進行升級。

  • Kubernetes 會逐一的替換掉 Deployments 中的 Pod:創建一新版 App 的 Pod 後,關掉一舊版 App 的 Pod。
  • 更新過程中新舊版的 App 都有可能連到,端看 Kubernetes 的調度。
kubectl set deployments/[DEPLOYMENT_NAME] [IMAGE_NAME]=[NEW_IMAGE_WITH_VERSON_CODE]