Kubernetes 高級調度01

目錄

一、 初始化容器 InitContainer

1. InitContainer 的基本概念

2.?延遲指定時間后啟動

3.?使用初始化容器修改內核參數

4.?等待依賴的服務啟動后再啟動應用

5.?pause 容器

二、?臨時容器 Ephemeral Containers

1.?臨時容器的概念

2.?臨時容器的使用示例

三、?自動擴縮容 HPA

1.?什么是 HPA

2.?HPA 實踐步驟(以 Nginx 為例)


一、 初始化容器 InitContainer

首先來看初始化容器,顧名思義,初始化容器是用來進行初始化操作的。很多情況下,程序的啟動需要依賴各類配置、資源。但是又不能繼承在原有的啟動命令或者鏡像當中,因為程序的鏡像可能并沒有加載配置命令,此時 InitContainer 就起了很大的作用。

1. InitContainer 的基本概念

InitContainer 是 Kubernetes 的初始化容器(也可稱之為 Init 容器),它是一種特殊的容器,在 Pod 內的應用容器啟動之前運行,可以包括一些應用鏡像中不存在的使用工具和安裝腳本,用以在程序啟動時進行初始化,比如創建文件、修改內核參數、等待依賴程序啟動等。

每個 Pod 中可以包含多個容器,同時 Pod 也可以有一個或多個先于應用程序啟動的 Init 容器:

  • 在 Pod 定義中,initContainers?與?containers?同級,按順序逐個執行
  • 當所有的 Init 容器運行完成時,Kubernetes 才會啟動 Pod 內的普通容器。

Init 容器與普通容器的核心差異:

  • 總是運行到完成:Init 容器必須執行完畢,才會啟動后續容器。
  • 串行執行:上一個 Init 容器運行完成后,才會啟動下一個。
  • 重啟策略關聯:若 Init 容器失敗,Kubernetes 會不斷重啟 Pod(除非 Pod 的?restartPolicy?為?Never)。

為 Pod 設置 Init 容器時,需在?spec?中添加?initContainers?字段(與?containers?同級),配置方式與普通容器類似,但?Init 容器不支持?lifecyclelivenessProbereadinessProbestartupProbe(因需在 Pod 就緒前運行完成)。

2.?延遲指定時間后啟動

需求:讓應用容器啟動前,Init 容器休眠 15 秒。

YAML 定義(init01.yml):

apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: initc01name: initc01
spec:terminationGracePeriodSeconds: 0containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: n1resources: {}initContainers:- name: initc01image: nginx:1.7.9imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 15"]  # 休眠15秒dnsPolicy: ClusterFirstrestartPolicy: Never
status: {}

部署與觀察:

# 創建 Pod
kubectl create -f init01.yml  # 持續查看 Pod 狀態(Init 階段會持續 15 秒)
kubectl get pod  
# 初始狀態:STATUS 為 Init:0/1  
# 15秒后,STATUS 變為 PodInitializing → Running  

3.?使用初始化容器修改內核參數

需求:在 Init 容器中修改物理機內核參數(vm.swappiness=0,減少 swap 使用)。

關鍵說明:

容器默認無法修改內核參數,需通過?securityContext.privileged: true?賦予特權。

YAML 定義(init02.yml):

apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: initc02name: initc02
spec:terminationGracePeriodSeconds: 0containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: n1resources: {}initContainers:- name: initc02image: alpine  # 選擇輕量鏡像imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "/sbin/sysctl -w vm.swappiness=0"]  # 修改內核參數securityContext:privileged: true  # 賦予特權dnsPolicy: ClusterFirstrestartPolicy: Never
status: {}

驗證:

# 部署
kubectl apply -f init02.yml  # 查看 Pod 狀態
kubectl get pod  # 驗證內核參數是否修改成功
kubectl exec -it initc02 -- cat /proc/sys/vm/swappiness  
# 輸出應為 0

4.?等待依賴的服務啟動后再啟動應用

需求:Web 服務(Nginx)依賴 Redis 和 MySQL 服務,需等兩者就緒后再啟動。

(1) 創建帶 Init 容器的 Pod(myapp.yml):

