k8s工作负载控制器之deployment介绍与使用

目录

工作负载控制器

Deployment

deployment生命周期演示

 1、部署镜像

2、应用升级

3、滚动升级的实现(ReplicaSet)

4、deployment应用实例扩容与缩容

5、deployment应用回滚

6、项目下线


工作负载控制器

工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
 常用工作负载控制器有: 
• Deployment : 无状态应用部署 
• StatefulSet : 有状态应用部署
 • DaemonSet : 确保所有Node运行同一个Pod 
• Job : 一次性任务 • Cronjob : 定时任务
控制器的作用:
1、管理pod对象
2、使用标签与pod绑定
•3、控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等。

Deployment

deployment是最常用的控制器
Deployment的功能:  • 管理Pod和ReplicaSet
                                    • 具有上线部署、副本设定、滚动升级、回滚等功能 
                                    应用场景:网站、API、微服务
先来理解一个项目的生命周期
k8s工作负载控制器之deployment介绍与使用_第1张图片

deployment生命周期演示

 1、部署镜像

kubectl apply -f xxx.yaml
或者
 kubectl create deployment web --image=nginx:1.15 --replicas=3
示例
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.16
        name: nginx
        resources: {}
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 3 #启动容器后多少秒健康检查
          periodSeconds: 10 #以后每间隔多少秒检查一次
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 10
导出service的yaml
kubectl expose deployment nginx --port=80 --target-port=8080 --type=NodePort --dry-run=client -o yaml > service.yaml
修改内容
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
执行yaml查看
kubectl get svc,pods
k8s工作负载控制器之deployment介绍与使用_第2张图片

2、应用升级

deployment升级一般默认是滚动升级,即当deployment执行升级的时候,他会先起一个新的容器,再删掉旧容器
一般执行镜像更新有三种方式
• kubectl apply -f xxx.yaml(最常用的方式)
• kubectl set image deployment/web nginx=nginx:1.17 
• kubectl edit deployment/web #使用系统编辑器打开
k8s工作负载控制器之deployment介绍与使用_第3张图片
2.1 采用第一种方式升级
vi deployment.yaml   
将镜像版本由1.6换成1.7
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.17
        name: nginx
        resources: {}
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 3 #启动容器后多少秒健康检查
          periodSeconds: 10 #以后每间隔多少秒检查一次
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 10
执行yaml
kubectl apply -f deployment.yaml     
            
可以看到,他的升级是滚动的,先启动一个新的容器在杀掉一个旧容器,直到全部升级完成 
k8s工作负载控制器之deployment介绍与使用_第4张图片    
2.2,采用第二种方式去更新
kubectl set image deployment/web 容器名=nginx:1.17
示例
kubectl set image deployment nginx nginx=nginx:1.18
k8s工作负载控制器之deployment介绍与使用_第5张图片
2.3,采用第三种方式升级
kubectl edit deployment nginx
他会直接进入系统编辑页面,可以直接修改
k8s工作负载控制器之deployment介绍与使用_第6张图片

3、滚动升级的实现(ReplicaSet

k8s工作负载控制器之deployment介绍与使用_第7张图片
3.1 ReplicaSet控制器
初次部署,副本数其实是由replicaSet管理的,replicaSet是副本集,主要用来维护pod数量
ReplicaSet:副本集,主要维护Pod副本数量,不断对比当前Pod数量 与期望Pod数量。 
ReplicaSet用途:Deployment每次发布都会创建一个RS作为记录, 用于实现滚动升级和回滚。
k8s工作负载控制器之deployment介绍与使用_第8张图片
例如,在用户对一个副本数为3的nginx1.6升级为nginx1.7时,replicaSet的变化是
第一步:创建RS(nginx-68dcf59cf5)并副本数设置为1(扩容)(1.17镜像起一个pod)
第二步:将RS(nginx-686db6866d)副本数设置为2(缩容)
第三步:将RS(nginx-68dcf59cf5)副本数设置为2(扩容)
第四步:将RS(nginx-686db6866d)副本数设置为1(缩容)
第五步:将RS(nginx-68dcf59cf5)副本数设置为3(扩容)
第六步:将RS(nginx-686db6866d)副本数设置为0(缩容)
kubectl get replicaset
3.2 滚动升级的策略
spec:
replicas: 3
revisionHistoryLimit: 10 # RS历史版本保存数量
selector:
matchLabels:
app: web
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
• maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数 量比期望(replicas)Pod数量最大多出25% 
• maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时 最大25% Pod数量不可用,即确保75% Pod数量是可用状态。

4、deployment应用实例扩容与缩容

在实际使用场景中,当有需求是启动多实例提高并发的时候,有两个方案实现
1、  修改yaml里replicas值,再apply 
2、 kubectl scale deployment web --replicas=10
注:replicas参数控制Pod副本数量
k8s工作负载控制器之deployment介绍与使用_第9张图片
示例
kubectl scale deployment nginx --replicas=10
kubectl get pods
可以看到,pod数量变成了十个
k8s工作负载控制器之deployment介绍与使用_第10张图片
kubectl get ep

5、deployment应用回滚

5.1当我们在更新中发现更新有问题,需要回滚在上一个版本的时候,可能就需要应用回滚这个功能,回滚一般包括
kubectl rollout history deployment/web # 查看历史发布版本 
kubectl rollout undo deployment/web # 回滚上一个版本 
kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本
注:回滚是重新部署某一次部署时的状态,即当时版本所有配置
5.2示例
第一步,查看名为nginx的deployment过去所有版本
kubectl rollout history deployment nginx

k8s工作负载控制器之deployment介绍与使用_第11张图片
第二步,回滚到上一个版本
kubectl rollout undo deployment nginx
在查看历史版本
kubectl rollout history deployment nginx
k8s工作负载控制器之deployment介绍与使用_第12张图片
发现3不见了,变成了5,即现在回滚成功,该deployment回滚到第3个版本
另外,还有回滚到指定版本需求
kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本
5.3,另外。如果想知道历史版本镜像,可以通过这个命令
kubectl describe rs |egrep "revision:|Name:|Image:"
如例
k8s工作负载控制器之deployment介绍与使用_第13张图片
它包括deployment版本和name以及镜像版本,以此作参考回滚到某个位置

6、项目下线

项目下线,即删除对应deployment与service资源
kubectl delete deploy/web 
kubectl delete svc/web
6.1、示例
kubectl delete deployment nginx
kubectl delete svc nginx

你可能感兴趣的:(k8s之负载控制器,运维,kubernetes,运维开发,容器)