Kubernetes Deployment: 从原理到Web站点实操与健康检查

Deployment 控制器:概念、原理解读

Deployment官方文档:

Deployment 概述

Deployment 在 Kubernetes 中是一个非常关键的资源对象,它为Pod和ReplicaSet的创建提供了一种声明式的定义方法,当我在Deployment对象中描述一个期望的状态时,Deployment 控制器会按照设定的控制策略将实际状态逐步调整为期望状态。通常,通过定义 Deployment 会创建一个新的 ReplicaSet 来管理 Pod 的实例。同样地,当删除 Deployment 时,它会同时删除其所管理的 ReplicaSet 和 Pod。

选择使用 Deployment 而非直接使用 ReplicaSet 的主要原因是,Deployment 提供了一些 ReplicaSet 所不具备的特性,如滚动升级、金丝雀发布、蓝绿部署和回滚等功能

声明式定义:即用户只需声明所需的最终状态,而 Kubernetes 会自动地尝试达到这个状态。通过直接修改资源清单 yaml 文件并使用 kubectl apply -f 实现。

Deployment 工作原理:如何管理rs和Pod?

Deployment 为 Pod 和 ReplicaSet 提供了声明式定义。在修改 Deployment 时,可以直接在命令行中使用纯命令的方式来完成对资源内容的修改,也即打补丁方式;同时,Deployment 还可以提供滚动更新、控制更新节奏和更新逻辑。

互动:什么叫做更新节奏和更新逻辑呢?

例如,如果 Deployment 管理 5 个 Pod 副本,期望 Pod 数量是 5,但在升级时可能需要增加一些 Pod。这时,控制器会先增加一个 Pod,然后再删除一个旧的 Pod,这样始终保持 5 个 Pod 的数量。此外,还可以设定在升级过程中最多增加或减少的 Pod 数量,这种滚动更新策略通常需要加入 readinessProbe 和 livenessProbe 探测,以确保新的 Pod 里的应用都已正常启动后再删除旧的 Pod。

Deployment 资源清单文件编写技巧

当你查看 kubectl explain deployment 的输出时,可以看到 Deployment 资源的主要字段和其描述,这些字段包括:

  • apiVersion:资源使用的 API 版本。
  • kind:定义的资源类型。
  • metadata:标准对象的元数据,例如资源的名称和命名空间。
  • spec:定义 Deployment 的行为。
  • status:Deployment 的最近观察到的状态。

spec 字段下,有许多配置 Deployment 行为的参数:

  • paused:表示 Deployment 是否暂停。
  • replicas:期望的 Pod 副本数量。
  • selector:标签选择器,用于选择 Deployment 管理的 Pod。
  • strategy:用于替换旧 Pod 的部署策略。
  • template:描述将被创建的 Pod 的模板。

strategy 字段下,有两种部署策略:

  • Recreate:重新创建,即先杀死所有现有的 Pod,再创建新的 Pod。
  • RollingUpdate:滚动更新,即逐渐缩小旧的 ReplicaSet 并放大新的 ReplicaSet。

对于 RollingUpdate,有两个关键的参数:

  • maxSurge:更新过程中,允许超出指定的目标副本数的最大 Pod 数。
  • maxUnavailable:在更新过程中,最多允许的不可用的 Pod 数。

template 字段描述了创建的 Pod 的模板,它的结构和普通的 Pod 定义非常相似,但不包含 apiVersion 和 kind 字段。

Deployment 使用案例

创建一个web站点

apiVersion: apps/v1 kind: Deployment metadata:   name: myapp-v1 spec:   replicas: 3 ##deployment管理的pod副本数   selector:     matchLabels: # matchLabels下定义的标签需要跟template.metadata.labels定义的标签一致       app: myapp       version: v1   template:     metadata:       labels:         app: myapp         version: v1     spec: #定义容器的属性       containers:       - name: nginx         image: nginx         imagePullPolicy: IfNotPresent         ports:         - containerPort: 80         startupProbe:           initialDelaySeconds: 6           periodSeconds: 10           timeoutSeconds: 10           failureThreshold: 3           httpGet:             port: 80             path: /             scheme: HTTP         livenessProbe:           initialDelaySeconds: 6           periodSeconds: 10           timeoutSeconds: 10           failureThreshold: 3           httpGet:             port: 80             path: /             scheme: HTTP         readinessProbe:           initialDelaySeconds: 6           periodSeconds: 10           timeoutSeconds: 10           failureThreshold: 3           httpGet:             port: 80             path: /             scheme: HTTP

备注:startupProbe启动探测;livenessProbe存活探测;readinessProbe就绪探测

部署描述:

  1. metadata.name: 部署名称是 myapp-v1
  2. spec.replicas: 指定pod有3个副本运行。
  3. spec.selector.matchLabels: 这些标签用于确定哪些Pod应由此Deployment管理。在本例中,它们是 app: myappversion: v1
  4. spec.template: 定义了每个Pod的规格。
  5. spec.template.metadata.labels: 定义了Pod的标签。
  6. spec.template.spec.containers: 列出了Pod中运行的容器。在这里,运行一个 nginx 容器。
  7. Probes:
    • startupProbe: 检查容器是否已启动。
    • livenessProbe: 检查容器是否还在运行。
    • readinessProbe: 检查容器是否已准备好开始接受流量。

使用 kubectl apply 来应用或更新这个部署:

[root@pengfei-master1 deply]# kubectl apply -f deploy-demo.yaml

使用 kubectl get deploy 来查看部署状态

[root@pengfei-master1 deply]# kubectl get deploy

1.NAME :列出名称空间中deployment的名称。
2.READY:显示deployment有多少副本数。它遵循ready/desired的模式。
3.UP-TO-DATE: 显示已更新到所需状态的副本数。
4.AVAILABLE: 显示可以使用多少个应用程序副本。
5.AGE :显示应用程序已运行的时间。

使用 kubectl get rs 来查看由部署创建的 ReplicaSets

[root@pengfei-master1 deply]# kubectl get rs

1.NAME: 列出名称空间中ReplicaSet资源
2.DESIRED:显示应用程序的所需副本数,这些副本数是在创建时定义的。这是所需的状态。
3.CURRENT: 显示当前正在运行多少个副本。
4.READY: 显示你的用户可以使用多少个应用程序副本。
5.AGE :显示应用程序已运行的时间。

请注意,ReplicaSet的名称始终设置为[deployment-name]-[RANDOM-STRING]。RANDOM-STRING是随机生成的

使用 kubectl get pods 来查看刚才创建的Pod

[root@pengfei-master1 deply]# kubectl get pods NAME                        READY   STATUS    RESTARTS   AGE myapp-v1-5c5679b84d-rfp9t   1/1     Running   0          2m27s myapp-v1-5c5679b84d-tl6bk   1/1     Running   0          2m27s myapp-v1-5c5679b84d-zrqkn   1/1     Running   0          2m27s