Init 容器通過?nslookup?檢查依賴服務的 DNS 解析(即服務是否就緒),未就緒則循環等待。

apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.7.9ports:- containerPort: 80initContainers:- name: init-redisimage: busybox:1.28command: ['sh', '-c', 'until nslookup redis-server; do echo waiting for redis; sleep 2; done;']- name: init-mysqlimage: busybox:1.28command: ['sh', '-c', 'until nslookup mysql-server; do echo waiting for mysql; sleep 2; done;']

部署后觀察初始狀態:

kubectl create -f myapp.yml  
kubectl get pod  
# 狀態為 Init:0/2(兩個 Init 容器均未完成)

(2)?創建第一個依賴服務

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: redisname: redis
spec:replicas: 1selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- image: redis:5.0imagePullPolicy: IfNotPresentname: redis
---
apiVersion: v1
kind: Service
metadata:labels:app: redisname: redis-service
spec:ports:- port: 6379protocol: TCPtargetPort: 6379selector:app: redistype: NodePort

部署與驗證:

kubectl create -f redis-deployment.yml  
kubectl get svc  # 查看 redis-service 的 NodePort  
kubectl get pod  # Redis Pod 啟動后,Init 容器狀態變為 Init:1/2  

(3)?創建第二個依賴服務

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: mysqlname: mysql
spec:replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- env:- name: MYSQL_ROOT_PASSWORDvalue: 'moonfdd'image: 'mysql:8.0'imagePullPolicy: IfNotPresentname: mysql
---
apiVersion: v1
kind: Service
metadata:labels:app: mysqlname: mysql-service
spec:ports:- port: 3306protocol: TCPtargetPort: 3306selector:app: mysqltype: NodePort

部署后最終狀態:

kubectl create -f mysql-deployment.yml  
kubectl get pod  
# Nginx Pod 狀態變為 Running(兩個 Init 容器均完成,依賴服務就緒)

(4)?完成 MySQL 服務定義

      name: mysqlvolumeMounts:- mountPath: /var/lib/mysqlname: volvvolumes:- hostPath:path: /root/k8s/moonfdd/mysql/var/lib/mysql  # 主機路徑,需提前創建type: DirectoryOrCreatename: volv
---
apiVersion: v1
kind: Service
metadata:labels:app: mysqlname: mysql-service
spec:ports:- port: 3306protocol: TCPtargetPort: 3306selector:app: mysqltype: NodePort

部署與驗證:

kubectl create -f mysql-deployment.yml  
# 輸出:deployment.apps/mysql created、service/mysql-service created  kubectl get svc  
# 查看 mysql-service 的 NodePort(如 3306:31452/TCP)  kubectl get pod  
# 等待 MySQL Pod 啟動后,Nginx Pod 的 Init 容器完成,狀態變為 Running  

5.?pause 容器

在 Kubernetes 中,pause 容器是每個 Pod 的 “基礎容器”,并非暫停執行,而是負責:

  • 共享網絡命名空間:Pod 內所有容器共享同一個 IP、端口空間,可通過?localhost?通信。
  • 維持網絡接口:為 Pod 配置網絡出口,使容器能訪問外部網絡。
  • 保證穩定性:即使業務容器停止,pause 容器運行時,Pod 網絡命名空間仍保留。
  • 生命周期綁定:pause 容器是 Pod 第一個啟動的容器,生命周期與 Pod 綁定(鏡像極小,約 700KB,運行?/pause?無限循環)。

Pause 容器的實現邏輯

Pod 內多個容器共享網絡的核心是?Infra 容器(即 pause 容器):

  1. Infra 容器先啟動,創建 Pod 的 Network Namespace。
  2. 業務容器通過?Join Namespace?加入 Infra 的網絡命名空間。
  3. 所有容器看到的網絡設備、IP、MAC 完全一致,共享 Pod 級網絡資源。

驗證 pause 容器存在:

# 查看 Nginx Pod 所在節點  
kubectl get pod -o wide  # 在節點上查看容器(過濾 Nginx Pod 相關容器)  
docker ps | grep <pod-name>  
# 輸出中會包含:  
#   registry.aliyuncs.com/google_containers/pause:3.6  # pause 容器  
#   nginx 容器...  

