跳到主要内容

deployment

deployment****升级过程?

初始创建Deployment时,系统创建了一个ReplicaSet,并按用户的需求创建了对应数量的Pod副 本。 当更新Deployment时,系统创建了一个新的ReplicaSet,并将其副本数量扩展到1,然后将旧 ReplicaSet缩减为2。 之后,系统继续按照相同的更新策略对新旧两个ReplicaSet进行逐个调整。 最后,新的ReplicaSet运行了对应个新版本Pod副本,旧的ReplicaSet副本数量则缩减为0。

简述Kubernetes deployment 升级策略? 在Deployment的定义中,可以通过spec.strategy指定Pod更新的策略,目前支持两种策略:

Recreate(重建)和RollingUpdate(滚动更新),默认值为RollingUpdate。 Recreate:设置spec.strategy.type=Recreate,表示Deployment在更新Pod时,会先杀掉所有正在运

行的Pod,然后创建新的Pod。

RollingUpdate:设置spec.strategy.type=RollingUpdate,表示Deployment会以滚动更新的方式来逐 个更新Pod。同时,可以通过设置spec.strategy.rollingUpdate下的两个参数(maxUnavailable和 maxSurge)来控制滚动更新的过程。

自动扩容机制?

Kubernetes使用Horizontal Pod Autoscaler(HPA)的控制器实现基于CPU使用率进行自动Pod扩缩容 的功能。HPA控制器周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的扩缩容条件进行对 比,在满足条件时对Pod副本数量进行调整。

HPA原理

Kubernetes中的某个Metrics Server(Heapster或自定义Metrics Server)持续采集所有Pod副本的指 标数据。HPA控制器通过Metrics Server的API(Heapster的API或聚合API)获取这些数据,基于用户定 义的扩缩容规则进行计算,得到目标Pod副本数量。

当目标Pod副本数量与当前副本数量不同时,HPA控制器就向Pod的副本控制器(Deployment、RC或 ReplicaSet)发起scale操作,调整Pod的副本数量,完成扩缩容操作。

Service****类型? 通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发

到后端的各个容器应用上。其主要类型有:

ClusterIP:虚拟的服务IP地址,该地址用于Kubernetes集群内部的Pod访问,在Node上kube- proxy通过设置的iptables规则进行转发;

NodePort:使用宿主机的端口,使能够访问各Node的外部客户端通过Node的IP地址和端口号就 能访问服务;

LoadBalancer:使用外接负载均衡器完成到服务的负载分发,需要在spec.status.loadBalancer字 段指定外部负载均衡器的IP地址,通常用于公有云。

Service负载分发的策略有:RoundRobin和SessionAffinity

RoundRobin:默认为轮询模式,即轮询将请求转发到后端的各个Pod上。 SessionAffinity:基于客户端IP地址进行会话保持的模式,即第1次将某个客户端发起的请求转发到 后端的某个Pod上,之后从相同的客户端发起的请求都将被转发到后端相同的Pod上。

Kubernetes的Ingress资源对象,用于将不同URL的访问请求转发到后端不同的Service,以实现HTTP层 的业务路由机制。

Kubernetes使用了Ingress策略和Ingress Controller,两者结合并实现了一个完整的Ingress负载均衡 器。使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service 对应的后端Endpoint(Pod)上,从而跳过kube-proxy的转发功能,kube-proxy不再起作用,全过程 为:ingress controller + ingress 规则 ----> services。

同时当Ingress Controller提供的是对外服务,则实际上实现的是边缘路由器的功能。


Kubernetes Deployment提供了多种升级策略,用于控制应用程序的升级过程。下面是一些常见的Deployment升级策略:

滚动升级 (Rolling Update):滚动升级是Deployment的默认升级策略。它逐步替换旧的Pod副本,确保应用程序的可用性。在滚动升级过程中,每次替换一个Pod副本,通过逐步增加新副本的数量和减少旧副本的数量,实现平滑的升级过程。

重启升级 (Recreate):重启升级策略会先删除所有旧的Pod副本,然后再创建新的Pod副本。这种策略会导致应用程序的短暂中断,因为在删除旧副本和创建新副本之间存在时间差。重启升级适用于无状态应用程序或可以容忍短暂中断的应用程序。

禁止升级 (Pause):禁止升级策略用于暂停Deployment的升级过程。可以通过修改Deployment的定义,将升级的暂停状态设置为true,停止新副本的创建和旧副本的替换。这种策略可以用于临时屏蔽升级,等待特定条件满足后再恢复升级过程。

自定义升级策略:Kubernetes还提供了一些自定义的升级策略选项,可以通过在Deployment中设置相关参数来配置。以下是一些常见的自定义策略选项:

