news 2026/4/25 10:05:32

Pod资源管理:避免争抢与浪费的核心手段

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pod资源管理:避免争抢与浪费的核心手段

默认情况下,容器可使用所在节点的全部CPU和内存资源,在多租户集群中极易引发资源争抢(如一个“贪婪”应用耗尽节点内存,导致其他Pod被杀死)、调度不均(调度器无法判断Pod合适节点)等问题。资源管理的核心目标,是通过声明式配置,让K8s“知晓”每个应用的资源需求,实现公平调度、资源隔离与稳定运行。

1、Secret(密钥管理)

1.1 概念

Secret 用来保存敏感数据,如:密码 Token 密钥

将敏感信息与Pod分离,方便控制访问并降低风险。

1.2 Secret 类型

类型说明
kubernetes.io/service-account-tokenKubernetes 自动创建,用于访问 APIServer。Pod 默认挂 载在 /run/secrets/kubernetes.io/serviceaccount。
Opaque默认类型,用户自定义密码、密钥等(Base64 编码)。
kubernetes.io/dockerconfigjson存储私有 Docker Registry 的认证信息。
kubernetes.io/tls存储 SSL/TLS 证书与私钥。

使用前提:Pod 必须引用 Secret 才能使用。

使用方式:

1. 作为Volume 文件挂载。

2. 作为环境变量

3. kubelet拉取镜像时使用认证信息

应用场景:凭据管理

1.3 创建Secret

1.3.1 方法一:命令行创建

echo -n 'zhangsan' > username.txt echo -n 'abc1234' > password.txt kubectl create secret generic mysecret --from-file=username.txt --from file=password.txt kubectl get secrets kubectl describe secret mysecret

1.3.2 方法二:YAML 文件(Base64 编码)

echo -n zhangsan | base64 # emhhbmdzYW4K= echo -n abc1234 | base64 # YWJjMTIzNAo== apiVersion: v1 kind: Secret metadata: name: mysecret1 type: Opaque data: password: 'YWJjMTIzNA==' username: 'emhhbmdzYW4=' kubectl apply -f secret.yaml kubectl get secret mysecret1 -o yaml

1.4 使用 Secret

1.4.1 方式一:挂载为文件

#将 Secret 挂载到 Volume 中,以 Volume 的形式挂载到 Pod 的某个目录下 vim secret-test.yaml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx volumeMounts: - name: secrets mountPath: "/etc/secrets" readOnly: true volumes: - name: secrets secret: secretName: mysecret kubectl exec -it mypod -- ls /etc/secrets

1.4.2 方式二:导入环境变量

vim secret-test1.yaml apiVersion: v1 kind: Pod metadata: name: mypod1 spec: containers: - name: nginx image: nginx env: - name: TEST_USER valueFrom: secretKeyRef: name: mysecret1 key: username - name: TEST_PASSWORD valueFrom: secretKeyRef: name: mysecret1 key: password kubectl explain Pod.spec.containers.env.valueFrom kubectl exec -it mypod1 -- printenv | grep TEST

2、ConfigMap(配置管理)

2.1 概念

与 Secret 类似,但存储非敏感配置数据。

ConfigMap 可供应用读取配置文件、命令行参数或环境变量。

应用场景:应用配置管理

2.2 创建 ConfigMap

2.2.1 方法一:从目录创建

mkdir /opt/configmap/ vim /opt/configmap/game.properties enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 vim /opt/configmap/ui.properties color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice kubectl create configmap game-config --from-file=/opt/configmap/ //--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件 名,值就是文件的内容

2.2.2 方法二:从文件创建

kubectl create configmap game-config-2 \ --from-file=/opt/configmap/game.properties \ --from-file=/opt/configmap/ui.properties

2.2.3 方法三:使用字面值

kubectl create configmap special-config \ --from-literal=special.how=very \ --from-literal=special.type=goo

2.3 Pod 中使用 ConfigMap

2.3.1 方式一:作为环境变量注入

vim env.yaml apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: special.how: very special.type: good --- apiVersion: v1 kind: ConfigMap metadata: name: env-config namespace: default data: log_level: INFO kubectl create -f env.yaml kubectl get cm NAME DATA AGE env-config special-config 1 6S DATA 2 6S ---------------------------------------------- //Pod的创建 vim test-pod.yaml apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: busybox image: busybox:1.28.4 command: ["/bin/sh", "-c", "env"] env: - name: SPECIAL_HOW_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type envFrom: - configMapRef: name: env-config restartPolicy: Never kubectl logs test-pod

2.3.2 方式二:命令行参数使用

vim test-pod2.yaml apiVersion: v1 kind: Pod metadata: name: test-pod2 spec: containers: - name: busybox image: busybox:1.28.4 command: - /bin/sh - -c - echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)" env: - name: SPECIAL_HOW_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type envFrom: - configMapRef: name: env-config restartPolicy: Never kubectl create -f test-pod2.yaml kubectl get pods NAME READY STATUS RESTARTS AGE test-pod2 0/1 Completed 0 34s kubectl logs test-pod2 very good

