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/22 14:54:39

金山办公获评最佳AI协同办公软件提供商,成唯一入选的国产厂商

近日,由政企市场专业门户企业网D1net、信众智与中国企业数字化联盟联合主办的2025 CEIA中国企业IT大奖揭晓。金山办公凭借WPS 365在AI协同办公领域的技术创新与实践成果,荣膺“最佳AI协同办公软件提供商”奖项,成为唯一入选该领域的国内协同办…

作者头像 李华
网站建设 2026/4/16 15:07:17

CC++核心介绍

C 核心介绍C 是由 Bjarne Stroustrup 在 1980 年代基于 C 语言扩展而来的编程语言,核心特点是兼容 C 语言且新增了面向对象编程(OOP)特性,同时保留了对底层硬件的直接操控能力,因此被称为 “混合范式语言”—— 既支持…

作者头像 李华
网站建设 2026/4/23 6:09:55

一篇文章带你轻松掌握ARP欺骗的原理以及运用

ARP欺骗原理以及实现 什么是ARP协议? 简单来说就是在通信协议中,数据的从一台设备向另一台设备转发时需要知道目标机的明确地址(就好比买的快递需要写家里的地址一样),在网络设备中除了通过网络层的IP协议去获得IP地…

作者头像 李华
网站建设 2026/4/16 13:35:21

计算机小程序毕设实战-基于django定制化ERP系统APP小程序员工管理、客户管理、设备管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华