四、常用控制器
POD与controllers的关系
controllers:在集群上管理和运行容器的对象
通过label和seletor相关联
pod通过控制器实现应用的运维,如弹性伸缩,滚动更新等
Controllers的分类
Deployment : 无状态应用部署
StatefulSet : 有状态应用部署
DaemonSet : 确保所有Node运行同一个Pod
Job : 一次性任务
Cronjob : 定时任务
Deployment
部署无状态应用
• 管理Pod和ReplicaSet
• 具有上线部署、副本设定、滚动升级、回滚等功能
• 提供声明式更新,例如只更新一个新的Image
应用场景:Web服务,微服务,API
无状态部署也就是说启动的pod都是基于一个模板的,比如有个node挂了,那么pod会在别的node上拉起,不会考虑存储,网络,只要能在任意节点上能起来,并且多个实例对于同一个请求响应的结果是完全一致的
1、部署应用
kubectl create deployment web --image=nginx:1.14
kubectl get deploy,pods
2、暴露应用
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web kubectl get service
3、应用升级
kubectl set image deployment/web nginx=nginx:1.15
kubectl rollout status deployment/web
或者直接修改ymal文件,执行kubectl apply -f deployment.yaml
k8s会先去启动pod,启动成功后再关闭原来的pods
4、应用回滚
在启动pod的时候最后加上 --record,可以在查看历史版本的时候看到pod信息
如:kubectl apply -f deployment.yaml --record
查看历史版本
kubectl rollout history deployment {控制器名称}
回滚
kubectl rollout undo deployment {控制器名称}
回滚到指定版本
kubectl rollout undo deployment {控制器名称} --to-revision=2
5、扩容/缩容
kubectl scale deployment web --replicas=10
StatefulSet
部署有状态应用
解决Pod独立生命周期,保持Pod启动顺序和唯一性
1. 稳定,唯一的网络标识符(实例之间通信地址要固定),持久存储
2. 有序,按先后顺序进行部署和扩展、删除和终止
应用场景:分布式应用(mysql,zk,etcd)
有状态部署就是每个pod都有独立的数据和网络,在创建一个新的有状态应用时,可以通过备份恢复这些数据
Headless Service.yaml文件
就是把clusterIP设置为None,不需要clusterIP,而是为每个pod提供一个固定的dns名称,部署成功可以通过kubectl get svc可以看到clusterIP为None
clusterIP为None表示谁用了这个service,service就要负责这个pod的网络
apiVersion: v1 kind: Service metadata: labels: app: web name: web spec: clusterIP: None ports: - protocol: TCP port: 80 targetPort: 80 selector: app: web
StatefulSet.yaml容器启动文件
apiVersion: apps/v1 kind: StatefulSet metadata: labels: app: web name: web spec: # 需要设定service的name,告诉StatefulSet控制器要使用hanless service来保证pod身份 serviceName: web replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx
我们可以手动启动一个busybox容器去解析,解析有状态应用返回的是三个pod的ip和对应的dns记录,为了保证通信地址的固定
StatefulSet的存储卷yaml文件
使用VolumeClaimTemplate创建, 称为卷申请模板(StatefulSet独有),当StatefulSet使用VolumeClaimTemplate 创建一个PersistentVolume时,同样也会为每个Pod分配 并创建一个编号的PVC,给每个pod也都会生成一个pv作为独立存储
和deployment的区别是:deployment的pod是共用一个pv,而StatefulSet是一个pod对应一个pv
apiVersion: apps/v1 kind: StatefulSet metadata: labels: app: web name: web spec: serviceName: web replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx volumeMounts: - name: www mountPath: /usr/share/nginx/html # 使用卷申请模板 volumeClaimTemplates: - metadata: name: www spec: # 访问模式 accessModes: [ "ReadWriteOnce" ] # 指定存储的pv名称 storageClassName: "managed-nfs-storage" resources: requests: storage: 1Gi
DaemonSet
• 在每一个Node上运行一个Pod
• 新加入的Node也同样会自动运行一个Pod
应用场景:Agent
DaemonSetymal部署的ymal格式,和Deployment 相似
apiVersion: apps/v1 kind: DaemonSet metadata: name: dsl spec: selector: matchLabels: projecte: blog app: java-demo template: metadata: labels: projecte: blog app: java-demo spec: containers: - name: web image: nginx ports: - containerPort: 80
Job
分为普通任务(Job)和定时任务(CronJob)
一次性执行
应用场景:离线数据处理,视频解码等业务
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
CronJob
定时任务,像Linux的Crontab一样
定时任务
应用场景:通知,备份
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: # 分时日月周,这里代表每分钟执行一次 schedule: "*/1 * * * *" template: spec: containers: - name: pi image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure # 定义重启次数 backoffLimit: 4
浙公网安备 33010602011771号