初探-介紹Kubernetes

前文

k8s前身是Google開發borg系統,用於管理Google系統,後面由許多borg核心開發人用利用Go語言改寫就造就Kubernetes

可以根據聲明式設定,管理、擴展我們的容器化應用編排系統

  • 有效安全幫我們執行Container Rollout
  • 能夠因應系統流量變化,進行伸縮擴容(Scaling)
  • Health check實現自動偵測故障及重啟功能
  • 透過Namespace有效幫我們做資源隔離

k8s協助我們方便掌控複雜容器系統架構,具有良好伸縮性

建議在閱讀k8s文章前先要有Docker相關知識,不然許多點會有看沒有懂

我們練習會使用k3d使用Docker建議k8s來練習

k8s 主要組件介紹

先來張圖(此圖來自wiki)wiki畫的很棒,我拿來借用一下XDD

developer 用 kubectl 利用(http restful API) 打到master node 中的 API Server (綠色區塊),進而控制 node 群體(藍色區塊)

透過kubectl api-resources -o wide可以查看目前所有Api Server提供的服務

master node

master node 又可以稱 control plan,存儲跟掌控Node就像是人類的大腦,所以裡面有些重要成員要跟大家介紹

  • kube-apiserver:接收使用者指令來操作Node or Pod.(唯一接受命令的服務)
  • etcd:可信賴的分布式key/value存儲服務,保存k8s需要持久化的配置資訊
  • kube-scheduler:負責調度Pod至Node並監控
  • kube-controller-manager:
    • 透過control loop監控cluster狀態並嘗試維持預期狀態,內建由多個controller集合體組成

kubectl

kubectl 封裝成CLI方便我們下達命令操作我們 k8s cluster control plan,經由 RESTful API 對 master node 進行操作 (需要有相應權限)

我們須先透過 ~/.kube/config 設定使用 cluster, context 及 user,建立完成後我們就可以對於Pod、deployment、 config map、service 進行建立、更新,刪除..動作.

透過cat ~/.kube/configkubectl config view查看目前 kubectl 設定
在config中current-context存放當前操作哪個k8s cluster

Pods

Pod是存放container程式(可以多個Container),是k8s調度中最小單位

一開始準備建立一個Pod會依序執行下面Container,在所有Init Container沒有執行成功前,Pod不會變成Ready狀態,Pod會處於Pedding狀態.

Pod執行Container順序為Pause Container => Init Containers => Main Container

Main Container為我們主要運作Container,如果Pod重啟,所有Init Container必須可重新執行.

  • Pod 具有自己的生命週期及階段 (Pending, Running, Succeed, Failed, Unknown)
  • 一般不建議直接建立 Pod,而是由更高階 controller 負責控制(ex:Deployment),達到更方便的控管
  • 一個 Pod 內的容器共享同一個網路

WorkNode

WorkNode 裡面存放許多 Pod 來執行 Container,提供資源來執行我們Pod

每個WorkNode都有下面兩個重要組件

  • Kubelet:負責與API Server 溝通,管理container生命週期(health check建立Pod),利用heartbeat定期跟Control plane說我還活著(有點類似Node的管家)

  • Kubeproxy:負責更新 Node 的 iptables,控制Pod跟load balance相關網路(有點類似Node的通訊兵)

kube controller manager

Controller 用更高層次來對待 Pod ,一般來說我們不會手動來管理 Pod 會交由 Controller 來幫我們管理完成.

在 Controller 種有下面幾中 Kind

  • ReplicaSet:確保並掌控預期 Pod 數量
  • Deployment:確保並掌控預期 Pod 數量,無狀態部屬,(一般我蠻常使用此模式)方便紅藍部屬
  • StatefulSet:有狀態的部屬
  • DaemonSet:確保 Node ,都運作指定 Pod (可以當作程式中 單例模式)
  • Job:執行一次性任務
  • Cronjob:定時執行任務

Service

  • 定義一組 Pods 訪問方式 (使用 lable 來圈定服務)
  • 提供 Pod Load Balance,支援多種方式(ClusterIP,NodePort,LoadBalance)

通常 Service 可以透過 Ingress 來將此組服務暴露給外部作 Http 請求

Label 用於對於資源塞選使用

k3d (Kubernetes in docker)

要建立k8s集群有點麻煩好在,有k3d可以利用container幫我們模擬k8s讓我們方便練習

安裝非常簡單依照k3d GitHub步驟一步一步就可以完成了.

linux 是用wget下載執行shell

wget -q -O - https://raw.githubusercontent.com/rancher/k3d/main/install.sh

window利用choco來下載

choco install k3d

下載完後可以利用k3d --version查看安裝版本資訊如下

1
2
k3d version v4.0.0
k3s version v1.20.0-k3s2 (default)

透過k3d cluster create mycluster建立k8s

建立完畢後使用docker ps可以看到我們k3d會跑在Docker中代表我們已經建立好k8s環境了

建立第一個Pod

環境建立好了,現在我們就來建立一個Pod來試試看

因為是為了讓大家快速感受 kubectl 命令一般我們在管理 k8s 不會直接管理 pod 而是會透過 controller 來管理,就像你是將軍你不會想直接管理小兵,你會對於軍官下達命令由他們去管理小兵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
labels:
run: my-nginx
name: nginx
spec:
containers:
- image: nginx:alpine
name: my-nginx
ports:
- containerPort: 80
resources:
limits:
cpu: 50m
memory: 100Mi
requests:
cpu: 30m
memory: 50Mi

我對於上面yaml設定檔大概說明一下

  • kind:代表要建立資源類型(此次範例是pod)
  • metadata:中繼資料描述
  • spec:Container,storage,volume以及其他Kubernetes需要的參數,以及諸如是否在容器失敗時重新啟動容器的屬性

在當前目錄存上面的yaml檔案叫做pods.yaml並執行讓k8s編排出我們要的資源

1
kubectl apply -f .\pods.yaml

執行完後我們可以利用kubectl get pods查看 pod 建立狀態

請求我們 pod 服務

我們利用 http://127.0.0.1 請求不到 nginx 是為什麼?

因為80 port是pod中Container使用的Port我們需要使用一些方式讓他可以給外面請求

所以我們可以利用,我們使用port-forward把pod container中的port暴露出來請求 http://127.0.0.1:8888/

1
kubectl port-forward nginx 8888:80

一般我們會透過 Service 資源來管理port 相關事情,日後有機會再跟大家說

小結

今天對於k8s簡單介紹幾個重要成員還有使用,希望對於想要入門k8s的人會有幫助.

日後有機會在寫其他k8s相關的文章.

此文作者:Daniel Shih(石頭)
此文地址https://isdaniel.github.io/kubernetes-first/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!


如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^