Deployment(中文意思为部署、调度)提供了一种更加简单的更新RC和Pod的机制,K8S版本1.2实现的。通过在Deployment中描述所期望的集群状态,Deployment Controller会将现在的集群状态在一个可控的速度下逐步更新成所期望的集群状态。Deployment主要职责同样是为了保证pod的数量和健康,90%的功能与RC完全一样,可以看做新一代的RC。
功能
Deployment集成了上线部署、滚动升级、创建副本、暂停上线任务,恢复上线任务,回滚到以前某一版本(成功/稳定)的Deployment等功能,在某种程度上,Deployment可以实现无人值守的上线,大大降低上线过程的复杂沟通、操作风险。
RC全部功能:Deployment继承了上面描述的RC全部功能。
事件和状态查看:可以查看Deployment的升级详细进度和状态。
回滚:当升级pod镜像或者相关参数时发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。
版本记录:每次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。
暂停和启动:对于每一次升级,都能够随时暂停和启动。
多种升级方案:Recreate--删除所有已存在的pod,重新创建新的; RollingUpdate--滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。
使用场景
使用Deployment来启动(上线/部署)一个Pod或者RS
检查一个Deployment是否成功执行
更新Deployment来重新创建相应的Pods(例如,需要使用一个新的Image)
如果现有的Deployment不稳定,那么回滚到一个早期的稳定的Deployment版本
暂停或者恢复一个Deployment
与RC比较,deployment的优势
Deployment使用了RS,它是更高一层的概念。
RC只支持基于等式的selector(env=dev或environment!=qa),但RS还支持新的,基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa)),这对复杂的运维管理很方便。
使用Deployment升级Pod,只需要定义Pod的最终状态,K8S会为你执行必要的操作,虽然能够使用命令kubectl rolling-update完成升级,但它是在客户端与服务端多次交互控制RC完成的,所以REST API中并没有rolling-update的接口,这为定制自己的管理系统带来了一些麻烦。
Deployment拥有更加灵活强大的升级、回滚功能。
常用命令
创建
使用子命令create,创建Deployment
kubectl create-f test-dpm.yaml --record
注意--record参数,使用此参数将记录后续创建对象的操作,方便管理与问题追溯
使用子命令edit,编辑spec.replicas/spec.template.spec.container.image字段,完成deployment的扩缩容与滚动升级(这要比子命令rolling-update速度快很多)
查看部署状态
kubectl rolloutstatus deployment/test-dpm
kubectl describedeployment/test-dpm
升级
kubectl set image deployment/test-dpm test-dpm=app:v1
或者
kubectl edit deployment/test-dpm
编辑.spec.template.spec.containers[0].image的值
终止升级
kubectl rolloutpause deployment/test-dpm
继续升级
kubectl rolloutresume deployment/test-dpm
回滚
kubectl rolloutundo deployment/test-dpm
查看deployments版本
kubectl rollouthistory deployments
回滚到指定版本
kubectl rolloutundo deployment/lykops-dpm --to-revision=2
升级历史
kubectl describedeployment/test-dpm
Name: lykops-dpm
Namespace: default
CreationTimestamp: Tue, 01 Aug 2017 16:56:45 +0800
Labels: app=lykops-dpm
project=lykops
software=apache
version=v1
Selector: app=lykops-dpm,name=lykops-dpm,project=lykops,software=apache,version=v1
Replicas: 3updated | 3 total | 3 available | 0 unavailable
StrategyType: Recreate
MinReadySeconds: 30
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: lykops-dpm-4183418831 (3/3 replicas created)
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaledup replica set lykops-dpm-2823415590 to 3
28m 28m 1 {deployment-controller } Normal ScalingReplicaSet Scaleddown replica set lykops-dpm-2823415590 to 0
28m 28m 1 {deployment-controller } Normal ScalingReplicaSet Scaledup replica set lykops-dpm-4001949646 to 3
26m 26m 1 {deployment-controller } Normal ScalingReplicaSet Scaleddown replica set lykops-dpm-4001949646 to 0
26m 26m 1 {deployment-controller } Normal ScalingReplicaSet Scaledup replica set lykops-dpm-4183418831 to 3
yaml文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: lykops-dpm
labels:
software: apache
project: lykops
app: lykops-dpm
version: v1
annotations: #自定义注解列表
-name: String #自定义注解名字
spec:
replicas: 3 #副本数量
minReadySeconds: 30 #滚动升级时30s后认为该pod就绪
strategy:
type: recreate #升级方式
#rollingUpdate:##由于replicas为3,则整个升级,pod个数在2-4个之间
# maxSurge: 3 #滚动升级时会先启动3个pod
# maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
selector:
matchLabels:
name: lykops-dpm
software: apache
project: lykops
app: lykops-dpm
version: v1
template:
metadata:
labels:
name: lykops-dpm
software: apache
project: lykops
app: lykops-dpm
version: v1
spec:
terminationGracePeriodSeconds: 60 ##k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
containers:
- name: lykops-dpm
image: web:apache
command: [ "sh", "/etc/run.sh" ]
ports:
- containerPort: 80
name: http
protocol: TCP
resources:
requests:
cpu: 0.05
memory: 16Mi
limits:
cpu: 0.1
memory: 32Mi
livenessProbe:#livenessProbe是K8S认为该pod是存活的,不存在则需要kill掉,然后再新启动一个,以达到RS指定的个数。
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:#readinessProbe是K8S认为该pod是启动成功的,这里根据每个应用的特性,自己去判断,可以执行command,也可以进行httpGet。
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
strategy中的type
升级策略有recreate和rollingUpdate。recreate--删除所有已存在的pod,重新创建新的; rollingUpdate--滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。
如何使用哪种策略,需要看应用场景。recreate策略将会在升级过程中,停止服务,但会保证应用版本一致;使用rollingUpdate不会中断服务,但会导致调用时出现应用版本不一致的情况,输出内容不一致。
maxSurge与maxUnavailable
maxSurge: 1 表示滚动升级时会先启动1个pod
maxUnavailable:1 表示滚动升级时允许的最大Unavailable的pod个数。由于replicas为3,则整个升级,pod个数在2-4个之间
terminationGracePeriodSeconds
k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒。
如果需要更优雅地关闭,则可以使用k8s提供的pre-stop lifecycle hook 的配置声明,将会在发送SIGTERM之前执行。
livenessProbe与readinessProbe
livenessProbe是K8S认为该pod是存活的,不存在则需要kill掉,然后再新启动一个,以达到RS指定的个数。
readinessProbe是K8S认为该pod是启动成功的,这里根据每个应用的特性,自己去判断,可以执行command,也可以进行httpGet。比如对于使用java web服务的应用来说,并不是简单地说tomcat启动成功就可以对外提供服务的,还需要等待spring容器初始化,数据库连接连接上等等。对于spring boot应用,默认的actuator带有/health接口,可以用来进行启动成功的判断。
其中readinessProbe.initialDelaySeconds可以设置为系统完全启动起来所需的最少时间,livenessProbe.initialDelaySeconds可以设置为系统完全启动起来所需的最大时间+若干秒。
分享到:
相关推荐
Kubernetes提供了丰富的扩展机制,如自定义资源定义(CRD)、Operator模式、Webhooks等,允许开发者和管理员根据需要构建复杂的自动化流程和定制化功能。此外,Kubernetes社区还发展了一大批周边工具和服务,如Helm...
【描述】:这个压缩包文件“kubernetes-basico-master.rar”包含了Kubernetes基础知识的详细教程源码,是学习和理解Kubernetes集群管理、容器编排以及相关实践操作的理想资源。通过深入探究这些源码,你将能够系统地...
4. **控制器(Controllers)**:如ReplicaSet、Deployment和StatefulSet等,它们是Kubernetes内部的自动化进程,用于管理和维护特定类型的资源。例如,Deployment可以确保特定数量的Pod副本始终运行并可用。 5. **...
4. **扩展性**:k8s支持水平和垂直扩展,通过调整Deployment的副本数量或调整Pod资源请求来适应负载变化。 总结,kubernetes-server-linux-amd64-v1.19.15.tar.gz提供了稳定且安全的k8s集群运行环境。从安装到运维...
在项目"**kubernetes-rabbitmq-cluster-master**"中,包含了所有必要的Kubernetes资源定义,如Deployment、Service、PersistentVolumeClaim等,以及相关的配置文件。开发者可以根据自己的需求进行调整,例如更改存储...
容器运行时接口(CRI)、容器网络接口(CNI)和容器存储接口(CSI)为Kubernetes提供了标准化的接口,允许与不同类型的容器运行时、网络和存储系统集成。 资源对象,如Nodes、Namespaces、Labels和Annotations,是...
4. **Kubernetes Deployment**: 标签中提到的"Kubernetes-deployment"指的是Kubernetes的Deployment资源类型。Deployment用于管理Pods的生命周期,如滚动更新、回滚和扩缩容。在模板中,你可以看到如何定义副本数量...
在这个特定的案例中,"linux-基于Fabric8模拟Kubernetes的Deployment实现一个CRD"意味着我们要使用Fabric8来模仿Kubernetes的Deployment行为,并创建一个自定义资源类型。 CRD是Kubernetes的一个强大特性,它允许...
在AWS中实现Kubernetes,不仅可以利用AWS的弹性计算资源,还能结合AWS的其他服务,如Elastic Load Balancing(ELB)进行服务发现,或者使用Elastic Block Store(EBS)和Elastic File System(EFS)提供持久化存储。...
通过阅读和实践这些配置,你可以学习如何定义 Pod、Service、Deployment 和其他 Kubernetes 对象。 2. **网络配置**:Kubernetes 提供了一种抽象层来处理服务之间的网络通信。你可能会看到如何设置 Service 来暴露...
**Kubernetes-deployment** 是Kubernetes的一个资源类型,用于定义应用的部署策略,如滚动更新、回滚等。通过Ansible,我们可以编写YAML文件来定义Deployment,并自动化创建和管理这些资源。 综上所述,"ansible-...
此外,这个压缩包可能还包含了自定义资源定义(Custom Resource Definition, CRD)的YAML,用于扩展Kubernetes的原生功能,支持自定义的资源类型。 学习并熟练使用这些YAML模板可以帮助开发者快速构建和管理...
【Kubernetes认证管理员-CKA课程】是一门深入学习和掌握Kubernetes管理技能的专业课程,旨在帮助学员通过Kubernetes认证管理员考试(CKA)。Kubernetes作为当下最热门的容器编排系统,对于IT专业人士来说,拥有CKA...
Pod是Kubernetes中运行容器化应用的实例,每个Pod都包含一个或多个容器及其相关资源。在Pod的生命周期中,副本数量可通过Deployment进行管理。 Deployment是一个控制器对象,它确保指定数量的Pod副本保持运行状态。...
5. **Volume与持久化存储**:Kubernetes支持多种Volume类型,用于在Pod间共享数据或实现持久化存储。这对于需要在Pod重启后保持数据的应用至关重要。 6. **Horizontal Pod Autoscaler (HPA)**:HPA允许自动调整Pod...
6. **监控与告警**: 为了确保服务的稳定运行,可以集成Prometheus和Grafana来收集和展示NSQ的指标,或者使用Kubernetes的metrics-server和Heapster获取Pod级别的资源使用情况。 7. **扩展与容错**: 当业务增长时,...
- AppsV1Api:用于处理Deployment、StatefulSet等更高级的资源类型。 - 自定义资源操作:除了核心API之外,还可以通过CustomObjectsApi来操作自定义资源定义(CRD)的对象。 4. 主要功能: - 资源操作:创建、更新...
这个库提供了丰富的API,使得开发者可以轻松地创建、更新和删除Kubernetes资源,如Deployment、Service、PersistentVolume等。它通过Python接口将Terraform的配置能力扩展到Kubernetes世界,让开发者能够在Terraform...