Pod

去耦化 = 獨立化

Pod 是 K8S 內最小的佈署單位,這表示在一個 Pod 內的所有東西,都會佈署豆到同意台機器上。
Pod 中的每個容器,都運行在自己的 cgroup 中,但互相共享一些 Linux namespace。
同一個 Pod 共享 IP,Port 與主機名稱

我要怎麼規劃 Pod 裡面的東西

如果在不同的容器內,應用程式還能運作嗎?如果不能,那就放在同一個 Pod,反之,則放在不同的 Pod,且如果 Pod 在不同機器時,程式可以運作嗎?

Pod Manifest 檔

  • 主要作用就是定義 Pod
  • 文字檔的格式
  • 會儲存在 etcd
  • 定義了 Pod 的所所需資源與 K8S 設定,元件透過 API 取得設定後,就會知道要如何處理這個 Pod,譬如由調度器取得 Pod manifest 檔後,開始將 Pod 佈署到不同的 Node

建立 Pod

簡單建立 Pod

ubkubectl run kuard –image=gcr.io/kuar-demo/kuard-amd64:1

查看 Pod:

kubectl get pods

刪除 Pod:

kubectl delete deployments/kuard

刪除所有的 Pods:

$ kubectl delete pods --all

建立 Pod Manifest 檔

支援 Yaml 或是 Json 格式撰寫,但通常使用 Yaml。

kuard-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: kuard
spec:
  containers:
  - image: gcr.io/kuar-demo/kuard-amd64:1
    name: kuard
    ports:
    - containerPort: 8080
      name: http
protocol: TCP

執行 Pod:

# kubectl apply -f kuard-pod.yaml

檢視 Pod 的詳細資訊:

# kubectl describe pods kuard

移除 Pod

# kubectl delete pods/kuard
or
# kubectl delete -f kuard-pod.yaml

並不會馬上被刪除,會等終止後才結束,避免已存在的連線中斷,預設的終止時間是 30 秒。

存取 Pod

設定連接埠轉發

kubectl port-forward kuard 8080:8080

成功後就可以透過 http://localhost:8080 存取 kuard Pod。

取得日誌檔

kubectl logs kuard

使用 -f 參數就可以持續監控 Pod。--pervious 參數可以從容器的前一個執行體取得日誌,對於一直重不斷重新啟動 Pod 來說,這參數恨好用。

從容器複製檔案

如果你想從容器中複製 /root/config.txt 檔到本機,可以執行:

kubectl cp <pod-name>:/root/config.txt ./config.txt

也可以複製本機檔案到 Pod 內:

# kubectl cp /root/config.txt <pod-name>:/config.txt

複製檔案到 Pod 內,是應急的作法,因為你會再下次升級 Pod 的時候,這個檔案就遺失了。

健康檢查

K8S 內建健康檢查探測器有分 Liveness 與 Readiness 探測器

Liveness 探測器

每一個容器定義一個探測器,寫在 Manifest 檔中,範例:

apiVersion: v1
kind: Pod
metadata:
  name: kuard
spec:
  containers:
    - image: gcr.io/kuar-demo/kuard-amd64:1
      name: kuard
      livenessProbe:
        httpGet:
          path: /healthy
          port: 8080
        initialDelaySeconds: 5
        timeoutSeconds: 1
        periodSeconds: 10
        failureThreshold: 3
      ports:
        - containerPort: 8080
          name: http
protocol: TCP

此處使用 httpGet 探測器,針對 8080 ,在容器啟動後 5 秒後,開始測試,容器必須在 1 秒內有回應,HTTP 的狀態要大於 200 小於 400,每 10 秒測試一次,當連續三次失敗,則 K8S 會重新啟動此 Pod。

Readiness 探測器

沒有講很多,補 G 一下

tcpSocket 探測器

可以建立類似 tcp 的 socket 連線,建立完成就算成功,可以用來測試一些非 HTTP 的 API 或是資料庫。

exec 探測器

利用容器內的腳本進行測試,K8S 可以利用 exec 直接執行命令稿,回傳 0 表示成功,非 0 表示失敗。

資源管理

Request:所需最小資源

定義每個容器所需要的最小資源,當系統可以負荷的時候,會給予 100% 的資源,但是若 Pod 的數量過多,開始分配資源的時候,系統就會依照此設定來分配最小資源