二、?臨時容器 Ephemeral Containers

生產環境中,業務鏡像通常不預裝調試工具(如?curlwgetnet-tools),導致排查問題時無法直接執行命令。Kubernetes 1.16+ 引入?臨時容器,支持動態注入調試工具,無需修改業務鏡像。

1.?臨時容器的概念

  • 用途:臨時附加到 Pod,用于在線調試(如診斷網絡、查看進程),不參與業務運行
  • 特性
    • 無自動重啟,狀態不影響業務容器。
    • 不支持?portslivenessProbereadinessProberesources?等字段(僅調試用)。
    • 通過特殊 API 創建(非?pod.spec),無法用?kubectl edit?修改,Pod 重啟后自動銷毀。
  • 場景:業務容器無 Shell、調試工具缺失時,快速注入?busybox?等鏡像進行診斷。

2.?臨時容器的使用示例

(1)?創建待調試的 Tomcat Pod

apiVersion: v1
kind: Pod
metadata:name: tomcat-testnamespace: defaultlabels:app: tomcat
spec:containers:- name: tomcat-javaports:- containerPort: 8080image: kubeguide/tomcat-app:v1imagePullPolicy: IfNotPresent

(2)?部署并查看 Pod

kubectl apply -f pod-tomcat.yml  
kubectl get pod  
# 狀態:Running(1/1)  

(3)?注入臨時容器

kubectl debug -it tomcat-test \--image=busybox:1.28 \--target=tomcat-java  
  • tomcat-test:目標 Pod 名稱。
  • --target=tomcat-java:指定注入到哪個業務容器的命名空間(共享網絡、PID 等)。
  • --image=busybox:1.28:臨時容器使用的鏡像(含常用調試工具)。

(4)?驗證臨時容器

# 檢查 Tomcat 端口  
netstat -tunlp | grep 8080  # 測試網絡連通性  
wget http://localhost:8080  

三、?自動擴縮容 HPA

1.?什么是 HPA

  • 作用:根據資源利用率或自定義指標,動態擴縮 Pod 數量(僅支持可擴縮的資源,如 Deployment,不支持 DaemonSet)。
  • 原理:HPA 控制器定期(默認 15 秒)查詢 Metrics Server,對比實際指標與目標值,調整副本數。

2.?HPA 實踐步驟(以 Nginx 為例)

(1)?部署帶資源請求的 Nginx Deployment

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-serverlabels:name: nginx-server
spec:replicas: 2  # 初始副本數selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginxresources:requests:  # 必須配置 requests,否則 Metrics Server 無法采集cpu: 10m  # 10 毫核(0.01 CPU)image: nginx:1.7.9ports:- name: nginxcontainerPort: 80

(2)?部署 Deployment

kubectl apply -f nginx-deployment.yml  
kubectl get deployment  
# 確認初始副本數為 2  

(3)?安裝 Metrics Server

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml  

驗證 Metrics Server 運行

kubectl get pods -n kube-system -l k8s-app=metrics-server  

(4)?創建 HPA 規則

kubectl autoscale deployment nginx-server \--cpu-percent=50 \  # 目標 CPU 利用率 50%--min=2 \           # 最小副本數--max=10            # 最大副本數

(5)?模擬負載,觸發擴縮容

# 進入 Nginx Pod,或在節點上運行:
stress --cpu 2 --timeout 600  # 模擬 2 個 CPU 核心滿載,持續 10 分鐘  # 觀察 HPA 狀態:
kubectl get hpa  
# CPU 利用率超過 50% 后,副本數會逐步增加到 max(10)。  # 停止壓測后,副本數會回落到 min(2)。  

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

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

相關文章

Spring MVC2

在Spring MVC1中&#xff0c;我們知道了MVC的定義&#xff0c;同時也知道了RequestMapping和RestController這個注解的作用。本篇文章&#xff0c;我們將學習使用Spring MVC獲取請求參數和返回不同的響應等等請求傳遞單個參數如圖所示&#xff0c;創建RequestController類&…

