跳转至

0001-K8s-Deployment

Deployment

因为 Pod 是最小的调度单位,我们通常会创建 Deployment 对象,通过 Deployment 对象来进行管理 Pod。

问:为什么一般不创建 Pod 对象呢?

答:因为创建的 pod 对象,如果挂掉是不会被 k8s 感知和重启的,创建 Deployment 对象可以管理多组 pod 对象,如果 pod 挂掉,Deployment 对象则会重新拷贝一个 pod 的副本出来,所以我们需要创建 Deployment 对象而不是创建 Pod 对象。

创建 deployment 流程

image-20240125141158827

  1. 当创建 Deployment 时,Kubernetes 控制器会根据 Deployment 的定义 的 replicas 数创建相应数量的 Pod 副本。这些 Pod 副本将根据 Deployment 的模板 template进行配置,比如 labelsapp: web 并分配唯一独立的 IP 地址,并且具有自己的网络标识。这些 PodIP 地址是由 Kubernetes 集群的网络插件负责分配的。

  2. 在创建 Deployment 时,Deployment 控制器会监控 Pod 的状态,并根据所需的 replicas 副本数来管理它们的运行状态。如果 Pod 发生故障、被删除或需要扩展副本数,Deployment 控制器将负责启动新的 Pod 副本或终止不需要的 Pod 副本,以确保所需的 Pod 数目处于活动状态。

  3. ServiceDeployment 是两个独立的资源对象,它们之间没有直接的关联。但可使用 Service 的标签选择器来选择与 Deployment 关联的 Pod,并将请求路由到这些 Pod 上。

  4. 当创建 Service 并指定与 DeploymentPod 相关联的标签选择器时,Service 将使用该选择器来查找与 Deployment 相关联的 Pod,并将它们作为 Service 的后端目标。当前端客户端发送请求到 Service 时,Service 将使用负载均衡机制将请求转发到与 Deployment 关联的 Pod 上。

  5. 总结: 创建 Deployment 时,Kubernetes 控制器会根据 Deployment 的定义创建 Pod 副本,并为每个 Pod 分配唯一的 IP 地址。Deployment 控制器负责管理 Pod 副本的运行状态。ServiceDeployment 是独立的资源对象,但可以使用 Service 的标签选择器来选择与 Deployment 关联的 Pod ,并将请求路由到这些 Pod 上。

Replicaset 控制器的功能

  • 支持新的基于集合的 selector(以前的rc里没有这种功能)

  • 通过改变 Pod 副本数量实现 Pod 的扩容和缩容

Deployment 控制器的功能

通过使用Deployment资源,你可以更加简化和自动化应用程序的部署和管理过程,同时享受到滚动升级、回滚、金丝雀发布和蓝绿部署等高级特性的好处。

  • 声明式定义:使用Deployment资源,你可以通过编写一个YAML文件来描述你期望的应用程序状态,包括副本数、容器镜像、环境变量、资源需求等。然后,通过kubectl apply命令将该YAML文件应用到Kubernetes集群中,Kubernetes控制器会根据定义的状态来创建和管理相关的ReplicaSet和Pod。

  • 控制器模式:Deployment控制器是一个控制循环,它负责将实际状态(当前的ReplicaSet和Pod状态)与期望状态(在Deployment中定义的状态)进行对比,并根据需要进行调整,以使实际状态逐渐接近期望状态。通过Deployment控制器,你可以指定应用程序的副本数,并在需要时进行扩展或缩减副本数量。

  • 滚动升级:使用Deployment资源,你可以实现应用程序的滚动升级。当你更新Deployment的定义(例如更新容器镜像版本)时,Deployment控制器会逐步创建新的ReplicaSet和Pod,并逐步停止旧的ReplicaSet和Pod,实现无宕机的应用程序更新。

  • 回滚:如果在应用程序升级过程中出现问题,你可以使用Deployment资源进行回滚操作。Deployment控制器会自动回滚到先前的版本,通过逐步停止新版本的ReplicaSet和Pod,重新启动旧版本的ReplicaSet和Pod。

  • 金丝雀发布:Deployment还支持金丝雀发布(canary deployment),这是一种逐步将新版本的应用程序引入生产环境的方法。你可以定义一个新的ReplicaSet和Pod来部署新版本,并将一部分流量引导到新版本,以便进行测试和验证,最终决定是否将全部流量切换到新版本。

  • 蓝绿部署:Deployment还支持蓝绿部署(blue-green deployment),这是一种在生产环境中同时部署两个版本的应用程序,并在切换时实现零宕机的方法。你可以定义两个Deployment,一个代表蓝色版本,一个代表绿色版本,然后通过调整服务的指向来切换流量。

Deployment 用于部署无状态应用

无状态应用的特点:

  • 所有 pod 无差别
  • 所有 pod 中容器运行同一个 image
  • 所有 pod 可以运行在集群中任意 node 上
  • 所有 pod 无启动顺序先后之分
  • 随意 pod 数量扩容或缩容
  • 例如简单运行一个静态 web 程序