云原生核心技術 (7/12): K8s 核心概念白話解讀(上):Pod 和 Deployment 究竟是什么?

大家好,歡迎來到《云原生核心技術》系列的第七篇!

在上一篇,我們成功地使用 Minikube 或 kind 在自己的電腦上搭建起了一個迷你但功能完備的 Kubernetes 集群。現在,我們就像一個擁有了一塊嶄新數字土地的農場主,是時候在這片土地上播種、耕作了。

那么問題來了,我們該如何把之前用 Docker 打包好的應用(容器)種植到 K8s 這片廣袤的土地上呢?直接扔進去嗎?

當然不行。K8s 有一套自己的“種植”規則。今天,我們就來學習這套規則里最基本的兩個概念:PodDeployment。它們是你在 K8s 世界里打交道最多的兩個朋友。


一、 Pod:K8s 世界的“原子單位”,為什么不是直接部署容器?

在 Docker 的世界里,我們操作的最小單位是“容器”。但到了 K8s,你會發現最小的部署單位是一個叫 Pod 的東西。

一個常見的疑問是:為什么 K8s 不直接管理容器,非要引入一個 Pod 的概念呢?

為了回答這個問題,我們先來看一個比喻:

把一個容器想象成一個

那么 Pod 就像一套房子

K8s 分配資源時,不是按“人頭”(容器)分的,而是按“戶口”(Pod)分的。它可以給一套房子(一個Pod)分配一個獨立的 IP 地址、主機名和一套獨立的“水電煤氣”(網絡、存儲等資源)。

這套房子里,可以只住一個人(單容器 Pod),這也是最常見的用法。但 K8s 也允許你讓多個人(多容器)合租在同一套房子里。

合租的好處是什么?
住在同一屋檐下的人,他們:

  1. 共享同一個“家庭住址”(共享網絡命名空間):他們可以用 localhost 直接互相訪問,就像家人之間串門一樣,不需要出門繞到大街上(外部網絡)。這對于需要緊密協作的程序(比如一個業務容器和一個日志收集容器)來說非常高效。
  2. 共享“儲藏室”(共享存儲卷 Volume):他們可以輕松地共享文件,就像家人共用一個冰箱一樣。

總結一下:Pod 是 K8s 調度、管理和資源分配的最小單位。它將一個或多個緊密關聯的容器打包在一起,為它們提供共享的存儲和網絡資源,形成一個內聚的服務單元。

動手:編寫并運行你的第一個 Pod

在 K8s 中,我們通常不使用命令行直接創建資源,而是通過編寫 YAML 文件來“聲明”我們想要的狀態。這就像給 K8s 一張建筑藍圖,它會負責照著藍圖施工。

創建一個名為 nginx-pod.yaml 的文件,內容如下:

# nginx-pod.yaml# API 版本,表明這個對象屬于哪個 API 組
apiVersion: v1
# 資源類型,我們正在創建一個 Pod
kind: Pod
# 元數據,包含資源的名稱、標簽等信息
metadata:name: nginx-hello-podlabels:app: web
# 規格,定義了這個 Pod 的期望狀態
spec:# Pod 中包含的容器列表containers:# 第一個容器- name: nginx-container# 使用的 Docker 鏡像image: nginx:1.21# 容器需要暴露的端口ports:- containerPort: 80

現在,打開你的終端,使用 kubectl 來應用這個藍圖:

# 確保你的 kubectl 已經連接到 Minikube 或 kind 集群
kubectl apply -f nginx-pod.yaml

執行后,K8s 就會開始創建這個 Pod。我們可以查看它的狀態:

kubectl get pods# 你會看到類似下面的輸出:
# NAME              READY   STATUS    RESTARTS   AGE
# nginx-hello-pod   1/1     Running   0          15s

Running 狀態表示我們的 Nginx Pod 已經成功運行起來了!


二、 Deployment:應用的“狀態維護者”與“智能管家”

我們現在有了一個正在運行的 Pod。但是,如果這個 Pod 因為某些原因(比如程序 Bug、節點故障)掛掉了怎么辦?它就真的消失了,沒有人會去管它。這在生產環境中是絕對無法接受的。

我們需要一個更高級的“管家”,它能確保我們的應用:

  • 永不宕機:如果一個 Pod 掛了,它能自動創建一個新的來替代。
  • 數量可控:我們可以告訴它,“請確保始終有3個相同的 Pod 在運行”,它就會自動維護這個數量。
  • 輕松更新:當我們想更新應用版本時,它能平滑地、滾動地用新版 Pod 替換舊版 Pod,保證業務不中斷。
  • 一鍵回滾:如果新版本有問題,它能一鍵回退到上一個穩定版本。

這個智能管家,就是 Deployment

