軟件開(kāi)發(fā)人員 Kubernetes 入門(mén)指南|Part 1

Kubernetes 是一個(gè)用于部署和管理容器的編排系統(tǒng)。使用 Kubernetes,用戶可以通過(guò)自動(dòng)執(zhí)行管理任務(wù)(例如在跨節(jié)點(diǎn)間擴(kuò)展容器并在容器停止時(shí)重新啟動(dòng)任務(wù)),在不同環(huán)境中可靠地運(yùn)行容器。
?
Kubernetes 提供的抽象可以讓你從 Pod(容器)、Services(網(wǎng)絡(luò)端點(diǎn))和 Jobs(一次性任務(wù))等應(yīng)用組件的角度進(jìn)行思考。它有一個(gè)聲明式配置模型,可簡(jiǎn)化設(shè)置并防止漂移,也就是用戶可以定義環(huán)境應(yīng)該是什么樣子,然后系統(tǒng)會(huì)自動(dòng)應(yīng)用操作來(lái)實(shí)現(xiàn)這種狀態(tài)。
?
軟件開(kāi)發(fā)人員為何要學(xué)習(xí) Kubernetes?
了解如何使用 Kubernetes 的開(kāi)發(fā)人員可以輕松復(fù)制生產(chǎn)基礎(chǔ)設(shè)施,并更多地參與運(yùn)維。無(wú)論是在您的機(jī)器上本地部署,還是在云中以生產(chǎn)規(guī)模部署,您可以使用相同的工具和流程,將您的工作部署到任何環(huán)境中。
?
了解 Kubernetes 還能讓您對(duì)系統(tǒng)擁有更大的自主權(quán)。您可以做出有影響力的改變,改善自己和他人的部署和操作體驗(yàn)。當(dāng)所有應(yīng)用環(huán)境都使用 Kubernetes 運(yùn)行時(shí),每個(gè)人都在按照相同的共享部署模板工作,這樣減少了錯(cuò)誤和差異的發(fā)生。如果操作員因生產(chǎn)中的問(wèn)題而要求更改,您可以自行測(cè)試和驗(yàn)證,而無(wú)需等待他們的反饋。這樣就縮短了開(kāi)發(fā)周期,提高了工作效率。
?
過(guò)去幾年中,人們對(duì) Kubernetes 的興趣日益高漲,因此熟悉 Kubernetes 也有助于未來(lái)的職業(yè)發(fā)展。Dynatrace 的一項(xiàng) 2023 年調(diào)查報(bào)告顯示,2022 年期間,Kubernetes 的采用率增長(zhǎng)了 127%,CNCF 調(diào)查結(jié)果顯示 96% 的組織正在使用或評(píng)估該技術(shù)。Kubernetes 是一種流行技術(shù),因此了解其工作原理、對(duì)應(yīng)用程序的影響方式以及如何使用,可以增加您的就業(yè)前景。
?
Kubernetes 的關(guān)鍵組件
正如我們已經(jīng)簡(jiǎn)要提到的,Kubernetes 有自己的對(duì)象類型詞匯表,代表集群內(nèi)不同類型的資源。有些組件是集群本身的一部分,如節(jié)點(diǎn)(Nodes),而其他組件,如 Pod 和服務(wù)(Services),則是應(yīng)用程序的模型部分。在深入學(xué)習(xí)本指南時(shí),您需要熟悉這些術(shù)語(yǔ)。
?
Pods
Pods 是 Kubernetes 集群中的計(jì)算單元。Pod 的每個(gè)實(shí)例可容納一個(gè)或多個(gè)容器,所有容器都調(diào)度到集群中的同一個(gè)節(jié)點(diǎn)。與單個(gè) Pod 的手動(dòng)交互相對(duì)較少。它們通常由更高級(jí)別的控制器(如 ReplicaSets[1] 和 Deployments[2])創(chuàng)建,這些控制器為您管理 Pod 的復(fù)制和擴(kuò)展。
?
Nodes
Nodes 是集群中的一臺(tái)物理機(jī)器。它運(yùn)行一個(gè)名為 kubelet 的代理進(jìn)程,負(fù)責(zé)與控制平面保持通信。Nodes 負(fù)責(zé)運(yùn)行容器。當(dāng)你創(chuàng)建一個(gè)新 Pod 時(shí),控制平面會(huì)根據(jù)資源利用率和你設(shè)置的任何 Nodes 選擇器等標(biāo)準(zhǔn),選擇運(yùn)行資源的最佳 Nodes 。被選中的 Node 會(huì)提取所需的鏡像并啟動(dòng)容器。如果 Node離線,Kubernetes 會(huì)注意到它的缺席,并將 Pod 重新安排到集群的不同成員。
?
Deployments
Deployments 是 Kubernetes 的對(duì)象,促進(jìn) Pod 的聲明式更新,用于部署應(yīng)用程序的主容器,而無(wú)需手動(dòng)創(chuàng)建和維護(hù) Pod 對(duì)象。
?
Deployments 有幾個(gè)優(yōu)點(diǎn)。將 Deployment 添加到群集時(shí),您可以定義要運(yùn)行的容器鏡像和要?jiǎng)?chuàng)建的副本數(shù)量。Kubernetes 會(huì)根據(jù)請(qǐng)求的副本數(shù)量自動(dòng)創(chuàng)建正確數(shù)量的 Pod,并將它們分布到集群中的節(jié)點(diǎn)上。通過(guò)修改 Deployment 對(duì)象的配置來(lái)添加更多副本,Kubernetes 將自動(dòng)啟動(dòng)更多 Pod 來(lái)滿足該情況。如果減少副本數(shù)量,Kubernetes 將刪除較舊的 Pod 以縮小規(guī)模。
?
Deployment 還允許您暫停擴(kuò)展更改的推出,然后稍后恢復(fù)。您也可以回滾到以前的版本,確??焖倬徑夂徒鉀Q新應(yīng)用版本遇到的任何問(wèn)題。
?
集群
Kubernetes 集群是應(yīng)用程序運(yùn)行的整體環(huán)境。它包括集群中的 Nodes,以及管理整個(gè)系統(tǒng)的控制平面組件。
?
集群的控制平面包括與你交互的 API 服務(wù)器、將 Pod 分配給 Nodes 的調(diào)度器,以及實(shí)現(xiàn)特定集群行為的控制器。這還包括一個(gè)用于持久化集群狀態(tài)的 etcd 數(shù)據(jù)存儲(chǔ)。
?
Namespace
Namespace 允許您將集群資源組織到不同的邏輯組中。
?
集群中的對(duì)象名稱只需在每個(gè) Namespace 內(nèi)是唯一的即可。
?
Namespace 通常用于將集群劃分為多個(gè)環(huán)境,如development
和?production
。它允許多個(gè)用戶和應(yīng)用程序在一個(gè)群集中共存。您可以通過(guò)設(shè)置配額來(lái)控制 Namespace 內(nèi)的資源利用率,防止單個(gè) Namespace 占用所有可用容量。
?
基本命令和操作
一旦建立了 Kubernetes 集群,就可以使用前面提到的 kubectl 與之交互。它是官方的命令行客戶端應(yīng)用程序。讓我們來(lái)介紹幾個(gè)可以開(kāi)始使用的簡(jiǎn)單命令。
?
kubectl run
kubectl run
集群中啟動(dòng)一個(gè)新 Pod,運(yùn)行指定的容器鏡像。這將啟動(dòng)一個(gè)名為?nginx
的 Pod,運(yùn)行nginx:latest
鏡像:
$ kubectl run nginx --image nginx:latest
pod/nginx created
?
kubectl get
get
命令會(huì)列出特定類型集群中的所有對(duì)象,如pod
:
$ kubectl get pods
NAME ? ?READY ? STATUS ? ?RESTARTS ? AGE
nginx ? 1/1 ? ? Running ? 0 ? ? ? ? ?81s
?
kubectl describe
describe
?提供特定命名對(duì)象的詳細(xì)信息:
$ kubectl describe pod nginx
Name: ? ? ? ? ? ? nginx
Namespace: ? ? ? ?defaultPriority: ? ? ? ? 0Service Account: ?defaultNode: ? ? ? ? ? ? minikube/192.168.49.2Start Time: ? ? ? Sat, 06 May 2023 13:21:07 +0100Labels: ? ? ? ? ? run=nginx
Annotations: ? ? ?<none>Status: ? ? ? ? ? RunningIP: ? ? ? ? ? ? ? 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
?
當(dāng)你需要排查特定對(duì)象的問(wèn)題時(shí),比如 Pod 為何停留在pending
狀態(tài)而不是running
狀態(tài),請(qǐng)使用該命令。?describe
輸出底部的Events
列表包含有關(guān) Kubernetes 所采取的行動(dòng)的有用信息。
?
kubectl delete
使用delete
命令從集群中刪除命名對(duì)象:
$ kubectl delete pod nginx
pod "nginx" deleted
?
在 Kubernetes 中部署應(yīng)用程序
您可以通過(guò)多種方式將應(yīng)用程序部署到 Kubernetes。Helm?是一種用于生產(chǎn)的流行解決方案,它為 Kubernetes 工作負(fù)載提供了一種包管理器體驗(yàn)。當(dāng)然,kubectl CLI?也是理想的入門(mén)工具。
?
在下面的步驟中,我們將演示如何通過(guò)創(chuàng)建 Deployment 對(duì)象,在 Kubernetes 中運(yùn)行 NGINX Web 服務(wù)器的多個(gè)副本。
?
如果您沒(méi)有可用的 Kubernetes 集群,可以嘗試使用 minikube 在你的機(jī)器上快速啟動(dòng)一個(gè)。
?
創(chuàng)建 Deployment
您可以使用以下 kubectl 命令創(chuàng)建新的部署:
$ kubectl create deployment nginx --image nginx:latest --replicas 3deployment.apps/nginx created
?
添加一個(gè)名為nginx
?的 Deployment 對(duì)象,該對(duì)象運(yùn)行nginx:latest
容器鏡像。運(yùn)行以下命令即可看到該對(duì)象:
$ kubectl get deployments
NAME ? ?READY ? UP-TO-DATE ? AVAILABLE ? AGE
nginx ? 3/3 ? ? 3 ? ? ? ? ? ?3 ? ? ? ? ? 45s
?
此輸出確認(rèn)已請(qǐng)求了三個(gè)副本,并且三個(gè)副本都已準(zhǔn)備就緒。Deployment 已自動(dòng)創(chuàng)建 Pod 以運(yùn)行容器:
$ 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
?
根據(jù)您指定的副本數(shù)量,有三個(gè) Pod?,F(xiàn)在嘗試刪除其中一個(gè):
$ kubectl delete pod nginx-654975c8cd-bbphv
pod "nginx-654975c8cd-bbphv"
?
現(xiàn)在重復(fù)命令列出 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
?
集群中仍有三個(gè) Pod。在您刪除舊的 Pod 后,Deployment 發(fā)現(xiàn)與您請(qǐng)求的三個(gè)副本有偏差。它自動(dòng)添加了一個(gè)新 Pod 以恢復(fù)可用性。
?
擴(kuò)展 Deployment
您可以使用?kubectl scale
?命令更改副本數(shù)量。確定要更改的 Deployment 和要應(yīng)用的新副本數(shù)量:
$ kubectl scale deployment nginx --replicas 5
deployment.apps/nginx scaled
?
Deployment 控制器會(huì)自動(dòng)向群集添加兩個(gè)新 Pod,以滿足更新后的副本數(shù)量:
$ 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
您可以通過(guò)運(yùn)行kubectl edit
來(lái)更改 Deployment 的屬性。這將在默認(rèn)編輯器中打開(kāi) Deployment 的 YAML 清單:
$ kubectl edit deployment nginx
?
向下滾動(dòng)文件,找到?spec.template.spec.containers
?部分。將?image
?屬性的值從?nginx:latest
?改為?nginx:stable-alpine
。

