目录
1 Deployment控制器
2 StatefulSet控制器
3 DaemonSet控制器
4 Job控制器
5 CronJob控制器
1 Deployment控制器
Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新。
Deployment运行无状态应用,一般情况下,我们并不直接创建 Pod,而是通过 Deployment 来创建 Pod,由 Deployment 来负责创建、更新、维护其所管理的所有 Pods。
一个典型的用例如下:
创建Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pc-deployment
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
执行
$ kubectl create namespace dev
$ kubectl create -f pc-deployment.yaml
$ kubectl get deploy -n dev -o wide
2 StatefulSet控制器
StatefulSet是用来管理有状态应用的工作负载API对象,实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为”有状态应用“。在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service。
- service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
- Headless service 无头服务,不需要cluster-IP,直接绑定具体的Pod的IP。
特点
- Pod一致性:包含次序(启动、停止次序)、网络一致性。此一致性与Pod相关,与被调度到哪个node节点无关;
- 稳定的次序:对于N个副本的StatefulSet,每个Pod都在[0,N)的范围内分配一个数字序号,且是唯一的;
- 稳定的网络:Pod的hostname模式为( statefulset 名 称 ) − (statefulset名称)-(statefulset名称)−(序号);
- 稳定的存储:通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的卷。
创建StatefulSet:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: nginx-ss
spec:
selector:
matchLabels:
app: nginx #必须匹配 .spec.template.metadata.labels
serviceName: "nginx" #声明它属于哪个Headless Service.
replicas: 3 #副本数
template:
metadata:
labels:
app: nginx # 必须配置 .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: nginx-pvc
mountPath: /usr/share/nginx/html
volumeClaimTemplates: #可看作pvc的模板
- metadata:
name: nginx-pvc
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nginx-nfs-storage" #存储类名,就是上面nginx-sc.yaml metadata.name
resources:
requests:
storage: 1Gi
EOF
执行
kubectl apply -f nginx-ss.yaml
kubectl get pods -n nginx-ss
3 DaemonSet控制器
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本,通常用于实现系统级后台任务。比如ELK服务。部署一些集群的日志、监控或者其他系统管理应用。
创建DaemonSet
DaemonSet的描述文件和Deployment非常相似,只需要修改Kind,并去掉副本数量的配置即可。
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.13.12
ports:
- containerPort: 80
EOF
执行
kubectl apply -f nginx-daemonset.yaml
4 Job控制器
Job负责批量处理短暂的一次性任务(short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。容器中的进程在正常运行结束后不会对其进行重启,而是将pod对象置于completed状态。若容器中的进程因错误而终止,则需要依据配置确定重启与否,未运行完成的pod对象因其所在的节点故障而意外终止后会被重新调度。
kubernetes支持以下几种Job:
Job Controller
Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直至其成功结束。如果失败,则根据restartPolicy(只支持OnFailure和Nerver,不支持Always)决定是否创建新的Pod再次重试任务。
固定结束次数的Job示例:
apiVersion: batch/v1
kind: Job
metadata:
name: busybox
spec:
completions: 3
template:
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox
command: ["echo","hello"]
restartPolicy: Nerver
5 CronJob控制器
CronJob即定时任务,类似于Linux系统的crontab,在指定的时间周期运行指定的任务。
crontab的格式如下:
分 时 日 月 星期 要运行的命令 第1列分钟0~59 第2列小时0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令
用CronJob来管理我们上面的Job任务
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
EOF
执行
kubectl create -f cronjob.yaml
kubectl get cronjob
是资料整理也是初步学习,部分内容来自Kubernetes(k8s)中的五种控制器_kubenets 控制器-****博客
资料来自部分《Kubernetes指南》和《Kubernetes开源书》
继续学习吧!