Kubernetes(七) Pod控制器与配置资源管理详解
一、Pod控制器概述
1.1 什么是Pod控制器
Pod控制器(Controller) 又称为工作负载(Workload),是Kubernetes中用于管理Pod的中间层。它的核心职责是确保集群中的Pod资源始终符合用户定义的"期望状态"。
1.2 核心功能
-
副本管理:保证Pod副本数量与期望一致
-
自动恢复:Pod异常退出时,根据重启策略自动重建
-
运维支持:支持伸缩(扩容/缩容)、滚动更新、版本回滚等操作
二、Pod控制器类型详解
2.1 控制器类型对比表
|
控制器 |
功能描述 |
典型应用场景 |
|---|---|---|
|
ReplicaSet |
保证指定数量的Pod副本存在,支持滚动扩缩容 |
无状态应用,通常由Deployment管理 |
|
Deployment |
管理ReplicaSet,实现声明式部署、滚动升级、回滚 |
Web服务、API服务 |
|
StatefulSet |
管理有状态应用,提供稳定的网络标识与存储 |
数据库、Zookeeper、Etcd |
|
DaemonSet |
每个Node上运行一个Pod |
日志收集、监控代理、存储服务 |
|
Job |
执行一次性任务 |
批处理、数据迁移、安全扫描 |
|
CronJob |
周期性任务(类似Crontab) |
定期备份、定时通知、日志清理 |
2.2 Deployment控制器(无状态应用)
特点
-
专为无状态应用设计
-
支持声明式配置更新
-
完整的滚动更新与回滚机制
-
与ReplicaSet协作管理Pod生命周期
配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
关键配置参数
spec:
replicas: 3 # 期望的Pod数量
strategy:
rollingUpdate:
maxSurge: 25% # 升级过程中最多可超期25%的Pod
maxUnavailable: 25% # 升级过程中最多不可用25%的Pod
type: RollingUpdate # 滚动升级策略
2.3 StatefulSet控制器(有状态应用)
核心特性
-
稳定存储:基于PVC实现,每个Pod拥有独立存储
-
稳定网络标识:Pod名称和DNS名称固定不变
-
有序部署/删除:顺序创建(0→N-1),逆序删除(N-1→0)
-
依赖Headless Service:用于DNS解析和服务发现
三大核心组件
-
Headless Service:为Pod生成可解析的DNS记录
-
volumeClaimTemplates:为每个Pod提供专用存储卷
-
StatefulSet:管控Pod资源的控制器
完整示例
# Headless Service定义
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: myapp-pod
# StatefulSet定义
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: myapp-svc
replicas: 3
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: myappdata
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: myappdata
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 2Gi
Pod DNS解析格式
(pod_name).(service_name).(namespace_name).svc.cluster.local
示例:myapp-0.myapp-svc.default.svc.cluster.local
2.4 DaemonSet控制器
适用场景
-
集群存储守护进程:如ceph、glusterd
-
日志收集:如fluentd、logstash
-
节点监控:如Prometheus Node Exporter
-
网络插件:如Calico、Flannel
配置示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
2.5 Job控制器
应用场景
-
数据库迁移
-
批处理任务
-
离线数据处理
-
一次性计算任务
配置示例
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
关键参数
-
restartPolicy:重启策略(OnFailure/Never) -
backoffLimit:失败重试次数(默认6次)
2.6 CronJob控制器
配置示例
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" # 定时规则
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from Kubernetes cluster
restartPolicy: OnFailure
高级配置
spec:
concurrencyPolicy: Allow # 并发策略
startingDeadlineSeconds: 15 # 启动截止时间
successfulJobsHistoryLimit: 3 # 成功记录保留数
failedJobsHistoryLimit: 1 # 失败记录保留数
三、无状态 vs 有状态应用对比
|
特性对比 |
无状态应用(Deployment) |
有状态应用(StatefulSet) |
|---|---|---|
|
Pod名称 |
随机生成 |
固定、有序(0→N-1) |
|
存储方式 |
共享存储或无持久化 |
每个Pod独立PVC |
|
网络标识 |
不固定 |
稳定DNS名称 |
|
扩缩容 |
无序、并行 |
有序、串行 |
|
典型场景 |
Web应用、API服务 |
数据库、中间件集群 |
四、配置资源管理
4.1 Secret(敏感信息管理)
Secret类型
|
类型 |
用途 |
|---|---|
|
|
用户自定义敏感数据(默认类型) |
|
|
服务账户令牌 |
|
|
私有镜像仓库认证 |
|
|
TLS证书文件 |
创建方式
方法一:命令行创建
echo -n 'username' > username.txt
echo -n 'password' > password.txt
kubectl create secret generic mysecret \
--from-file=username.txt \
--from-file=password.txt
方法二:YAML文件创建
apiVersion: v1
kind: Secret
metadata:
name: mysecret1
type: Opaque
data:
username: emhhbmdzYW4= # base64编码
password: MWYyZDFlMmU2N2Rm
使用方式
方式一:Volume挂载
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
volumes:
- name: secrets
secret:
secretName: mysecret
方式二:环境变量
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret1
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret1
key: password
4.2 ConfigMap(配置管理)
创建方式
从目录创建
kubectl create configmap game-config \
--from-file=/opt/configmap/
从字面值创建
kubectl create configmap special-config \
--from-literal=special.how=very \
--from-literal=special.type=good
使用方式
环境变量注入
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
envFrom:
- configMapRef:
name: env-config
Volume挂载
volumes:
- name: config-volume
configMap:
name: special-config
热更新机制
-
Volume挂载:约10秒后自动同步更新
-
环境变量:不会自动更新,需要重启Pod
-
触发更新:可通过修改annotation触发滚动更新
kubectl patch deployment my-nginx \
--patch '{"spec":{"template":{"metadata":{"annotations":{"version/config":"20240520"}}}}}'
五、服务发现机制
5.1 DNS发展历程
-
Kubernetes 1.3以前:SkyDNS
-
Kubernetes 1.3~1.11:KubeDNS
-
Kubernetes 1.11以后:CoreDNS(当前标准)
5.2 服务通信格式
(pod_name).(service_name).(namespace).svc.cluster.local
5.3 Service类型对比
|
特性 |
常规Service |
Headless Service |
|---|---|---|
|
ClusterIP |
有 |
无(None) |
|
访问方式 |
负载均衡 |
直接Pod IP访问 |
|
主要用途 |
统一入口 |
StatefulSet DNS发现 |
六、总结与最佳实践
6.1 控制器选择指南
|
应用类型 |
推荐控制器 |
关键考虑因素 |
|---|---|---|
|
无状态Web服务 |
Deployment |
副本数、滚动更新 |
|
有状态数据库 |
StatefulSet |
持久化存储、有序部署 |
|
节点级守护进程 |
DaemonSet |
节点亲和性、资源限制 |
|
定时任务 |
CronJob |
调度策略、历史记录 |
|
批处理任务 |
Job |
重试策略、完成策略 |
6.2 配置管理建议
-
敏感信息:一律使用Secret存储,启用RBAC控制
-
环境配置:不同环境使用不同的ConfigMap
-
配置更新:利用Volume挂载实现热更新
-
版本控制:对ConfigMap和Secret进行版本管理
6.3 安全实践
-
定期轮转Secret中的凭证
-
使用RBAC严格控制配置资源的访问权限
-
避免在环境变量中传递敏感信息
-
对ConfigMap进行敏感信息扫描
通过合理运用Pod控制器和配置资源管理,可以实现应用的高可用部署、灵活扩缩容以及安全的配置管理,为云原生应用提供稳定可靠的运行环境。
更多推荐
所有评论(0)