K8s-04: Controller
Controller
ReplicationController/ReplicaSet
维持 Pod 的副本数,确保 Pod 的副本数符合用户的要求。RS 支持集合式的 selector, 如 matchLabels 和 matchExpressions。举例:
apiVersion: v1
kind: ReplicaSet
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Deployment
定义 Deployment 时,会自动创建一个 RS,Deployment 会管理这个 RS。
滚动升级和版本回退
扩容和缩容
暂停和恢复
举例:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
扩容:
kubectl scale deployment nginx --replicas=5
autoscale:
kubectl autoscale deployment nginx --min=3 --max=5 --cpu-percent=80
滚动升级:
kubectl set image deployment nginx nginx=nginx:1.15.12
版本回退:
kubectl rollout undo deployment nginx
更新策略:保证升级时只有一定数量的 pod 处于 down 状态,默认值为 25%。
- RollingUpdate: 逐步升级,先创建新的 pod,再删除旧的 pod。
- Recreate: 先删除旧的 pod,再创建新的 pod。
DaemonSet
DaemonSet 保证所有(或者一些)node 上运行一个 pod 的副本。当 node 加入集群时,pod 会被自动创建;当 node 从集群中删除时,pod 也会被自动删除。应用场景:
- 运行集群存储 daemon,如 glusterd、ceph。
- 日志收集 daemon,如 fluentd、logstash。
- 监控 daemon,如 node-exporter、
collectd
、prometheus-node-exporter、datadog-agent、newrelic-agent、ganglia-gmond
。
举例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
StatefulSet
有状态的 pod,每个 pod 都有唯一的标识,pod 的创建和销毁都有顺序,pod 的网络和存储都是稳定的。应用场景:
- 稳定的持久化存储:基于 PVC 的存储卷,重新调度后,pod 仍然可以访问到相同的存储卷。
- 稳定的网络表示:pod 的 hostname 和 subdomain 是稳定的。基于 headless service 的网络标识,不会因为 pod 的重启而改变。
- 有序的部署和扩展:基于 init container 实现。
- 有序收缩和删除。
Job/CronJob
Job: 用于批处理任务,保证批处理任务的一个或者多个 pod 成功结束。
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
Cron: 用于定时任务,支持秒级别的定时任务。给定时间仅执行一次,周期性地在给定时间执行任务。给定时间之前没有执行的任务,会被丢弃。创建 Job 的操作是幂等的,即如果 Job 已经存在,则不会重复创建。
应用:定时备份、定时清理、定时同步,邮件发送。
Cron 举例:
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 the Kubernetes cluster restartPolicy: OnFailure
spec:
- schedule: 定时任务的时间表达式。
- jobTemplate: 定时任务的模板。
- startingDeadlineSeconds: 定时任务的启动截止时间。错过被调度的任务将被视为失败。
- concurrencyPolicy: 定时任务的并发策略。默认为 Allow,表示允许并发执行。如果设置为 Forbid,表示禁止并发执行。如果设置为 Replace,表示如果有任务正在执行,则取消正在执行的任务,只保留最后一个任务。
- successfulJobsHistoryLimit: 保留成功完成的任务的数量。默认为 3。
- suspend: 暂停定时任务的调度。
HorizontalPodAutoscaler(HPA)
用于根据 pod 的 cpu 使用率和内存使用率,自动调整 pod 的副本数。仅支持 Deployment 和 ReplicaSet。