再次使用比喻:

如果 Pod 是一間公寓,那么 Deployment 就是這棟公寓的物業經理

你不會親自去管理每一間公寓的入住和維修。你只需要告訴物業經理:“我需要這棟樓里始終有50間公寓是租出去并且正常運作的,租戶是 Nginx v1.21”。

經理會負責招租(創建 Pod),檢查水電(監控 Pod 健康),如果租戶跑了(Pod 掛了)就立刻找新租戶(創建新 Pod),如果你想升級所有公寓的裝修(更新應用版本),經理會一間一間地施工(滾動更新)。

動手:用 Deployment 部署應用

讓我們來創建一個 nginx-deployment.yaml 文件,用 Deployment 的方式來部署 Nginx。

# nginx-deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:# 期望的 Pod 副本數量replicas: 3# 選擇器,告訴 Deployment 要管理哪些 Pod# Deployment 通過這個標簽找到它應該管理的 Podselector:matchLabels:app: nginx-server# Pod 模板,這就是 Deployment 創建新 Pod 時使用的“藍圖”# 注意,這里的結構和我們上面定義的 Pod YAML 的 spec 部分幾乎一樣template:metadata:# Pod 的標簽,必須和上面的 selector.matchLabels 匹配labels:app: nginx-serverspec:containers:- name: nginximage: nginx:1.21ports:- containerPort: 80

應用這個 YAML 文件:

kubectl apply -f nginx-deployment.yaml

查看 Deployment 和它創建的 Pods:

kubectl get deployment# 輸出:
# NAME               READY   UP-TO-DATE   AVAILABLE   AGE
# nginx-deployment   3/3     3            3           20skubectl get pods# 輸出: (注意,Pod 名稱是 Deployment 名稱加上隨機字符串)
# NAME                                READY   STATUS    RESTARTS   AGE
# nginx-deployment-6b6c47948c-7v9d8   1/1     Running   0          25s
# nginx-deployment-6b6c47948c-8l9f4   1/1     Running   0          25s
# nginx-deployment-6b6c47948c-k5z2x   1/1     Running   0          25s

看!Deployment 嚴格按照我們的要求 replicas: 3,創建并維護了3個 Nginx Pod。


三、實戰演練:見證 Deployment 的“魔法時刻”

現在,讓我們親眼見證 Deployment 作為“智能管家”的神奇能力。

1. 魔法一:故障自愈 (Self-healing)

我們來手動“干掉”一個 Pod,模擬一次故障。

首先,獲取 Pod 列表,隨便挑一個名字記下來:
kubectl get pods

然后,無情地刪除它:

# 將 <your-pod-name> 替換為你復制的 Pod 名稱
kubectl delete pod <your-pod-name>

現在,立刻、馬上再次查看 Pod 列表,并使用 -w (watch) 參數持續觀察變化:

kubectl get pods -w

你會看到一個激動人心的場面:

  1. 你刪除的那個 Pod 狀態會變為 Terminating(正在終止)。
  2. 幾乎在同一時間,一個新的 Pod 會立刻出現,狀態從 Pending -> ContainerCreating -> Running
  3. 最終,Pod 的總數依然是3個!

這就是 K8s 的故障自愈能力,由 Deployment 精確執行。

2. 魔法二:滾動更新 (Rolling Update)

我們的應用要發布新版本了,比如把 Nginx 從 1.21 升級到 1.22

直接編輯 nginx-deployment.yaml 文件,將 image: nginx:1.21 修改為 image: nginx:1.22

# ...spec:containers:- name: nginximage: nginx:1.22 # <--- 修改這里ports:- containerPort: 80

保存文件后,再次執行 apply 命令:
kubectl apply -f nginx-deployment.yaml

再次用 -w 觀察 Pod 變化:kubectl get pods -w

你會看到 K8s 正在進行“滾動更新”:
它會先創建一個新版本的 Pod,等新 Pod 啟動并準備就緒后,再優雅地終止一個舊版本的 Pod。如此循環,直到所有 Pod 都被更新為新版本。整個過程服務不中斷!

你可以通過以下命令查看更新狀態:
kubectl rollout status deployment/nginx-deployment

3. 魔法三:一鍵回滾 (Rollback)

糟糕!新版本 1.22 有一個重大 Bug,我們需要緊急回退到上一個版本!

別慌,Deployment 已經為我們記錄了歷史版本。執行回滾命令即可:

kubectl rollout undo deployment/nginx-deployment

再次觀察 Pod 變化 kubectl get pods -w,你會發現 K8s 又開始了一次滾動操作,這次是把 1.22 版本的 Pod 逐個替換回 1.21 版本。危機解除!


總結

