Kubernetes 是一個用於部署和管理容器的編排系統。使用 Kubernetes,使用者可以通過自動執行管理任務(例如在跨節點間擴充套件容器並在容器停止時重新啟動任務),在不同環境中可靠地執行容器。
Kubernetes 提供的抽象可以讓你從 Pod(容器)、Services(網路端點)和 Jobs(一次性任務)等應用元件的角度進行思考。它有一個宣告式設定模型,可簡化設定並防止漂移,也就是使用者可以定義環境應該是什麼樣子,然後系統會自動應用操作來實現這種狀態。
瞭解如何使用 Kubernetes 的開發人員可以輕鬆複製生產基礎設施,並更多地參與運維。無論是在您的機器上本地部署,還是在雲中以生產規模部署,您可以使用相同的工具和流程,將您的工作部署到任何環境中。
瞭解 Kubernetes 還能讓您對系統擁有更大的自主權。您可以做出有影響力的改變,改善自己和他人的部署和操作體驗。當所有應用環境都使用 Kubernetes 執行時,每個人都在按照相同的共用部署模板工作,這樣減少了錯誤和差異的發生。如果操作員因生產中的問題而要求更改,您可以自行測試和驗證,而無需等待他們的反饋。這樣就縮短了開發週期,提高了工作效率。
過去幾年中,人們對 Kubernetes 的興趣日益高漲,因此熟悉 Kubernetes 也有助於未來的職業發展。Dynatrace 的一項 2023 年調查報告顯示,2022 年期間,Kubernetes 的採用率增長了 127%,CNCF 調查結果顯示 96% 的組織正在使用或評估該技術。Kubernetes 是一種流行技術,因此瞭解其工作原理、對應用程式的影響方式以及如何使用,可以增加您的就業前景。
正如我們已經簡要提到的,Kubernetes 有自己的物件型別詞彙表,代表叢集內不同型別的資源。有些元件是叢集本身的一部分,如節點(Nodes),而其他元件,如 Pod 和服務(Services),則是應用程式的模型部分。在深入學習本指南時,您需要熟悉這些術語。
Pods 是 Kubernetes 叢集中的計算單元。Pod 的每個範例可容納一個或多個容器,所有容器都排程到叢集中的同一個節點。與單個 Pod 的手動互動相對較少。它們通常由更高階別的控制器(如 ReplicaSets[1] 和 Deployments[2])建立,這些控制器為您管理 Pod 的複製和擴充套件。
Nodes 是叢集中的一臺物理機器。它執行一個名為 kubelet 的代理程序,負責與控制平面保持通訊。Nodes 負責執行容器。當你建立一個新 Pod 時,控制平面會根據資源利用率和你設定的任何 Nodes 選擇器等標準,選擇執行資源的最佳 Nodes 。被選中的 Node 會提取所需的映象並啟動容器。如果 Node離線,Kubernetes 會注意到它的缺席,並將 Pod 重新安排到叢集的不同成員。
Deployments 是 Kubernetes 的物件,促進 Pod 的宣告式更新,用於部署應用程式的主容器,而無需手動建立和維護 Pod 物件。
Deployments 有幾個優點。將 Deployment 新增到群集時,您可以定義要執行的容器映象和要建立的副本數量。Kubernetes 會根據請求的副本數量自動建立正確數量的 Pod,並將它們分佈到叢集中的節點上。通過修改 Deployment 物件的設定來新增更多副本,Kubernetes 將自動啟動更多 Pod 來滿足該情況。如果減少副本數量,Kubernetes 將刪除較舊的 Pod 以縮小規模。
Deployment 還允許您暫停擴充套件更改的推出,然後稍後恢復。您也可以回滾到以前的版本,確保快速緩解和解決新應用版本遇到的任何問題。
Kubernetes 叢集是應用程式執行的整體環境。它包括叢集中的 Nodes,以及管理整個系統的控制平面元件。
叢集的控制平面包括與你互動的 API 伺服器、將 Pod 分配給 Nodes 的排程器,以及實現特定叢集行為的控制器。這還包括一個用於持久化叢集狀態的 etcd 資料儲存。
Namespace 允許您將叢集資源組織到不同的邏輯組中。
叢集中的物件名稱只需在每個 Namespace 內是唯一的即可。
Namespace 通常用於將叢集劃分為多個環境,如development
和 production
。它允許多個使用者和應用程式在一個群集中共存。您可以通過設定配額來控制 Namespace 內的資源利用率,防止單個 Namespace 佔用所有可用容量。
一旦建立了 Kubernetes 叢集,就可以使用前面提到的 kubectl 與之互動。它是官方的命令列使用者端應用程式。讓我們來介紹幾個可以開始使用的簡單命令。
kubectl run
叢集中啟動一個新 Pod,執行指定的容器映象。這將啟動一個名為 nginx
的 Pod,執行nginx:latest
映象:
$ kubectl run nginx --image nginx:latest
pod/nginx created
get
命令會列出特定型別叢集中的所有物件,如pod
:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 81s
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 所採取的行動的有用資訊。
使用delete
命令從叢集中刪除命名物件:
$ kubectl delete pod nginx
pod "nginx" deleted
您可以通過多種方式將應用程式部署到 Kubernetes。Helm 是一種用於生產的流行解決方案,它為 Kubernetes 工作負載提供了一種包管理器體驗。當然,kubectl CLI 也是理想的入門工具。
在下面的步驟中,我們將演示如何通過建立 Deployment 物件,在 Kubernetes 中執行 NGINX Web 伺服器的多個副本。
如果您沒有可用的 Kubernetes 叢集,可以嘗試使用 minikube 在你的機器上快速啟動一個。
您可以使用以下 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 以恢復可用性。
您可以使用 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
您可以通過執行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
有時,您應用的更改可能不正確或不理想。例如,你可能選擇了錯誤的映象或指定了不正確的副本數量。Kubernetes 可通過一條命令回滾來處理這些情況:
$ kubectl rollout undo deployment nginx
deployment.apps/nginx rolled back
Deployment 的設定會恢復到之前的狀態。
您可以選擇指定要恢復的特定版本號:
$ kubectl rollout undo deployment nginx --to-revision=1
上述範例使用 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/