目录

一、 初始化容器 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;也揭示了当前深度学习技术在处理结构化信息时的本质挑战。通过对文本计数、图像计数以及相关技术改进方向的全面分…