項目文章(IF:9.3)轉錄因子ChIP-seq助力揭示CsphyB-CsPIF4-CsBRC1模塊調控ABA合成和腋芽生長發育

分枝生長是作物農業特性中的一項重要指標&#xff0c;它直接影響植株的結構和作物的產量。黃瓜&#xff08;學名&#xff1a;Cucumis sativus L.&#xff09;是一種在全球范圍內具有重要經濟價值和營養價值的重要蔬菜作物。在田間環境中&#xff0c;具有更多側枝的黃瓜植株更受…

NSSCTF Web 一點學習

[SWPUCTF 2021 新生賽]jicao連接&#xff1a;利用hackbar&#xff0c;按照php的判斷條件來得到flag[SWPUCTF 2021 新生賽]easyrce連接&#xff1a;url讀取并且執行先用ls查看flag位置&#xff1a;找到了個看起來是flag的文件cat一下&#xff1a;得到flag[SWPUCTF 2021 新生賽]c…

【STM32項目】環境監測設計

????大家好&#xff0c;這里是5132單片機畢設設計項目分享&#xff0c;今天給大家分享的是基于《基于STM32的環境監測設計》。 目錄 1、系統功能 2.1、硬件清單 2.2、功能介紹 2.3、控制模式 2、演示視頻和實物 3、系統設計框圖 4、軟件設計流程圖 5、原理圖 6、主…

不同系統記錄項目進度不一致,如何統一口徑

不同系統記錄項目進度不一致&#xff0c;會造成項目管理混亂、信息混淆和決策失誤。統一口徑的方法包括&#xff1a;采用統一的項目管理平臺、明確數據記錄與更新規范、建立進度數據對接與整合機制。特別是采用統一的項目管理平臺&#xff0c;通過統一的信息輸入與輸出渠道&…

玩轉Docker | 使用Docker部署Drawnix在線白板工具

玩轉Docker | 使用Docker部署Drawnix在線白板工具 前言一、Drawnix介紹Drawnix簡介Drawnix主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署Drawnix服務下載Drawnix鏡像編輯部署文件創建容器檢查容器狀態檢查服務端口安全設置四、訪問Drawnix服務訪…

Linux操作系統從入門到實戰(九)Linux開發工具(中)自動化構建-make/Makefile知識講解

Linux操作系統從入門到實戰&#xff08;九&#xff09;Linux開發工具&#xff08;中&#xff09;自動化構建-make/Makefile前言一、 make/Makefile是什么&#xff1f;1. 我們先想個問題&#xff1a;手動編譯代碼有多麻煩&#xff1f;2. 為了解決麻煩&#xff0c;才有了自動化工…

開源b2b2c商城源碼 支持多端適用 含完整代碼包和圖文搭建教程

在電商行業蓬勃發展的當下&#xff0c;b2b2c商城系統成為眾多企業拓展業務版圖的有力工具。這種支持自營與商家入駐并存的系統&#xff0c;含豐富平臺商品種類&#xff0c;能通過多元化運營提升平臺競爭力。本文分享一個開源b2b2c商城源碼的相關知識&#xff0c;并詳細介紹其搭…

Vue3入門-指令補充

&#x1f3e0;個人主頁&#xff1a;Yui_ &#x1f351;操作環境&#xff1a;vscode\node.js &#x1f680;所屬專欄&#xff1a;Vue3 文章目錄1. 指令修飾符1.1 按鍵修飾符1.2 事件修飾符1.3 v-model修飾符2. v-model用在其他表單元素上3. 樣式綁定3.1 操作class4. 操作style5.…

UDP類型套接字

理解UDP協議&#xff1a;互聯網世界的"明信片"通信 UDP是什么&#xff1f;為什么需要它&#xff1f; 想象一下&#xff0c;你正在給朋友寄送兩種不同的東西&#xff1a;一份重要的合同文件和一疊度假時的風景明信片。對于合同文件&#xff0c;你會選擇掛號信&#xf…

redis快速入門教程

