軟體開發人員 Kubernetes 入門指南|Part 1

2023-10-11 12:02:45

Kubernetes 是一個用於部署和管理容器的編排系統。使用 Kubernetes,使用者可以通過自動執行管理任務(例如在跨節點間擴充套件容器並在容器停止時重新啟動任務),在不同環境中可靠地執行容器。
 

Kubernetes 提供的抽象可以讓你從 Pod(容器)、Services(網路端點)和 Jobs(一次性任務)等應用元件的角度進行思考。它有一個宣告式設定模型,可簡化設定並防止漂移,也就是使用者可以定義環境應該是什麼樣子,然後系統會自動應用操作來實現這種狀態。
 

軟體開發人員為何要學習 Kubernetes?

瞭解如何使用 Kubernetes 的開發人員可以輕鬆複製生產基礎設施,並更多地參與運維。無論是在您的機器上本地部署,還是在雲中以生產規模部署,您可以使用相同的工具和流程,將您的工作部署到任何環境中。
 

瞭解 Kubernetes 還能讓您對系統擁有更大的自主權。您可以做出有影響力的改變,改善自己和他人的部署和操作體驗。當所有應用環境都使用 Kubernetes 執行時,每個人都在按照相同的共用部署模板工作,這樣減少了錯誤和差異的發生。如果操作員因生產中的問題而要求更改,您可以自行測試和驗證,而無需等待他們的反饋。這樣就縮短了開發週期,提高了工作效率。
 

過去幾年中,人們對 Kubernetes 的興趣日益高漲,因此熟悉 Kubernetes 也有助於未來的職業發展。Dynatrace 的一項 2023 年調查報告顯示,2022 年期間,Kubernetes 的採用率增長了 127%,CNCF 調查結果顯示 96% 的組織正在使用或評估該技術。Kubernetes 是一種流行技術,因此瞭解其工作原理、對應用程式的影響方式以及如何使用,可以增加您的就業前景。
 

Kubernetes 的關鍵元件

正如我們已經簡要提到的,Kubernetes 有自己的物件型別詞彙表,代表叢集內不同型別的資源。有些元件是叢集本身的一部分,如節點(Nodes),而其他元件,如 Pod 和服務(Services),則是應用程式的模型部分。在深入學習本指南時,您需要熟悉這些術語。
 

Pods

Pods 是 Kubernetes 叢集中的計算單元。Pod 的每個範例可容納一個或多個容器,所有容器都排程到叢集中的同一個節點。與單個 Pod 的手動互動相對較少。它們通常由更高階別的控制器(如 ReplicaSets[1] 和 Deployments[2])建立,這些控制器為您管理 Pod 的複製和擴充套件。
 

Nodes

Nodes 是叢集中的一臺物理機器。它執行一個名為 kubelet 的代理程序,負責與控制平面保持通訊。Nodes 負責執行容器。當你建立一個新 Pod 時,控制平面會根據資源利用率和你設定的任何 Nodes 選擇器等標準,選擇執行資源的最佳 Nodes 。被選中的 Node 會提取所需的映象並啟動容器。如果 Node離線,Kubernetes 會注意到它的缺席,並將 Pod 重新安排到叢集的不同成員。
 

Deployments

Deployments 是 Kubernetes 的物件,促進 Pod 的宣告式更新,用於部署應用程式的主容器,而無需手動建立和維護 Pod 物件。
 

Deployments 有幾個優點。將 Deployment 新增到群集時,您可以定義要執行的容器映象和要建立的副本數量。Kubernetes 會根據請求的副本數量自動建立正確數量的 Pod,並將它們分佈到叢集中的節點上。通過修改 Deployment 物件的設定來新增更多副本,Kubernetes 將自動啟動更多 Pod 來滿足該情況。如果減少副本數量,Kubernetes 將刪除較舊的 Pod 以縮小規模。
 

Deployment 還允許您暫停擴充套件更改的推出,然後稍後恢復。您也可以回滾到以前的版本,確保快速緩解和解決新應用版本遇到的任何問題。
 

叢集

Kubernetes 叢集是應用程式執行的整體環境。它包括叢集中的 Nodes,以及管理整個系統的控制平面元件。
 

