0
点赞
收藏
分享

微信扫一扫

从入门到精通:Deployment操作与CKA考点全解析!

从入门到精通:Deployment操作与CKA考点全解析!_Deployment


什么是Deployment

K8S的Deployment是一种用于管理Pod副本的控制器,它通过管理ReplicaSet来间接管理Pod。

以下是关于K8S Deployment的一些关键点:

  1. 间接管理:Deployment不直接管理Pod,而是通过ReplicaSet来实现对Pod的管理。
  2. 版本控制:支持滚动更新和版本回退,使得应用部署更加灵活和可控。
  3. 扩展性强:Deployment提供了比ReplicaSet更强大的功能,包括扩容、缩容、暂停和继续部署等操作。
  4. 资源文件:Deployment的资源清单文件通常定义了应用的版本号、类型等信息,是声明式配置的一部分。
  5. 创建流程:用户通过kubectl命令创建Deployment,Deployment再创建ReplicaSet,最后由ReplicaSet创建Pod。
  6. 通信机制:Pod中的容器能够通过localhost互相通信,因为它们运行在同一台服务器中并共享资源。

我们先看一下Deployment在K8S集群中的位置:

从入门到精通:Deployment操作与CKA考点全解析!_回滚_02

Deployment并不直接操作Pod,而是使用ReplicaSet这种资源来控制Pod,它也正是通过ReplicaSet实现了水平拓展、滚动更新,只不过ReplicaSet属于内部资源,我们一般情况下不需要直接操作。ReplicaSet给Deployment做一些“跑腿”的工作。


Deployment资源对象介绍

接下来给出一个K8S中通过Deployment创建应用的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-app-deployment
spec:
  replicas: 3 #副本数
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1  # 设置在滚动更新中可以额外创建的Pod的最大数量
      maxUnavailable: 1  # 设置在滚动更新中允许不可用的Pod的最大数量
  selector: #以此筛选所控制的pod
    matchLabels:
      app: your-app
  template:  #以下内容为pod模版 
    metadata:
      labels: #以此匹配deployment
        app: your-app
    spec:
      initContainers: #初始化容器
      - name: init-container
        image: your-registry/init-container:latest
        # 在这里可以定义初始化容器的其他配置,如环境变量、卷挂载等
      containers: #正式的应用容器
      - name: your-app
        image: your-registry/your-app:latest
        ports:
        - containerPort: 80
        # 在这里可以定义主应用容器的其他配置,如环境变量、卷挂载等
        imagePullPolicy: Always  # 设置镜像拉取策略为始终拉取最新镜像
        livenessProbe: #存活探针
          httpGet:
            path: /healthz  # 替换成你的应用提供的 liveness 探针路径
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 5
        readinessProbe: #可读探针
          httpGet:
            path: /readiness  # 替换成你的应用提供的 readiness 探针路径
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

在这个示例中:

  • strategy 部分定义了滚动更新策略,其中 maxSurge 控制在滚动更新中可以额外创建的 Pod 的最大数量
  • maxUnavailable 控制在滚动更新中不可用的 Pod 的最大数量,这可以确保在更新过程中始终保持一定数量的可用 Pod
  • imagePullPolicy: Always 部分设置了镜像拉取策略为始终拉取最新镜像。这表示每次启动 Pod 时,都会拉取最新的镜像,这个值也可以设置为 IfNotPresent 或 Never。


滚动更新

当Deployment中的Pod模板更新(如镜像更新)之后会发生什么呢?相信你已经知道,会发生滚动更新,而strategy部分定义了更新的策略。但是这个过程中具体是怎么做的呢?请看下图:

从入门到精通:Deployment操作与CKA考点全解析!_Pod_03

Kubernetes会创建了一个新版本的ReplicaSet(基于新镜像的Pod),此时就有两个ReplicaSet了:一个是基于旧镜像的Pod,一个是基于新镜像的Pod。之后新版本的ReplicaSet每启动一个新的Pod,旧版本的ReplicaSet就会删除一个旧的Pod,直到全部更新完成。这就在服务不停止的状态下实现了一次平滑的滚动更新。


滚动更新完成之后,旧版本的ReplicaSet将会暂停并且它已经不再管理任何Pod,但是它仍然保留了所有的配置信息,这使得我们轻松地可以将服务回滚到之前的版本。


水平扩容/缩容

如何实现水平扩缩容呢,比如我们想将副本数设置为5,相信聪明如你,已经知道,只需要修改replicas对应的值,我们可以更改your-app-deployment.yaml 文件中的replicas的值,然后重新执行 kubectl apply -f your-app-deployment.yaml 命令,也可以直接更改Deployment资源示例,命令如下:

kubectl scale deployment your-app-deployment --replicas=5 -n yournamespaces

这个时候,会发生什么呢?相信你已经猜到了,Deployment 所对应的ReplicaSet,就会根据修改后的replicas值自动创建2个新的 Pod,这也就是所谓的水平拓展,同理,如果我们想水平缩容,只需要将replicas的值缩减即可。


回滚

当我们进行回滚操作时,可以使用以下命令来查看历史版本列表信息:

kubectl rollout history deployment your-deplyment-name -n yournamespaces

然后通过以下命令来查看某个版本的详细信息:

kubectl rollout history deployment your-deplyment-name --revisinotallow=revisionnumber -n yournamespaces

最后,如果我们想回滚到某个版本,可以使用以下命令进行回滚:

kubectl rollout undo deployment your-deplyment-name --to- revisinotallow=revisionnumber  -n your

CKA真题

真题截图

从入门到精通:Deployment操作与CKA考点全解析!_回滚_04

中文解析

切换 k8s 集群环境:kubectl config use-context k8s

Task

loadbalancer 的 deployment 管理的 Pod 的副本数扩容成 6 个。

参考文档

Deployments

解题作答

  • 切换集群环境

kubectl config use-context k8s

  • 检查现有的Pod数量

kubectl get deploy loadbalancer  -o wide

  • 扩容loadbalancer 的 deployment 管理的 Pod 的副本数扩容成 6 个

kubelct scale deploy loadbalancer  --replicas=6

  • 检查Pod的数量

kubectl get pod

举报

相关推荐

0 条评论