Kubernetes 的 Deployment 是一种管理声明式更新的资源对象,它允许你描述应用的期望状态,并由 Deployment 控制器自动将当前状态改变为期望状态。Deployment 主要用于无状态应用的部署和扩展,但也可以用于有状态应用。
核心功能
- 自动化部署与回滚:Deployment 可以自动更新应用的实例(Pods),并在更新过程中保持应用的可用性。如果更新失败,Deployment 也能自动回滚到之前的版本。
- 声明式更新:你只需要声明应用的目标状态,Deployment 控制器就会负责改变实际状态以匹配目标状态。
- 扩展和收缩:可以通过修改 Deployment 中的副本数(replicas)来扩大或缩小应用的规模。
- 自我修复:如果某个 Pod 失败,Deployment 会替换它,确保定义的副本数量不变。
工作原理
- 定义 Deployment:通过 YAML 或 JSON 文件定义 Deployment,包括应用的容器镜像、副本数、更新策略等信息。
- 创建 Deployment:使用
kubectl apply -f deployment.yaml
命令创建 Deployment。Kubernetes API 服务器接收到创建请求后,记录期望的应用状态。 - Deployment 控制器响应:Deployment 控制器观察到期望状态的变化,开始采取行动将当前状态改变为期望状态。这包括启动或停止 Pod 来匹配副本数,或更新 Pod 以匹配新的应用定义。
- 创建 ReplicaSet:Deployment 为每次更新创建一个新的 ReplicaSet,并通过它来管理所有的 Pod。如果更新失败,Deployment 可以回滚到之前的 ReplicaSet。
- 健康检查和监控:Deployment 依赖 Kubernetes 的健康检查机制来监控 Pod 的健康状态。如果 Pod 不健康,它会被替换。
更新策略
Deployment 支持两种更新策略:
- RollingUpdate(默认策略):渐进式更新应用的 Pod,新 Pod 会逐渐替换旧的 Pod,确保应用的高可用性。在任何时刻,都有一部分旧的 Pod 和新的 Pod 同时服务。
- Recreate:先删除所有旧的 Pod,然后创建新的 Pod。这种策略适用于无法同时运行多个版本的应用,但在更新期间应用会暂时不可用。
使用场景
- 应用部署:快速部署和更新无状态应用。
- 持续部署/持续交付 (CI/CD):结合 CI/CD 系统自动化应用的构建、测试和部署。
- 蓝绿部署和金丝雀发布:通过控制流量分配来实现蓝绿部署和金丝雀发布,以减少部署风险。
示例
以下是一个简单的 Deployment 定义示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
这个 Deployment 创建了 3 个副本的 Nginx 服务器,每个副本都是通过一个 Pod 运行的。当这个 Deployment 被应用到集群中时,Deployment 控制器会确保任何时候都有 3 个运行着 Nginx 1.14.2 版本的 Pod。
通过理解和使用 Deployment,你可以轻松地管理 Kubernetes 集群中的应用部署和更新,确保应用的稳定运行和快速迭代。