文章目录
- 一、控制器类型
- 二、Deployment控制器
- 三、SatefulSet控制器
- 四、Daemonset控制器
- 五、Job控制器
- 六、CronJob 控制器
一、控制器类型
- Deployment:适合无状态的服务部署
- StatefullSet:适合有状态的服务部署
- DaemonSet:一次部署,所有的node节点都会部署
- Job:一次性的执行任务
- Cronjob:周期性的执行任务
二、Deployment控制器
-
简介
一般情况下,我们并不直接创建 Pod,而是通过 Deployment 来创建 Pod,由 Deployment 来负责创建、更新、维护其所管理的所有 Pods。
-
过程
1)创建Deployment
2)调用deployment-controller(deployment控制器)创建一个ReplicaSet
3)ReplicaSet调用replicaset-controller创建pod
4)Pod创建完之后就会由启用资源调度程序default-scheduler,将pod分配对应的node节点,由kubelet管理pod
-
应用场景
1)定义Deployment来创建Pod和ReplicaSet
2)滚动升级和回滚应用
3)扩容和缩容
4)暂停和继续Deployment -
编写yaml清单:vi deployment-nginx.yaml
apiVersion: apps/v1 kind: Deployment metadata:name: deployment-nginx #Deployment 的名称labels:app: nginx spec:replicas: 3 # 创建 Pod 的副本数selector: #定义 Deployment 如何找到要管理的 Pod,与 template 的 label(标签)对应matchLabels:app: nginxtemplate: #字段包含以下字段:metadata:labels:app: nginx #使用 label(标签)标记 Podspec: #表示 Pod 运行一个名字为 nginx 的容器containers:- name: nginximage: nginx:1.15 #表示 Pod 运行一个名字为 nginx 的容器ports: #容器用于发送和接收流量的端口- containerPort: 80
-
创建控制器: kubectl apply -f deployment-nginx.yaml
-
查看: kubectl get deployment
三、SatefulSet控制器
-
简介
StatefulSet是用来管理有状态应用的工作负载API对象,实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为有状态应用。
StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。
在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。
-
service与Headless service 区别
- service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
- Headless service 无头服务,不需要cluster-IP,直接绑定具体的Pod的IP。
-
应用场景
1) 稳定的持久化存储, 通过VolumeClaimTemplate为每个Pod创建一个PV。即使Pod重新调度后还是能访问到相同的持久化数据, 基于PVC来实现
2) 稳定的网络标志, 即Pod重新调度后其Pod Name和HostName不变, 基于Headless Service(即没有ip地址和端口的ClusterIP) 来实现
3) 有序部署, 有序扩展,有序收缩,对于N个副本的StatefulSet,每个Pod都在[0,N)的范围内分配一个数字序号,且是唯一的, 基于initcontainers来实现 -
编写yaml清单:vi statefulset-nginx.yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: web-statefulset spec: serviceName: "nginx-statefulset"replicas: 3selector: matchLabels: app: nginx-statefulsettemplate: metadata: labels: app: nginx-statefulsetspec: containers: - name: nginx-statefulsetimage: nginxports: - containerPort: 80name: web-statefulset
-
创建资源文件:kubectl apply -f statefulset-nginx.yaml
-
查看启动的pod:kubectl get pod
ps:statefulset资源控制器启动后,pod的名称为ps:statefulsetName-[0-n]
-
起一个容器并且进入容器内部:kubectl run -it --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh
-
在容器内测试:ping web-statefulset-0.nginx-statefulset
-
查看地址:nslookup web-statefulset-0.nginx-statefulset
-
StatefulSet的DNS说明
StatefulSet中每个Pod的 DNS格式为statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local 1. serviceName为 Headless Service的名字 2. 0..N-1为Pod所在的序号,从О开始到N-1 3. statefulSetName为StatefulSet的名字 4. namespace为服务所在的namespace,Headless Servic和StatefulSet必须在相同的namespace 5. .cluster.local为Cluster Domain
-
StatefulSet扩容与缩容命令的两种命令
1. kubectl scale statefulset web-statefulset --replicas=5 2. kubectl patch statefulset web-statefulset -p '{"spec":{"replicas":2}}'
-
StatefulSet不支持直接更新镜像,需要使用patch间接实现
kubectl patch statefulset web-statefulset --type='json' -p='[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"nginx:1.9.1"}]'
四、Daemonset控制器
-
简介
服务守护进程,它的主要作用是在Kubernetes集群的所有节点中运行我们部署的守护进程,相当于在集群节点上分别部署Pod副本,如果有新节点加入集群,Daemonset会自动的在该节点上运行我们需要部署的Pod副本,相反如果有节点退出集群,Daemonset也会移除掉部署在旧节点的Pod副本。
-
应用场景
1)日志系统的日志收集
2)监控系统的数据收集
-
编写yaml清单:vi daemonSet-nginx.yaml
apiVersion: apps/v1 kind: DaemonSet #创建DaemonSet资源 metadata:name: fluentd #名字 spec: selector: matchLabels: app: loggingtemplate: metadata: labels: app: loggingid: fluentdname: fluentdspec:containers: - name: fluentd-esimage: agilestacks/fluentd-elasticsearch:v1.3.0env: #环境变量配置- name: FLUENTD_ARGS #环境变量的keyvalue: -qq #环境变量的valuevolumeMounts: #加载数据卷,避兔数据丢失- name: containers #数据卷名字mountPath: /var/lib/docker/containers #将数据卷挂载到容器内的哪个目录- name: varlogmountPath: /varlogvolumes: #定义数据卷- hostPath: #数据卷类型,主机路径的模式,也就是与node 共享目录path: /var/lib/docker/containers # node中的共享目录name: containers #定义的数据卷的名称- hostPath:path: /var/logname: varlog
-
创建资源:kubectl apply -f daemonSet-nginx.yaml
-
查看:kubectl get pod -o wide
ps:可以看到默认在工作节点地下都生成了DaemonSet的pod
-
修改配置:kubectl edit ds fluentd
Daemonset会忽略Node的unschedulable状态,有几种方式来指定 Pod只运行在指定的Node节点上: nodeSelector:只调度到匹配指定label的Node 上 nodeAffinity:功能更丰富的Node选择器,比如支持集合操作 podAffinity:调度到满足条件的Ped所在的Node 上
spec:nodeSelector:type: microservervices
-
再次查看pod:kubectl get pod
-
查看node的label,发现没有符合部署pod条件的:kubectl get node --show-labels
-
给worker1和worker2添加标签:
kubectl label no worker1 type=microservervices kubectl label no worker2 type=microservervices
-
再次查看pod:kubectl get pod
五、Job控制器
-
简介
Job控制器用于调配pod对象运行一次性任务,容器中的进程在正常运行结束后不会对其进行重启,而是将pod对象置于completed状态。若容器中的进程因错误而终止,则需要依据配置确定重启与否,未运行完成的pod对象因其所在的节点故障而意外终止后会被重新调度。
-
编写yaml清单:vi job-demo.yaml
apiVersion: batch/v1 kind: Job metadata:name: job-demo spec:template:metadata:name: job-demospec:restartPolicy: Nevercontainers:- name: counterimage: busyboxcommand:- "bin/sh"- "-c"- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
-
创建pod:kubectl apply -f job-demo.yaml
-
查看: kubectl logs job-demo-4dr95
六、CronJob 控制器
-
简介
CronJob其实就是在Job的基础上加上了时间调度,类似Linux中的crontab。
-
crontab格式
ps:多个时间可以用逗号隔开; 范围可以用连字符给出;*可以作为通配符; /表示每…
分钟 值从 0 到 59. 小时 值从 0 到 23. 日 值从 1 到 31. 月 值从 1 到 12. 星期 值从 0 到 6, 0 代表星期日
-
编写yaml清单:vi cronJob-demo.yaml
apiVersion: batch/v1 kind: CronJob metadata:name: cronjob-demo spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:restartPolicy: OnFailurecontainers:- name: helloimage: busyboxargs:- "/bin/sh"- "-c"- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
-
创建pod:kubectl apply -f cronJob-demo.yaml
-
查看:kubectl get pod
ps:一分钟执行一次
-
查看: kubectl logs cronjob-demo-28281040-866ns