今天我們學習了 K8s 中兩個最核心、最基礎的概念:

  • Pod: K8s 的原子調度單元,是容器的“家”,為內部容器提供共享的網絡和存儲。
  • Deployment: Pod 的“智能管家”,負責保證 Pod 的數量(副本)、實現故障自愈、并以安全、平滑的方式進行應用更新和回滾。

你現在已經掌握了在 K8s 中部署、更新和維護無狀態應用的基本技能。我們已經成功地讓應用在集群內部“活起來”并且“活得很好”。

但是,新的問題又來了:現在這些 Nginx 服務都運行在 K8s 集群內部,我們作為外部用戶,如何才能訪問到它們呢?

別急,這正是我們下一篇文章要解決的問題。在下一篇 《K8s 核心概念白話解讀(下)》 中,我們將揭秘 ServiceIngress 這兩個負責“對外暴露服務”和“管理流量”的關鍵角色。敬請期待!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84456.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為云Flexus+DeepSeek征文 | 基于ModelArts Studio、DeepSeek大模型和Dify搭建網站智能客服助手

目錄 一、前言 二、ModelArts Studio&#xff08;MaaS&#xff09;介紹與應用場景 2.1ModelArts Studio&#xff08;MaaS&#xff09;介紹 2.2 ModelArts Studio&#xff08;MaaS&#xff09;使用場景 2.3 開通MaaS服務 2.4 開通DeepSeek-V3商用服務 三、華為云Flexus簡介 3.1 …

『uniapp』url攔截屏蔽 避免webview中打開淘寶店鋪自動跳轉淘寶

目錄 分析1. wv.overrideUrlLoading2. 參數 `mode: allow`3. 參數 `match: ^(http|https)://.*`4. 回調函數 `function(e) { console.warn(allow url:, e.url); }`作用:可能的應用場景:核心代碼總結歡迎關注 『uniapp』 專欄,持續更新中 歡迎關注 『uniapp』 專欄,持續更新…

將對透視變換后的圖像使用Otsu進行閾值化,來分離黑色和白色像素。這句話中的Otsu是什么意思?

Otsu 是一種自動閾值化方法&#xff0c;用于將圖像分割為前景和背景。它通過最小化圖像的類內方差或等價地最大化類間方差來選擇最佳閾值。這種方法特別適用于圖像的二值化處理&#xff0c;能夠自動確定一個閾值&#xff0c;將圖像中的像素分為黑色和白色兩類。 Otsu 方法的原…

Zookeeper 和 Kafka 版本與 JDK 要求

Apache Zookeeper 和 Apache Kafka 在不同版本中對 JDK 的要求如下表所示(基于官方文檔和歷史版本記錄整理): 1. Zookeeper 版本與 JDK 要求 Zookeeper 版本要求的最低 JDK 版本說明3.4.x 系列JDK 6生產環境建議用 JDK 8(舊版兼容性強)。3.5.x 系列(3.5.5+)JDK 83.5.0 …

V837s-SDK Telnetd服務連接不上異常解決

目錄 前言 一、檢查 Telnetd 服務是否啟動 二、問題解決 總結 前言 在基于 V837s-SDK 進行開發的過程中,Telnetd 服務連接不上是一個較為常見且棘手的問題。Telnet 作為一種遠程登錄協議,在開發調試時為我們提供了便捷的遠程操作方式。若其連接出現異常,將嚴重影響開發進度…

滑動窗口最大值和最小值

題目&#xff1a; 思路&#xff1a; 窗口進行滑動時&#xff0c;需要快速獲取min和max&#xff0c;因此需要一個結構來保存最值&#xff0c;而不是臨時計算。動態的最值更新容易聯想到單調棧&#xff0c;但是這里需要頻繁增刪元素&#xff0c;因此用雙端隊列&#xff0c;front…

JVM——對象創建全家桶:JVM中對象創建的模式及最佳實踐

引入 在 Java 應用開發中&#xff0c;對象創建是最基礎且高頻的操作&#xff0c;但往往也是性能優化的關鍵切入點。想象一個在線閱讀平臺&#xff0c;每天需要創建數百萬個 Book 對象來統計閱讀數據。如果每個對象的創建過程存在內存浪費或性能瓶頸&#xff0c;累積效應將導致…

VSCode中PHP使用Xdebug

本地環境 windows10php8.2 ntsxdebug v3thinkphp v8 下載Xdebug Xdebug下載地址 從xdebug下載地址,下載最新的xdebug,解壓后將php_xdebug.dll放入php目錄的ext目錄下 配置php.ini [Xdebug] zend_extension php_xdebug xdebug.client_host 127.0.0.1 xdebug.client_port…

金融系統滲透測試

