我将它们简单的分类为如下几种资源对象:php
类别 | 名称 |
---|---|
资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling、Node、Namespace、Service、Ingress、Label、CustomResourceDefinition |
存储对象 | Volume、PersistentVolume、Secret、ConfigMap |
策略对象 | SecurityContext、ResourceQuota、LimitRange |
身份对象 | ServiceAccount、Role、ClusterRole |
在想要建立的 Kubernetes 对象对应的 .yaml
文件中,须要配置以下的字段:html
apiVersion
- 建立该对象所使用的 Kubernetes API 的版本kind
- 想要建立的对象的类型metadata
- 帮助识别对象惟一性的数据,包括一个 name
字符串、UID 和可选的 namespace
也须要提供对象的 spec
字段。对象 spec
的精确格式对每一个 Kubernetes 对象来讲是不一样的,包含了特定于该对象的嵌套字段。Kubernetes API 参考可以帮助咱们找到任何咱们想建立的对象的 spec 格式。linux
Kubernetes 中的 ReplicaSet 主要的做用是维持一组 Pod 副本的运行,它的主要做用就是保证必定数量的 Pod 可以在集群中正常运行,它会持续监听这些 Pod 的运行状态,在 Pod 发生故障重启数量减小时从新运行新的 Pod 副本。nginx
这篇文章会介绍 ReplicaSet 的工做原理,其中包括在 Kubernetes 中是如何被建立的、如何建立并持有 Pod 并在出现问题时重启它们。redis
在具体介绍 ReplicaSet 的实现原理以前,咱们仍是会先简单介绍它的使用,与其余的 Kubernetes 对象同样,咱们会在 Kubernetes 集群中使用 YAML 文件建立新的 ReplicaSet 对象,一个常见的 ReplicaSet 的定义实际上是这样的:api
apiVersion: apps/v1 kind: ReplicaSet metadata: name: frontend labels: app: guestbook tier: frontend spec: replicas: 3 selector: matchLabels: tier: frontend template: metadata: labels: tier: frontend spec: containers: - name: php-redis image: gcr.io/google_samples/gb-frontend:v3
这里的 YAML 文件除了常见的 apiVersion
、kind
和 metadata
属性以外,规格中总共包含三部分重要内容,也就是 Pod 副本数目 replicas
、选择器 selector
和 Pod 模板 template
,这三个部分共同定义了 ReplicaSet 的规格:安全
同一个 ReplicaSet 会使用选择器 selector
中的定义查找集群中本身持有的 Pod
对象,它们会根据标签的匹配获取可以得到的 Pod,下面就是持有三个 Pod 对象的 Replica 拓扑图:bash
被 ReplicaSet 持有的 Pod 有一个 metadata.ownerReferences
指针指向当前的 ReplicaSet,表示当前 Pod 的全部者,这个引用主要会被集群中的 垃圾收集器 使用以清理失去全部者的 Pod 对象。app
全部 ReplicaSet 对象的增删改查都是由 ReplicaSetController
控制器完成的,该控制器会经过 Informer
监听 ReplicaSet 和 Pod 的变动事件并将其加入持有的待处理队列:frontend
ReplicaSetController
中的 queue
其实就是一个存储待处理 ReplicaSet 的『对象池』,它运行的几个 Goroutine 会从队列中取出最新的数据进行处理,上图展现了事件从发生到被处理的流向,咱们接下来将分别介绍 ReplicaSet 中常见的同步过程。
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代之前的ReplicationController 来方便的管理应用。典型的应用场景包括:
好比一个简单的nginx应用能够定义为
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
扩容:
kubectl scale deployment nginx-deployment --replicas 10
若是集群支持 horizontal pod autoscaling 的话,还能够为Deployment设置自动扩展:
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
更新镜像也比较简单:
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
回滚:
kubectl rollout undo deployment/nginx-deployment
注意: Deployment 的 rollout 当且仅当 Deployment 的 pod template(例如.spec.template
)中的label更新或者镜像更改时被触发。其余更新,例如扩容Deployment不会触发 rollout。
假如咱们如今想要让 nginx pod 使用nginx:1.9.1
的镜像来代替原来的nginx:1.7.9
的镜像。
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 deployment "nginx-deployment" image updated
咱们可使用edit
命令来编辑 Deployment,修改 .spec.template.spec.containers[0].image
,将nginx:1.7.9
改写成 nginx:1.9.1
。
$ kubectl edit deployment/nginx-deployment deployment "nginx-deployment" edited
查看 rollout 的状态,只要执行:
$ kubectl rollout status deployment/nginx-deployment Waiting for rollout to finish: 2 out of 3 new replicas have been updated... deployment "nginx-deployment" successfully rolled out
Rollout 成功后,get
Deployment:
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 3 3 3 3 36s
UP-TO-DATE 的 replica 的数目已经达到了配置中要求的数目。
CURRENT 的 replica 数表示 Deployment 管理的 replica 数量,AVAILABLE 的 replica 数是当前可用的replica数量。
咱们经过执行kubectl get rs
能够看到 Deployment 更新了Pod,经过建立一个新的 ReplicaSet 并扩容了3个 replica,同时将原来的 ReplicaSet 缩容到了0个 replica。
$ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-1564180365 3 3 0 6s nginx-deployment-2035384211 0 0 0 36s
执行 get pods
只会看到当前的新的 pod:
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-1564180365-khku8 1/1 Running 0 14s nginx-deployment-1564180365-nacti 1/1 Running 0 14s nginx-deployment-1564180365-z9gth 1/1 Running 0 14s
下次更新这些 pod 的时候,只须要更新 Deployment 中的 pod 的 template 便可。
Deployment 能够保证在升级时只有必定数量的 Pod 是 down 的。默认的,它会确保至少有比指望的Pod数量少一个是up状态(最多一个不可用)。
Deployment 同时也能够确保只建立出超过时望数量的必定数量的 Pod。默认的,它会确保最多比指望的Pod数量多一个的 Pod 是 up 的(最多1个 surge )。
在将来的 Kuberentes 版本中,将从1-1变成25%-25%。
例如,若是您本身看下上面的 Deployment,您会发现,开始建立一个新的 Pod,而后删除一些旧的 Pod 再建立一个新的。当新的Pod建立出来以前不会杀掉旧的Pod。这样可以确保可用的 Pod 数量至少有2个,Pod的总数最多4个。
$ kubectl describe deployments Name: nginx-deployment Namespace: default CreationTimestamp: Tue, 15 Mar 2016 12:01:06 -0700 Labels: app=nginx Selector: app=nginx Replicas: 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge OldReplicaSets: <none> NewReplicaSet: nginx-deployment-1564180365 (3/3 replicas created) Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 36s 36s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3 23s 23s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1 23s 23s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2 23s 23s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3
咱们能够看到当咱们刚开始建立这个 Deployment 的时候,建立了一个 ReplicaSet(nginx-deployment-2035384211),并直接扩容到了3个 replica。
当咱们更新这个 Deployment 的时候,它会建立一个新的 ReplicaSet(nginx-deployment-1564180365),将它扩容到1个replica,而后缩容原先的 ReplicaSet 到2个 replica,此时知足至少2个 Pod 是可用状态,同一时刻最多有4个 Pod 处于建立的状态。
接着继续使用相同的 rolling update 策略扩容新的 ReplicaSet 和缩容旧的 ReplicaSet。最终,将会在新的 ReplicaSet 中有3个可用的 replica,旧的 ReplicaSet 的 replica 数目变成0。
有时候您可能想回退一个 Deployment,例如,当 Deployment 不稳定时,好比一直 crash looping。
默认状况下,kubernetes 会在系统中保存前两次的 Deployment 的 rollout 历史记录,以便您能够随时回退(您能够修改revision history limit
来更改保存的revision数)。
注意: 只要 Deployment 的 rollout 被触发就会建立一个 revision。也就是说当且仅当 Deployment 的 Pod template(如.spec.template
)被更改,例如更新template 中的 label 和容器镜像时,就会建立出一个新的 revision。
其余的更新,好比扩容 Deployment 不会建立 revision——所以咱们能够很方便的手动或者自动扩容。这意味着当您回退到历史 revision 时,只有 Deployment 中的 Pod template 部分才会回退。
假设咱们在更新 Deployment 的时候犯了一个拼写错误,将镜像的名字写成了nginx:1.91
,而正确的名字应该是nginx:1.9.1
:
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.91 deployment "nginx-deployment" image updated
Rollout 将会卡住。
$ kubectl rollout status deployments nginx-deployment Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
按住 Ctrl-C 中止上面的 rollout 状态监控。
您会看到旧的 replica(nginx-deployment-1564180365 和 nginx-deployment-2035384211)和新的 replica (nginx-deployment-3066724191)数目都是2个。
$ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-1564180365 2 2 0 25s nginx-deployment-2035384211 0 0 0 36s nginx-deployment-3066724191 2 2 2 6s
看下建立 Pod,您会看到有两个新的 ReplicaSet 建立的 Pod 处于 ImagePullBackOff 状态,循环拉取镜像。
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-1564180365-70iae 1/1 Running 0 25s nginx-deployment-1564180365-jbqqo 1/1 Running 0 25s nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s nginx-deployment-3066724191-eocby 0/1 ImagePullBackOff 0 6s
注意,Deployment controller会自动中止坏的 rollout,并中止扩容新的 ReplicaSet。
$ kubectl describe deployment Name: nginx-deployment Namespace: default CreationTimestamp: Tue, 15 Mar 2016 14:48:04 -0700 Labels: app=nginx Selector: app=nginx Replicas: 2 updated | 3 total | 2 available | 2 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge OldReplicaSets: nginx-deployment-1564180365 (2/2 replicas created) NewReplicaSet: nginx-deployment-3066724191 (2/2 replicas created) Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 1 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-1564180365 to 2 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 2
为了修复这个问题,咱们须要回退到稳定的 Deployment revision。
首先,检查下 Deployment 的 revision:
$ kubectl rollout history deployment/nginx-deployment deployments "nginx-deployment": REVISION CHANGE-CAUSE 1 kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml--record 2 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 3 kubectl set image deployment/nginx-deployment nginx=nginx:1.91
由于咱们建立 Deployment 的时候使用了--record
参数能够记录命令,咱们能够很方便的查看每次 revision 的变化。
查看单个revision 的详细信息:
$ kubectl rollout history deployment/nginx-deployment --revision=2 deployments "nginx-deployment" revision 2 Labels: app=nginx pod-template-hash=1159050644 Annotations: kubernetes.io/change-cause=kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP QoS Tier: cpu: BestEffort memory: BestEffort Environment Variables: <none> No volumes.
如今,咱们能够决定回退当前的 rollout 到以前的版本:
$ kubectl rollout undo deployment/nginx-deployment deployment "nginx-deployment" rolled back
也可使用 --revision
参数指定某个历史版本:
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2 deployment "nginx-deployment" rolled back
该 Deployment 如今已经回退到了先前的稳定版本。如您所见,Deployment controller产生了一个回退到revison 2的DeploymentRollback
的 event。
$ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 3 3 3 3 30m $ kubectl describe deployment Name: nginx-deployment Namespace: default CreationTimestamp: Tue, 15 Mar 2016 14:48:04 -0700 Labels: app=nginx Selector: app=nginx Replicas: 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge OldReplicaSets: <none> NewReplicaSet: nginx-deployment-1564180365 (3/3 replicas created) Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 30m 30m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 2 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 1 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-1564180365 to 2 2m 2m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-3066724191 to 0 2m 2m 1 {deployment-controller } Normal DeploymentRollback Rolled back deployment "nginx-deployment" to revision 2 29m 2m 2 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3
您能够经过设置.spec.revisonHistoryLimit
项来指定 deployment 最多保留多少 revision 历史记录。默认的会保留全部的 revision;若是将该项设置为0,Deployment就不容许回退了。
您可使用如下命令扩容 Deployment:
$ kubectl scale deployment nginx-deployment --replicas 10 deployment "nginx-deployment" scaled
假设您的集群中启用了horizontal pod autoscaling,您能够给 Deployment 设置一个 autoscaler,基于当前 Pod的 CPU 利用率选择最少和最多的 Pod 数。
$ kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80 deployment "nginx-deployment" autoscaled
RollingUpdate Deployment 支持同时运行一个应用的多个版本。或者 autoscaler 扩容 RollingUpdate Deployment 的时候,正在中途的 rollout(进行中或者已经暂停的),为了下降风险,Deployment controller 将会平衡已存在的活动中的 ReplicaSet(有 Pod 的 ReplicaSet)和新加入的 replica。这被称为比例扩容。
例如,您正在运行中含有10个 replica 的 Deployment。maxSurge=3,maxUnavailable=2。
$ kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 10 10 10 10 50s
您更新了一个镜像,而在集群内部没法解析。
$ kubectl set image deploy/nginx-deployment nginx=nginx:sometag deployment "nginx-deployment" image updated
镜像更新启动了一个包含ReplicaSet nginx-deployment-1989198191的新的rollout,可是它被阻塞了,由于咱们上面提到的maxUnavailable。
$ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-1989198191 5 5 0 9s nginx-deployment-618515232 8 8 8 1m
而后发起了一个新的Deployment扩容请求。autoscaler将Deployment的repllica数目增长到了15个。Deployment controller须要判断在哪里增长这5个新的replica。若是咱们没有谁用比例扩容,全部的5个replica都会加到一个新的ReplicaSet中。若是使用比例扩容,新添加的replica将传播到全部的ReplicaSet中。大的部分加入replica数最多的ReplicaSet中,小的部分加入到replica数少的ReplciaSet中。0个replica的ReplicaSet不会被扩容。
在咱们上面的例子中,3个replica将添加到旧的ReplicaSet中,2个replica将添加到新的ReplicaSet中。rollout进程最终会将全部的replica移动到新的ReplicaSet中,假设新的replica成为健康状态。
$ kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 15 18 7 8 7m $ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-1989198191 7 7 0 7m nginx-deployment-618515232 11 11 11 7m
您能够在发出一次或屡次更新前暂停一个 Deployment,而后再恢复它。这样您就能在Deployment暂停期间进行屡次修复工做,而不会发出没必要要的 rollout。
例如使用刚刚建立 Deployment:
$ kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 3 3 3 3 1m [mkargaki@dhcp129-211 kubernetes]$ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-2142116321 3 3 3 1m
使用如下命令暂停 Deployment:
$ kubectl rollout pause deployment/nginx-deployment deployment "nginx-deployment" paused
而后更新 Deplyment中的镜像:
$ kubectl set image deploy/nginx nginx=nginx:1.9.1 deployment "nginx-deployment" image updated
注意新的 rollout 启动了:
$ kubectl rollout history deploy/nginx deployments "nginx" REVISION CHANGE-CAUSE 1 <none> $ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-2142116321 3 3 3 2m
您能够进行任意屡次更新,例如更新使用的资源:
$ kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi deployment "nginx" resource requirements updated
Deployment 暂停前的初始状态将继续它的功能,而不会对 Deployment 的更新产生任何影响,只要 Deployment是暂停的。
最后,恢复这个 Deployment,观察完成更新的 ReplicaSet 已经建立出来了:
$ kubectl rollout resume deploy nginx deployment "nginx" resumed $ KUBECTL get rs -w NAME DESIRED CURRENT READY AGE nginx-2142116321 2 2 2 2m nginx-3926361531 2 2 0 6s nginx-3926361531 2 2 1 18s nginx-2142116321 1 2 2 2m nginx-2142116321 1 2 2 2m nginx-3926361531 3 2 1 18s nginx-3926361531 3 2 1 18s nginx-2142116321 1 1 1 2m nginx-3926361531 3 3 1 18s nginx-3926361531 3 3 2 19s nginx-2142116321 0 1 1 2m nginx-2142116321 0 1 1 2m nginx-2142116321 0 0 0 2m nginx-3926361531 3 3 3 20s ^C $ KUBECTL get rs NAME DESIRED CURRENT READY AGE nginx-2142116321 0 0 0 2m nginx-3926361531 3 3 3 28s
注意: 在恢复 Deployment 以前您没法回退一个已经暂停的 Deployment。
Deployment 在生命周期中有多种状态。在建立一个新的 ReplicaSet 的时候它能够是 progressing 状态, complete 状态,或者 fail to progress状态。
Kubernetes 将执行过下列任务之一的 Deployment 标记为 progressing 状态:
您可使用kubectl rollout status
命令监控 Deployment 的进度。
Kubernetes 将包括如下特性的 Deployment 标记为 complete 状态:
您能够用kubectl rollout status
命令查看 Deployment 是否完成。若是 rollout 成功完成,kubectl rollout status
将返回一个0值的 Exit Code。
$ kubectl rollout status deploy/nginx Waiting for rollout to finish: 2 of 3 updated replicas are available... deployment "nginx" successfully rolled out $ echo $? 0
您的 Deployment 在尝试部署新的 ReplicaSet 的时候可能卡住,永远也不会完成。这多是由于如下几个因素引发的:
探测这种状况的一种方式是,在您的 Deployment spec 中指定spec.progressDeadlineSeconds
。spec.progressDeadlineSeconds
表示 Deployment controller 等待多少秒才能肯定(经过 Deployment status)Deployment进程是卡住的。
下面的kubectl
命令设置progressDeadlineSeconds
使 controller 在 Deployment 在进度卡住10分钟后报告:
$ kubectl patch deployment/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":600}}' "nginx-deployment" patched
当超过截止时间后,Deployment controller 会在 Deployment 的 status.conditions
中增长一条DeploymentCondition,它包括以下属性:
注意: kubernetes除了报告Reason=ProgressDeadlineExceeded
状态信息外不会对卡住的 Deployment 作任何操做。更高层次的协调器能够利用它并采起相应行动,例如,回滚 Deployment 到以前的版本。
注意: 若是您暂停了一个 Deployment,在暂停的这段时间内kubernetnes不会检查您指定的 deadline。您能够在 Deployment 的 rollout 途中安全的暂停它,而后再恢复它,这不会触发超过deadline的状态。
您可能在使用 Deployment 的时候遇到一些短暂的错误,这些多是因为您设置了过短的 timeout,也有多是由于各类其余错误致使的短暂错误。例如,假设您使用了无效的引用。当您 Describe Deployment 的时候可能会注意到以下信息:
$ kubectl describe deployment nginx-deployment <...> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True ReplicaSetUpdated ReplicaFailure True FailedCreate <...>
执行 kubectl get deployment nginx-deployment -o yaml
,Deployement 的状态可能看起来像这个样子:
status: availableReplicas: 2 conditions: - lastTransitionTime: 2016-10-04T12:25:39Z lastUpdateTime: 2016-10-04T12:25:39Z message: Replica set "nginx-deployment-4262182780" is progressing. reason: ReplicaSetUpdated status: "True" type: Progressing - lastTransitionTime: 2016-10-04T12:25:42Z lastUpdateTime: 2016-10-04T12:25:42Z message: Deployment has minimum availability. reason: MinimumReplicasAvailable status: "True" type: Available - lastTransitionTime: 2016-10-04T12:25:39Z lastUpdateTime: 2016-10-04T12:25:39Z message: 'Error creating: pods "nginx-deployment-4262182780-" is forbidden: exceeded quota: object-counts, requested: pods=1, used: pods=3, limited: pods=2' reason: FailedCreate status: "True" type: ReplicaFailure observedGeneration: 3 replicas: 2 unavailableReplicas: 2
最终,一旦超过 Deployment 进程的 deadline,kubernetes 会更新状态和致使 Progressing 状态的缘由:
Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing False ProgressDeadlineExceeded ReplicaFailure True FailedCreate
您能够经过缩容 Deployment的方式解决配额不足的问题,或者增长您的 namespace 的配额。若是您知足了配额条件后,Deployment controller 就会完成您的 Deployment rollout,您将看到 Deployment 的状态更新为成功状态(Status=True
而且Reason=NewReplicaSetAvailable
)。
Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable
Type=Available
、 Status=True
意味着您的Deployment有最小可用性。 最小可用性是在Deployment策略中指定的参数。Type=Progressing
、 Status=True
意味着您的Deployment 或者在部署过程当中,或者已经成功部署,达到了指望的最少的可用replica数量(查看特定状态的Reason——在咱们的例子中Reason=NewReplicaSetAvailable
意味着Deployment已经完成)。
您可使用kubectl rollout status
命令查看Deployment进程是否失败。当Deployment过程超过了deadline,kubectl rollout status
将返回非0的exit code。
$ kubectl rollout status deploy/nginx Waiting for rollout to finish: 2 out of 3 new replicas have been updated... error: deployment "nginx" exceeded its progress deadline $ echo $? 1
全部对完成的 Deployment 的操做都适用于失败的 Deployment。您能够对它扩/缩容,回退到历史版本,您甚至能够屡次暂停它来应用 Deployment pod template。
您能够设置 Deployment 中的 .spec.revisionHistoryLimit
项来指定保留多少旧的 ReplicaSet。 余下的将在后台被看成垃圾收集。默认的,全部的 revision 历史就都会被保留。在将来的版本中,将会更改成2。
注意: 将该值设置为0,将致使全部的 Deployment 历史记录都会被清除,该 Deployment 就没法再回退了。