0001-K8s-Deployment
Deployment ¶
因为 Pod 是最小的调度单位,我们通常会创建 Deployment 对象,通过 Deployment 对象来进行管理 Pod。
问:为什么一般不创建 Pod 对象呢?
答:因为创建的 pod 对象,如果挂掉是不会被 k8s 感知和重启的,创建 Deployment 对象可以管理多组 pod 对象,如果 pod 挂掉,Deployment 对象则会重新拷贝一个 pod 的副本出来,所以我们需要创建 Deployment 对象而不是创建 Pod 对象。
创建 deployment 流程
-
当创建
Deployment
时,Kubernetes
控制器会根据Deployment
的定义 的replicas
数创建相应数量的Pod
副本。这些Pod
副本将根据Deployment
的模板template
进行配置,比如labels
为app: web
并分配唯一独立的IP
地址,并且具有自己的网络标识。这些Pod
的IP
地址是由Kubernetes
集群的网络插件负责分配的。 -
在创建
Deployment
时,Deployment
控制器会监控Pod
的状态,并根据所需的replicas
副本数来管理它们的运行状态。如果 Pod 发生故障、被删除或需要扩展副本数,Deployment
控制器将负责启动新的Pod
副本或终止不需要的Pod
副本,以确保所需的Pod
数目处于活动状态。 -
Service
与Deployment
是两个独立的资源对象,它们之间没有直接的关联。但可使用Service
的标签选择器来选择与Deployment
关联的Pod
,并将请求路由到这些Pod
上。 -
当创建
Service
并指定与Deployment
中Pod
相关联的标签选择器时,Service
将使用该选择器来查找与Deployment
相关联的Pod
,并将它们作为Service
的后端目标。当前端客户端发送请求到Service
时,Service
将使用负载均衡机制将请求转发到与Deployment
关联的Pod
上。 -
总结: 创建
Deployment
时,Kubernetes
控制器会根据Deployment
的定义创建Pod
副本,并为每个Pod
分配唯一的IP
地址。Deployment
控制器负责管理Pod
副本的运行状态。Service
与Deployment
是独立的资源对象,但可以使用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 程序