叢集的控制平面包括與你互動的 API 伺服器、將 Pod 分配給 Nodes 的排程器,以及實現特定叢集行為的控制器。這還包括一個用於持久化叢集狀態的 etcd 資料儲存。
 

Namespace

Namespace 允許您將叢集資源組織到不同的邏輯組中
 

叢集中的物件名稱只需在每個 Namespace 內是唯一的即可。

 

Namespace 通常用於將叢集劃分為多個環境,如developmentproduction。它允許多個使用者和應用程式在一個群集中共存。您可以通過設定配額來控制 Namespace 內的資源利用率,防止單個 Namespace 佔用所有可用容量。
 

基本命令和操作

一旦建立了 Kubernetes 叢集,就可以使用前面提到的 kubectl 與之互動。它是官方的命令列使用者端應用程式。讓我們來介紹幾個可以開始使用的簡單命令。
 

kubectl run

kubectl run叢集中啟動一個新 Pod,執行指定的容器映象。這將啟動一個名為 nginx的 Pod,執行nginx:latest映象:

$ kubectl run nginx --image nginx:latest 
pod/nginx created

 

kubectl get

get命令會列出特定型別叢集中的所有物件,如pod

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          81s

 

kubectl describe

describe 提供特定命名物件的詳細資訊:

$ kubectl describe pod nginx
Name:             nginx
Namespace:        default
Priority:         0
Service Account:  default
Node:             minikube/192.168.49.2
Start Time:       Sat, 06 May 2023 13:21:07 +0100
Labels:           run=nginx
Annotations:      <none>
Status:           Running
IP:               10.244.0.8
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  2m9s  default-scheduler  Successfully assigned default/nginx to minikube
  Normal  Pulling    2m8s  kubelet            Pulling image "nginx:latest"
  Normal  Pulled     2m    kubelet            Successfully pulled image "nginx:latest" in 8.202082294s (8.202097725s including waiting)
  Normal  Created    2m    kubelet            Created container nginx
  Normal  Started    2m    kubelet            Started container nginx

 

當你需要排查特定物件的問題時,比如 Pod 為何停留在pending狀態而不是running狀態,請使用該命令。 describe輸出底部的Events列表包含有關 Kubernetes 所採取的行動的有用資訊。
 

kubectl delete

使用delete命令從叢集中刪除命名物件:

$ kubectl delete pod nginx 
pod "nginx" deleted

 

在 Kubernetes 中部署應用程式

您可以通過多種方式將應用程式部署到 Kubernetes。Helm 是一種用於生產的流行解決方案,它為 Kubernetes 工作負載提供了一種包管理器體驗。當然,kubectl CLI 也是理想的入門工具。
 

在下面的步驟中,我們將演示如何通過建立 Deployment 物件,在 Kubernetes 中執行 NGINX Web 伺服器的多個副本。
 

如果您沒有可用的 Kubernetes 叢集,可以嘗試使用 minikube 在你的機器上快速啟動一個。

 

建立 Deployment

您可以使用以下 kubectl 命令建立新的部署:

$ kubectl create deployment nginx --image nginx:latest --replicas 3
deployment.apps/nginx created

 

新增一個名為nginx 的 Deployment 物件,該物件執行nginx:latest容器映象。執行以下命令即可看到該物件:

$ kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           45s

 

此輸出確認已請求了三個副本,並且三個副本都已準備就緒。Deployment 已自動建立 Pod 以執行容器:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-74rjx   1/1     Running   0          113s
nginx-654975c8cd-7mkwk   1/1     Running   0          113s
nginx-654975c8cd-bbphv   1/1     Running   0          113s

 

根據您指定的副本數量,有三個 Pod。現在嘗試刪除其中一個:

$ kubectl delete pod nginx-654975c8cd-bbphv
pod "nginx-654975c8cd-bbphv"

 

現在重複命令列出 Pod:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-74rjx   1/1     Running   0          2m57s
nginx-654975c8cd-7mkwk   1/1     Running   0          2m57s
nginx-654975c8cd-vrkvb   1/1     Running   0          19s

 

叢集中仍有三個 Pod。在您刪除舊的 Pod 後,Deployment 發現與您請求的三個副本有偏差。它自動新增了一個新 Pod 以恢復可用性。
 

擴充套件 Deployment

您可以使用 kubectl scale 命令更改副本數量。確定要更改的 Deployment 和要應用的新副本數量:

$ kubectl scale deployment nginx --replicas 5
deployment.apps/nginx scaled

 

Deployment 控制器會自動向群集新增兩個新 Pod,以滿足更新後的副本數量:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-74rjx   1/1     Running   0          5m11s
nginx-654975c8cd-7mkwk   1/1     Running   0          5m11s
nginx-654975c8cd-b7hg6   1/1     Running   0          37s
nginx-654975c8cd-hnklt   1/1     Running   0          37s
nginx-654975c8cd-vrkvb   1/1     Running   0          2m33s

 

更新 Deployment

您可以通過執行kubectl edit來更改 Deployment 的屬性。這將在預設編輯器中開啟 Deployment 的 YAML 清單:

$ kubectl edit deployment nginx

 

向下捲動檔案,找到 spec.template.spec.containers 部分。將 image 屬性的值從 nginx:latest 改為 nginx:stable-alpine

 

儲存並關閉檔案。
 

Deployment 會將 Pod 替換為使用 stable-alpine 影象標記的新 Pod。使用 kubectl 列出群集的 Pod 或 Deployment,並監控推出情況:

$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   4/5     5            4           10m

 

回滾 Deployment

有時,您應用的更改可能不正確或不理想。例如,你可能選擇了錯誤的映象或指定了不正確的副本數量。Kubernetes 可通過一條命令回滾來處理這些情況:

$ kubectl rollout undo deployment nginx
deployment.apps/nginx rolled back

 

Deployment 的設定會恢復到之前的狀態。
 

您可以選擇指定要恢復的特定版本號:

$ kubectl rollout undo deployment nginx --to-revision=1

 

宣告式管理 Deployment

上述範例使用 kubectl 命令來定義和管理 Deployment。這對入門很方便,也可以編寫 YAML 清單來建立物件。這些清單可以作為原始碼的一部分進行版本控制。
 

下面是與之前建立的 Deployment 相對應的 YAML 清單:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest

 

這部分演示了我們之前介紹過的標籤和選擇器機制。該 Deployment 包括一個 Pod 的清單模板,每個 Pod 都分配了 app: nginx 標籤。其設定了相應的標籤選擇器(label selector),因此標記 app: nginx 的 Pod 將成為該 Deployment 的一部分。
 

將 YAML 儲存為 deployment.yaml,然後使用以下命令將其應用到叢集中:

$ kubectl apply -f deployment.yaml
deployment.apps/nginx created

 

要修改 Deployment ,只需編輯原始 YAML 檔案即可。嘗試將 spec.replicas 欄位改為 5,然後重複該命令以應用您的更改:

$ kubectl apply -f deployment.yaml
deployment.apps/nginx configured

 

Kubernetes 會自動將叢集轉換到新的理想狀態,新增新的 Pod 以實現更新的副本數:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-8xqd8   1/1     Running   0          91s
nginx-654975c8cd-mjwjp   1/1     Running   0          91s
nginx-654975c8cd-ngnvv   1/1     Running   0          6s
nginx-654975c8cd-qkf2d   1/1     Running   0          6s
nginx-654975c8cd-tb6z6   1/1     Running   0          91s

 

總結

Kubernetes 可跨物理節點叢集協調容器部署,使用 Pod 和 Deployment 等物件有效地建模應用程式元件。您可以擴充套件容器副本,而無需自己管理故障、依賴關係、網路和儲存。
 

學習 Kubernetes:

  • 掌握一項多年來在快速發展的雲原生運維領域炙手可熱的技能;

  • 更清楚地瞭解程式碼是如何在生產中到達使用者的;

  • 掌握運維團隊用來部署實時應用程式的相同工具;

  • 可以執行自己的本地 Kubernetes 叢集,在開發人員工作站上準確複製生產基礎架構,從而減少環境之間的差異。
     

現在,你已經瞭解了 Kubernetes 的基本概念,並看到了如何管理簡單的容器部署。在本系列的第 2 部分,我們將更深入地瞭解 Kubernetes 網路和監控,以便您在叢集中進行實際應用。
 

原文連結
https://komodor.com/blog/a-software-developers-guide-to-getting-started-with-kubernetes-part-1/
參考連結
[1]https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
[2]https://kubernetes.io/docs/concepts/workloads/controllers/deployment/