金融系統滲透測試是保障金融機構網絡安全的核心環節&#xff0c;它的核心目標是通過模擬攻擊手段主動發現系統漏洞&#xff0c;防范數據泄露、資金盜取等重大風險。 一、金融系統滲透測試的核心框架 合規性驅動 需嚴格遵循《網絡安全法》《數據安全法》及金融行業監管要求&am…

高考志愿填報管理系統---開發介紹

高考志愿填報管理系統是一款專為教育機構、學校和教師設計的學生信息管理和志愿填報輔助平臺。系統基于Django框架開發&#xff0c;采用現代化的Web技術&#xff0c;為教育工作者提供高效、安全、便捷的學生管理解決方案。 ## &#x1f4cb; 系統概述 ### &#x1f3af; 系統定…

PHP 項目中新增定時任務類型的詳細步驟(以 CRMEB 為例)

1.首先需要在下面文件中增加定時任務類型 2.在app\services\system\crontab\CrontabRunServices類中增加第一步中與定時任務類型同名的方法&#xff0c;注意需要下劃線轉小駝峰 例如定時任務的類型為&#xff1a;order_tick,而在CrontabRunServices類中的方法名稱為&#xff1…

Day27 函數專題2:裝飾器

1.裝飾器的思想&#xff1a;進一步復用 裝飾器&#xff08;Decorator&#xff09;是 Python 中一種強大的編程工具&#xff0c;核心作用是在不修改原函數代碼的前提下&#xff0c;為函數添加額外功能&#xff08;如日志記錄、性能統計、權限校驗等&#xff09;。它充分利用了 …

Qt進階開發:動畫框架的介紹和使用

文章目錄 一、QPropertyAnimation 簡介二、基本用法三、常用屬性和方法四、支持的屬性&#xff08;部分常用&#xff09;五、多個動畫組合六、使用緩和曲線七、狀態機框架 一、QPropertyAnimation 簡介 #include <QPropertyAnimation>QPropertyAnimation 可以讓你在一段…

IP選擇注意事項

IP選擇注意事項 MTP、FTP、EFUSE、EMEMORY選擇時&#xff0c;需要考慮以下參數&#xff0c;然后確定后選擇IP。 容量工作電壓范圍溫度范圍擦除、燒寫速度/耗時讀取所有bit的時間待機功耗擦寫、燒寫功耗面積所需要的mask layer

Flask RESTful 示例

目錄 1. 環境準備2. 安裝依賴3. 修改main.py4. 運行應用5. API使用示例獲取所有任務獲取單個任務創建新任務更新任務刪除任務 中文亂碼問題&#xff1a; 下面創建一個簡單的Flask RESTful API示例。首先&#xff0c;我們需要創建環境&#xff0c;安裝必要的依賴&#xff0c;然后…

filebeat原理架構

Filebeat 是基于 Golang 開發的輕量級日志采集 Agent&#xff0c;其核心架構設計圍繞高效、可靠地采集與轉發日志數據&#xff0c;主要組件和工作流程如下&#xff1a; ?一、核心架構組件? ?輸入 (Inputs)? 負責監控指定的日志源&#xff08;如文件路徑、日志文件&#x…

Air8000開發板新資料開放!多功能+高擴展特性全面解鎖

Air8000開發板最新技術資料正式向開發者開放。這個開發板集多功能與高擴展性于一身&#xff0c;將為物聯網、嵌入式系統等領域的創新項目提供更強大的技術支持&#xff0c;助力開發者快速實現創意落地。 工程師朋友們&#xff0c;Air8000開發板“多功能集成高擴展性”&#xff…

如何遷移Cordova應用到HarmonyOS 5 以及遷移時常見的問題?

以下是 Cordova 應用遷移至 HarmonyOS 5 的完整方案及常見問題解決方案&#xff0c;結合最新技術實踐整理&#xff1a; 一、遷移流程 1. ?方案選擇? ?方案??適用場景??操作復雜度??Android 兼容層方案?簡單應用快速上線低&#xff08;無需修改代碼&#xff09;?原…

板凳-------Mysql cookbook學習 (十--4)

6.3 設置客戶端時區 --客戶端位于不同時區需要注意&#xff0c;如果位于同一時區則不需要關心 mysql> drop table if exists t; Query OK, 0 rows affected (0.06 sec)mysql> create table t (ts timestamp); Query OK, 0 rows affected (0.05 sec)mysql> insert int…

如何根據excel表生成sql的insert腳本

根據excel自帶的vba宏進行操作 首先altF11 點擊插入~模塊 錄取執行語句 Sub GenerateSQL()Dim lastRow As IntegerlastRow Cells(Rows.Count, 1).End(xlUp).RowFor i 2 To lastRow 假設第一行是標題Cells(i, "S").Value "INSERT INTO table_name (ID, RE…