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就绪探测
部署描述:
- metadata.name: 部署名称是
myapp-v1
。 - spec.replicas: 指定pod有3个副本运行。
- spec.selector.matchLabels: 这些标签用于确定哪些Pod应由此Deployment管理。在本例中,它们是
app: myapp
和version: v1
。 - spec.template: 定义了每个Pod的规格。
- spec.template.metadata.labels: 定义了Pod的标签。
- spec.template.spec.containers: 列出了Pod中运行的容器。在这里,运行一个
nginx
容器。 - 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