更新中基本概念安裝centOS安裝redis&#xff1a;yum install redis -y啟動&#xff1a;systemctl start redis設置開機啟動&#xff1a;systemctl enable redis檢查運行狀態&#xff1a;systemctl status redis遠程訪問編輯配置文件 vi /etc/redis.conf在其中修改為bind 0.0.0.…

UDP和TCP的主要區別是什么

UDP&#xff08;用戶數據報協議&#xff09;和 TCP&#xff08;傳輸控制協議&#xff09;是互聯網傳輸層的兩大核心協議&#xff0c;主要區別體現在??連接方式、可靠性、傳輸效率、頭部開銷??及??適用場景??上。以下是具體對比&#xff1a;??一、核心區別對比表???…

ASP .NET Core 8結合JWT輕松實現身份驗證和授權

身份驗證和授權是每一個后端服務必不可少的&#xff0c;可以實現對非法請求進行攔截&#xff0c;能夠有效保護數據的安全性。 JSON Web Token&#xff08;JWT&#xff09;是一項開放標準&#xff08;RFC 7519&#xff09;&#xff0c;它定義了一種緊湊且自包含的方法&#xff…

5G時代的智慧燈桿:塔能“一桿多用”方案如何激活城市新基建?

在《5G應用“揚帆”行動計劃》持續推進的進程之中&#xff0c;智慧桿已然成為了5G基站部署環節極為重要的載體&#xff0c;并且被明確地歸入到新型基礎設施建設的重點范疇之內。相關政策提出&#xff0c;要在2025年達成重點區域5G網絡全面且深度覆蓋的目標&#xff0c;與此同時…

護照閱讀器:國外證件識別的 OCR “解碼師”

國外證件版式多樣、語種繁雜&#xff0c;人工識別不僅耗時&#xff0c;還易因翻譯誤差、格式不熟悉導致信息錯漏。尤其在跨境業務場景中&#xff0c;傳統識別方式嚴重影響效率與準確性。護照閱讀器搭載的 OCR 技術成為破局關鍵。它能精準提取國外護照、駕照等證件上的多語種文字…

Linux部署Python服務

1、創建項目目錄與虛擬環境#確保安裝 Python 和 python3-venv 工具 sudo apt update sudo apt install python3 python3-pip python3-venvmkdir myproject cd myproject python3 -m venv venv # 創建虛擬環境#Linux source venv/bin/activate # 激活虛擬環境#Windowds venv\S…

【Python辦公】使用Python和Tkinter構建Excel數據導入MySQL工具(GUI版)

目錄 專欄導讀前言項目概述技術棧環境準備核心代碼實現1. 導入必要的庫2. 主應用類設計3. 用戶界面設計數據庫配置區域數據庫選擇區域4. 數據庫連接功能測試連接獲取數據庫列表5. 數據導入功能關鍵技術點解析1. SQLAlchemy 2.x 兼容性2. MySQL 8.0 認證問題3. 避免啟動時連接錯…

華為OD機試_2025 B卷_猜數字(Python,100分)(附詳細解題思路)

題目描述 一個人設定一組四碼的數字作為謎底&#xff0c;另一方猜。 每猜一個數&#xff0c;出數者就要根據這個數字給出提示&#xff0c;提示以XAYB形式呈現&#xff0c;直到猜中位置。 其中X表示位置正確的數的個數&#xff08;數字正確且位置正確&#xff09;&#xff0c;而…

【網絡安全】理解安全事件的“三分法”流程:應對警報的第一道防線

1. 簡介 在網絡安全領域&#xff0c;每天都會產生大量安全警報。作為一名安全分析師&#xff0c;識別、評估并優先處理這些警報的能力至關重要。三分法&#xff08;Triage&#xff09; 是確保安全團隊高效響應安全事件的核心流程&#xff0c;它能夠幫助我們合理分配資源、集中精…

AI大模型計數能力的深度剖析:從理論缺陷到技術改進

AI大模型計數能力的深度剖析&#xff1a;從理論缺陷到技術改進 AI大模型在計數任務上表現出明顯的局限性&#xff0c;這不僅反映了模型架構的核心缺陷&#xff0c;也揭示了當前深度學習技術在處理結構化信息時的本質挑戰。通過對文本計數、圖像計數以及相關技術改進方向的全面分…