Pod控制器
一、Deployment
部署无状态应用
负责创建和管理 ReplicaSet,维护 Pod 副本数量与期望值相同
负责创建和删除 Pod 资源,多个 Pod 副本时是并行执行的,升级策略默认为滚动更新的方式
无中生有出配置文件
kubectl create deployment test-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml > test-deloy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-deploy
name: test-deploy
spec:
replicas: 3
selector:
matchLabels:
app: test-deploy
template:
metadata:
labels:
app: test-deploy
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
二、DaemonSet
部署无状态应用
理论上可以在 K8S 所有 Node 节点上创建相同的 Pod 资源,无论 Node 节点什么时候加入到 K8S 集群(需要考虑到污点和cordon不可调度的影响)
在 DaemonSet 资源清单配置中不需要设置 Pod 副本数(replicas)
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: test-daemon
name: test-daemon
spec:
selector:
matchLabels:
app: test-daemon
template:
metadata:
labels:
app: test-daemon
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
三、StatefulSet
部署有状态应用
每个 Pod 名称都是唯一且固定不变的
每个 Pod 都可以有自己专属的持久化存储(基于PVC模板 volumeClaimTemplates 绑定PV实现的)
需要提前创建一个 Headless Service 资源(无头服务,ClusterIP可以为None),并在 StatefulSet 资源清单配置中使用 serviceName 字段关联 Headless Service
可以在 Pod 内通过 <Pod名称>.<svc名称>.<命名空间>[.svc.cluster.local] 格式解析出 PodIP。(基于 Headless Service 和 CoreDNS 实现的)
创建、滚动升级、扩容、缩容 Pod 都是有序进行的(默认为串行执行的,基于字段 .spec.podManagementPolicy: OrderedReady 实现的;字段值若设置为 Parallel,则为并行执行)
创建、扩容 是升序执行的(顺序为 Pod 标识号从 0 到 n-1)
滚动升级、缩容 是倒序执行的(顺序为 Pod 标识号从 n-1 到 0)
Service 资源的类型: 4个常规类型 + 1个特殊类型
ClusterIP NodePort LoadBalancer ExternalName + Headless Service
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
labels:
app: myapp-svc
spec:
ports:
- port: 80
name: web
clusterIP: None ##headless service通常情况下没有clusterip
selector:
app: myapp-pod
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "myapp-svc" ##指定headless service的名称
replicas: 6
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
storageClassName: nfs-client-storageclass ##指定storageClass的名称
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
四、Job
部署一次性的短期任务的Pod资源,Pod不会持久运行
任务正常完成后Pod容器会正常退出并不会再重启(restartPolicy需要设置为Never或OnFailure),且也不会重建Pod
如果任务执行异常导致Pod容器异常退出,会重建Pod重试任务,重试次数受 backoffLimit 字段配置影响(默认为任务失败后重试6次)
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: nginx
command: ["/bin/sh", "-c", "echo this is one job"]
restartPolicy: Never
backoffLimit: 4
五、Cronjob
部署周期性的短期任务的Pod资源,Pod不会持久运行
任务正常完成后Pod容器会正常退出并不会再重启(restartPolicy需要设置为Never或OnFailure),且也不会重建Pod
使用必配字段 schedule 设置任务执行的周期表,格式为 "分 时 日 月 周"
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" ##必配字段 schedule 设置任务执行的周期表,格式为 "分 时 日 月 周"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: nginx
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cronjob
restartPolicy: OnFailure
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cronjob
restartPolicy: OnFailure