設定值是針對每個容器的最小需求,不是 Pod

資源管理

Request:所需最小資源

定義每個容器所需要的最小資源,當系統可以負荷的時候,會給予 100% 的資源,但是若 Pod 的數量過多,開始分配資源的時候,系統就會依照此設定來分配最小資源

設定值是針對每個容器的最小需求,不是 Pod

假設設定的是 0.5 的 CPU 需求,分配到 2 CPUs 的 Node 上,則此可以使用 2 CPUs,若是有新的 Pod 加入,則分配到 1 CPU,第三個進來則分配 0.66%,第四個進來則分配到 0.5 CPU,然後 Node 就會顯示滿載。
範例:

apiVersion: v1
kind: Pod
metadata:
    name: kuard
spec:
    containers:
    - name: kuard
    image: gcr.io/kuar-demo/kuard-amd64:1
    ports:
    - name: http
        containerPort: 8080
        protocol: TCP
    resources:
        requests:
            cpu: "500m"
            memory: "128Mi"

記憶體的限制跟 CPU 差不多,但是記憶體無法成重新分配,當記憶體不足時,使用量大的容器會被終止並重新啟動來降低記憶體的需求。

Limit:資源限制

Limit 就是容器所獲得的資源不會超過設定值,即使機器是屬於閒置的狀態,所分配到的資源還是會在 Limit 之下:

apiVersion: v1
kind: Pod
metadata:
    name: kuard
spec:
    containers:
    - name: kuard
    image: gcr.io/kuar-demo/kuard-amd64:1
    ports:
    - name: http
        containerPort: 8080
        protocol: TCP
    resources:
        requests:
            cpu: "500m"
            memory: "128Mi"
        limits:
            cpu: "1000m"
            memory: "256Mi"

            memory: "256Mi"

儲存空間(持久化資料)

容器內的資料在容器消失後,會一同消失,如果要保存容器內的資料,要將外部目錄掛在進容器內,目前的幾種方式

  • 容器之間互相保持資料同步
  • 掛載宿主主機的目錄到容器內,須避免 Node 一同損壞的問題
  • 掛在 NFS 到容器內
  • 掛載 AWS 等其他雲端的儲存空間到容器內

下面範例是掛載本機的 /var/lib/kuard 到容器內的 /data 內。

apiVersion: v1
kind: Pod
metadata:
    name: kuard
spec:
    containers:
    - name: kuard
    image: gcr.io/kuar-demo/kuard-amd64:1
    ports:
    - name: http
        containerPort: 8080
        protocol: TCP
    volumeMounts:
    - name: kuard-data
        mountPath: "/data"
    volumes:
    - name: kuard-data
    hostPath:
        path: "/var/lib/kuard"

總結

  • Request 最小需求
  • Limit 最大限制
  • LivenessProbe 探針 (檢康檢查)
  • ReadinessProbe 探針 (檢康檢查)
  • 永久儲存區

範例:

apiVersion: v1
kind: Pod
metadata:
name: kuard
spec:
volumes:
    - name: "kuard-data"
    nfs:
        server: my.nfs.server.local
        path: "/exports"
containers:
    - image: gcr.io/kuar-demo/kuard-amd64:1
    name: kuard
    ports:
        - containerPort: 8080
        name: http
        protocol: TCP
    resources:
        requests:
        cpu: "500m"
        memory: "128Mi"
        limits:
        cpu: "1000m"
        memory: "256Mi"
    volumeMounts:
        - mountPath: "/data"
        name: "kuard-data"
    livenessProbe:
        httpGet:
        path: /healthy
        port: 8080
        initialDelaySeconds: 5
        timeoutSeconds: 1
        periodSeconds: 10
        failureThreshold: 3
    readinessProbe:
        httpGet:
        path: /ready
        port: 8080
        initialDelaySeconds: 30
        timeoutSeconds: 1
        periodSeconds: 10
        failureThreshold: 3
文章資訊

slug:k8s-pod
title:k8s 的最小單位 Pod
tags:pod,k8s,Kubernetes
categories:k8s
thumbnail:banner-1.jpg

最後修改日期: 2019-08-27

作者