?
保存并關(guān)閉文件。
?
Deployment 會(huì)將 Pod 替換為使用?stable-alpine
?圖像標(biāo)記的新 Pod。使用 kubectl 列出群集的 Pod 或 Deployment,并監(jiān)控推出情況:
$ kubectl get deployment
NAME ? ?READY ? UP-TO-DATE ? AVAILABLE ? AGE
nginx ? 4/5 ? ? 5 ? ? ? ? ? ?4 ? ? ? ? ? 10m
?
回滾 Deployment
有時(shí),您應(yīng)用的更改可能不正確或不理想。例如,你可能選擇了錯(cuò)誤的鏡像或指定了不正確的副本數(shù)量。Kubernetes 可通過(guò)一條命令回滾來(lái)處理這些情況:
$ kubectl rollout undo deployment nginx
deployment.apps/nginx rolled back
?
Deployment 的配置會(huì)恢復(fù)到之前的狀態(tài)。
?
您可以選擇指定要恢復(fù)的特定版本號(hào):
$ kubectl rollout undo deployment nginx --to-revision=1
?
聲明式管理 Deployment
上述示例使用 kubectl 命令來(lái)定義和管理 Deployment。這對(duì)入門(mén)很方便,也可以編寫(xiě) YAML 清單來(lái)創(chuàng)建對(duì)象。這些清單可以作為源代碼的一部分進(jìn)行版本控制。
?
下面是與之前創(chuàng)建的 Deployment 相對(duì)應(yīng)的 YAML 清單:
apiVersion: apps/v1kind: Deploymentmetadata:
?name: nginxspec:
?replicas: 3
?selector:
? ?matchLabels:
? ? ?app: nginx
?template:
? ?metadata:
? ? ?labels:
? ? ? ?app: nginx
? ?spec:
? ? ?containers:
? ? ? ?- name: nginx
? ? ? ? ?image: nginx:latest
?
這部分演示了我們之前介紹過(guò)的標(biāo)簽和選擇器機(jī)制。該 Deployment 包括一個(gè) Pod 的清單模板,每個(gè) Pod 都分配了?app: nginx
?標(biāo)簽。其配置了相應(yīng)的標(biāo)簽選擇器(label selector),因此標(biāo)記?app: nginx
?的 Pod 將成為該 Deployment 的一部分。
?
將 YAML 保存為?deployment.yaml
,然后使用以下命令將其應(yīng)用到集群中:
$ kubectl apply -f deployment.yaml
deployment.apps/nginx created
?
要修改 Deployment ,只需編輯原始 YAML 文件即可。嘗試將?spec.replicas
?字段改為 5,然后重復(fù)該命令以應(yīng)用您的更改:
$ kubectl apply -f deployment.yaml
deployment.apps/nginx configured
?
Kubernetes 會(huì)自動(dòng)將集群轉(zhuǎn)換到新的理想狀態(tài),添加新的 Pod 以實(shí)現(xiàn)更新的副本數(shù):
$ 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
?
總結(jié)
Kubernetes 可跨物理節(jié)點(diǎn)集群協(xié)調(diào)容器部署,使用 Pod 和 Deployment 等對(duì)象有效地建模應(yīng)用程序組件。您可以擴(kuò)展容器副本,而無(wú)需自己管理故障、依賴關(guān)系、網(wǎng)絡(luò)和存儲(chǔ)。
?
學(xué)習(xí) Kubernetes:
掌握一項(xiàng)多年來(lái)在快速發(fā)展的云原生運(yùn)維領(lǐng)域炙手可熱的技能;
更清楚地了解代碼是如何在生產(chǎn)中到達(dá)用戶的;
掌握運(yùn)維團(tuán)隊(duì)用來(lái)部署實(shí)時(shí)應(yīng)用程序的相同工具;
可以運(yùn)行自己的本地 Kubernetes 集群,在開(kāi)發(fā)人員工作站上準(zhǔn)確復(fù)制生產(chǎn)基礎(chǔ)架構(gòu),從而減少環(huán)境之間的差異。
?
現(xiàn)在,你已經(jīng)了解了 Kubernetes 的基本概念,并看到了如何管理簡(jiǎn)單的容器部署。在本系列的第 2 部分,我們將更深入地了解 Kubernetes 網(wǎng)絡(luò)和監(jiān)控,以便您在集群中進(jìn)行實(shí)際應(yīng)用。
?
原文鏈接:
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/
?