iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0
Kubernetes

從零開始的 Kubernetes 基礎觀念與實作系列 第 5

從零開始的 Kubernetes 基礎觀念與實作 DAY5

  • 分享至 

  • xImage
  •  

這篇文章會實作佈署一個Pod,主要參考資料為官方文件與minikube教程。
官方文件:https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/#create-a-deployment
minikube文件:https://minikube.cn/docs/

在DAY3中有提到Pod是Kubernetes中最小的可佈署單位,裡面運行著一個或多個容器,這些容器共享同一個網路、存儲資源與在這Pod中訂定的規則。
通常要創建一個Pod會使用工作負載(workload),來創建Pod,因為在Kubernetes中如果你直接創立Pod,這個Pod雖然可以跑,但是當你要更新、修理甚至是銷毀回收時就會比較麻煩,你會需要手動去處理這些問題,這樣跟你手動將容器啟動並上架服務沒有甚麼區別。

工作負載資源

workload是一種替使用者管理Pod,減輕負擔的資源類型。
底下為Kubernetes中所有的workload類型

  • Deployments:用於管理一組Pod,通常用於不保持狀態的應用負載,能夠讓Pod滾動式更新或回滾,是透過管理ReplicaSet,來間接管理Pod。
  • ReplicaSet:用來維護運行指定的Pod數量,比起使用ReplicaSet,官方更建議使用Deployments。
  • StatefulSet:用來運行一組Pod,會為每個Pod提供一個穩定的身分,可用於須長時間儲存、穩定的應用負載,通常會在有狀態應用負載使用。
  • DaemonSet:確保為一部分或全部的Node運行一個Pod,當有新的Node加入時也會為它新增一個Pod,當有Node移除或退出集群時也會回收刪除這個Pod,常見的用法是在每個節點上運行監控、日誌等的程序。
  • Job:用於運作一次性Pod,當任務完成後就會終止。
  • CronJob:會依照計畫執行一次性任務,比較像是一個會定期執行的Job。

實作

從本地載入image進行佈署

這裡示範使用Deployments來創立一個Pod。
在開始之前要先build一個image並往minikube上載入。
執行下面的指令可以將image載入minikube中,這樣在準備建立時minikube才找的到image。

 minikube image load [image名稱]

底下指令可查看minikube中所有的image

 minikube image ls

接著進行設定yaml檔,在進行pod的佈署配置時,官方是建議透過撰寫yaml檔案來進行設定。
由於預設上Kubernetes都是從網路上的image倉庫拉取image,所以還要從設定檔案上做變更,讓它從本地上拉取image,所以要在yaml設定imagePullPolicy: Never。
下面是從官方網站上的Deployments設定範例抓下來改的,[Deployment名稱]填入想給Deployment的名稱,[標籤]請都填同樣的名稱,[容器名稱]請填入你要給容器的名稱,[image名稱]請填入你在minikube上的image名稱。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: [Deployment名稱]
  labels:
    app: [標籤]
spec:
  replicas: 1
  selector:
    matchLabels:
      app: [標籤]
  template:
    metadata:
      labels:
        app: [標籤]
    spec:
      containers:
      - name: [容器名稱]
        image: [image名稱]
        imagePullPolicy: Never
        ports:
        - containerPort: 5000

這樣就將設定檔案寫好了。
輸入下面指令來將設定檔套用在kubernetes中。

kubectl apply -f [檔案路徑位置]

套用後kubernetes就會按照設定檔自動執行了。
使用kubectl get deployment [Deployment名稱] 指令查看

從image hub上拉取image進行佈署

kubernetes預設上就是會從image hub上拉取image進行佈署,相對於從本地上載入image而言會簡單許多。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: google-samples
  labels:
    app: google-samples
spec:
  replicas: 1
  selector:
    matchLabels:
      app: google-samples
  template:
    metadata:
      labels:
        app: google-samples
    spec:
      containers:
      - name: google-samples
        image: gcr.io/google-samples/hello-app:1.0
        imagePullPolicy: Always
        ports: 
        - containerPort: 5000

輸入下面指令來將設定檔套用在kubernetes中。

kubectl apply -f [檔案路徑位置]

kubernetes會從網路上拉取該image來進行佈署。
使用kubectl get deployment [Deployment名稱] 指令查看

小結

這裡只是用Deployments示範建立一個Pod,之後會將所有workload的特性更仔細的講解並實作一遍。
下一篇會介紹撰寫佈署kubernetes yaml檔時常用的設定。

補充

minikube image load是minikube中獨有的,如果是在正式環境中是不會有這種從本地載入到kubernetes中的指令,基本都是從網路上的倉庫拉取。
imagePullPolicy有三種選項

  • IfNotPresent:當本地沒有image時會到網路拉取。
    (當image標籤為:latest會將imagePullPolicy設置為Always,所以使用時要注意image標籤問題)
  • Always:不會看本地有無image,會直接到網路上拉取。
  • Never:直接在本地找image使用。

上一篇
從零開始的 Kubernetes 基礎觀念與實作 DAY4
下一篇
從零開始的 Kubernetes 基礎觀念與實作 DAY6
系列文
從零開始的 Kubernetes 基礎觀念與實作9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言