2.3.3 方式三:以 Volume 形式挂载

在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容 vim test-pod3.yaml apiVersion: v1 kind: Pod metadata: name: test-pod3 spec: containers: - name: busybox image: busybox:1.28.4 command: [ "/bin/sh", "-c", "sleep 36000" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config restartPolicy: Never kubectl create -f test-pod3.yaml kubectl get pods NAME READY STATUS RESTART AGE test-pod3 1/1 Running 0 5s kubectl exec -it test-pod3 sh # cd /etc/config/ # ls special.how special.type # vi special.how # vi special.type

2.3.4 ConfigMap 热更新机制

vim test-pod4.yaml apiVersion: v1 kind: ConfigMap metadata: name: log-config namespace: default data: log_level: INFO --- apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 1 selector: matchLabels: app: my-nginx template: metadata: labels: app: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: log-config kubectl apply -f test-pod.yaml kubectl exec -it my-nginx-c6df7db54-2x54r -- cat /etc/config/log_level

修改:

kubectl edit configmap log-config apiVersion: v1 data: log_level: DEBUG #INFO 修改成 DEBUG kind: ConfigMap metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data": {"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations": {},"name":"log-config","namespace":"default"}} #INFO 修改成 DEBUG creationTimestamp: 2021-05-25T07:59:18Z name: log-config namespace: default resourceVersion: "93616" selfLink: /api/v1/namespaces/default/configmaps/log-config uid: 1b8115de-bd2f-11eb-acba-000c29d88bba # log_level: DEBUG //等大概10秒左右,使用该 ConfigMap 挂载的 Volume 中的数据同步更新 kubectl exec -it my-nginx-76b6489f44-6dwxh -- cat /etc/config/log_level DEBUG

Volume 挂载的数据约 10 秒后同步更新。 环境变量不会自动更新。

2.3.5 触发滚动更新

更新 ConfigMap 不会自动触发 Pod 重启,可手动触发滚动更新。

更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新 kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20251016" }}}}}' annotations kubectl patch deployment myapp-cs --patch '{"spec": {"template": spec": {"containers":{"image":"soscscs/myapp:v2 }}}}}' spec":{"containers":[{"image":"soscscs/myapp:v1 kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-665dd4dc8c-j4k9t 0/1 ContainerCreating 0 4S my-nginx-76b6489f44-6dwxh 0/1 Terminating 0 10M kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-665dd4dc8c-j4k9t 1/1 Running 0 74s PS:更新 ConfigMap 后: ●使用该 ConfigMap 挂载的 Env 不会同步更新。 ●使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

总结

项目SecretConfigMap
存储内容敏感信息(密码、密钥)普通配置信息
数据编码Base64纯文本
使用方式Volume、Env、镜像拉取凭证Volume、Env、命令参数
是否自动更新Volume 延迟更新,Env 不会Volume 延迟更新,Env 不会
安全性高(需 RBAC 控制)普通
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 17:11:29

Flink 流处理从入门到精通:DataStream 转换与窗口操作实战

💡 Flink DataStream API 实战全解析:Map、FlatMap、Filter 与 Window 窗口操作详解 封面图建议:深蓝科技感背景,中央 Flink logo,流动线条展示数据流动,关键词“Map / FlatMap / Filter / Window Processing”,简洁直观。 目录 Flink 执行环境与时间语义 基础转换操作…

作者头像 李华
网站建设 2026/4/23 1:07:23

第一次渗透

第一次接触渗透感觉十分的不熟悉,我对前面的课程有很多都没有学到位,很多都听不懂,最初几节课的环境搭建感觉听的云里雾里的。之前授课老师和这门课的老师讲课方式不一样,所以还没有适应。我不知道环境搭建需要那些东西&#xff0…

作者头像 李华
网站建设 2026/4/23 12:30:04

小程序计算机毕设之基于django智能制造业ERP系统定制化ERP系统APP小程序(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/23 12:29:33

《Python动态类型的可靠性屏障:属性测试的实战探索》

Python动态类型机制所带来的编码自由度,是吸引无数开发者深耕于此的核心魅力,却也如同一把双刃剑,在消解静态类型繁琐约束的同时,埋下了类型契约模糊、行为边界失范的隐性隐患,传统测试手段始终被困在“预设输入-验证输出”的点覆盖逻辑里,面对动态类型环境中对象属性动态…

作者头像 李华
网站建设 2026/4/22 19:29:18

无线网络仿真:蓝牙网络仿真_(15).蓝牙网络仿真研究前沿

蓝牙网络仿真研究前沿 1. 蓝牙网络仿真的背景与意义 1.1 无线网络仿真的重要性 无线网络仿真是一种重要的研究工具,用于评估和优化无线通信系统的性能。通过仿真,研究人员可以模拟真实世界中的各种无线通信场景,从而分析网络的行为和性能。无…

作者头像 李华