最大不可用数(maxUnavailable):指定升级过程中允许的最大不可用Pod副本数。可以控制升级的速度和可用性。 最大搜索数(maxSurge):指定在升级过程中允许的额外副本数。可以控制升级的速度和资源利用率。 预发布期 (preference):允许同时存在新旧Pod副本的时间窗口,以进行测试和验证新版本的稳定性。 通过选择适当的升级策略和配置参数,可以在不影响应用程序的可用性的同时,实现平滑的升级过程。每种升级策略都有其适用的场景和权衡考虑,开发人员和运维人员可以根据实际需求选择合适的策略。


Kubernetes中的Deployment是一种资源对象,用于管理应用程序的部署和升级。Deployment提供了一种声明性的方式来定义应用程序的期望状态,并负责管理相关的Pod副本集。下面是

Kubernetes Deployment的升级过程的简要描述:

创建Deployment:首先,通过定义一个Deployment资源对象来描述应用程序的初始状态。Deployment包含了应用程序的容器镜像、副本数、升级策略等信息。

升级策略配置:在Deployment中可以指定升级策略,例如滚动升级(Rolling Update)或重启升级(Recreate)。滚动升级是默认的升级策略,它逐步替换旧的Pod副本,确保应用程序的可用性。

更新Deployment:当需要更新应用程序时,可以通过修改Deployment的定义来触发升级过程。可以更新容器镜像、副本数、环境变量等配置。

创建新的Pod副本集:升级过程开始时,Deployment会创建一个新的Pod副本集(ReplicaSet),用于承载更新后的应用程序。

逐步替换旧的Pod副本:在新的Pod副本集创建完成后,Deployment会逐步替换旧的Pod副本。默认情况下,每次替换一个Pod,确保应用程序的可用性。可以通过调整升级的最大不可用数和最大搜索数等参数来控制升级的速度和可用性。

监控升级过程:Kubernetes提供了多种方式来监控升级过程。可以使用kubectl命令行工具或Kubernetes Dashboard来查看Deployment的状态、新旧Pod副本的数量以及升级事件的日志。

完成升级:当所有旧的Pod副本都被替换为新的副本后,升级过程完成。此时,应用程序已经更新到最新版本。

需要注意的是,Deployment会根据定义的升级策略确保应用程序的可用性。在升级过程中,旧的Pod副本会逐步被替换,确保至少有指定数量的可用副本。这样可以确保升级过程中不会导致应用程序的中断或故障。


使用独立的存储卷为 Deployment 的每个 Pod 带来以下一些潜在问题:

数据一致性:由于每个 Pod 使用独立的存储卷,每个 Pod 写入的数据将不同于其他 Pod。这可能导致应用程序中的数据不一致性问题,特别是在涉及跨多个 Pod 的数据操作或读取时。

存储资源消耗:为每个 Pod 分配独立的存储卷会增加存储资源的消耗。如果每个 Pod 都需要大量的存储空间,这可能导致存储资源的过度使用或不足。

存储管理复杂性:管理和维护多个独立的存储卷可能会增加存储管理的复杂性。需要确保适当的存储配额和调度策略,以及监控和维护存储卷的状态。

存储性能:如果多个 Pod 同时写入相同的存储后端,可能会导致存储性能瓶颈。这可能会影响应用程序的整体性能和响应时间。

存储成本:使用独立的存储卷可能会增加存储成本,特别是如果每个 Pod 都需要大量的存储空间或使用昂贵的存储类型。

在某些情况下,这种独立的存储卷配置可能是必需的,例如每个 Pod 需要独立的数据副本或数据隔离。然而,需要权衡这些问题,并根据具体的应用需求和资源限制来决定是否使用独立的存储卷。在某些场景下,共享存储卷可能更适合,可以实现更好的数据一致性和存储资源利用率。

动态卷名称:

  • 在 Deployment 的 Pod 模板中,可以使用卷的名称字段指定一个动态生成的名称,例如使用包含 Pod 名称的后缀来创建唯一的卷名称。
  • 这样每个 Pod 都会使用不同的卷名称,从而获得独立的存储卷。
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example-app
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: example-container
image: example/image:latest
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: example-pvc-${POD_NAME}
```


卷模板:

可以使用卷模板(Volume Templates)来为每个 Pod 动态生成独立的存储卷。 在 Deployment 的 Pod 模板中,可以使用卷声明模板(Volume Claim Template)来定义卷模板,并将其与容器中的挂载点关联起来。 这样每个 Pod 都会使用一个独立的存储卷,可以通过模板中的字段(例如名称或标签)来动态生成卷声明。 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example-app
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: example-container
image: example/image:latest
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: example-pvc
# Add other fields as needed for dynamic generation
```