部署
目录
理解 Deployments创建 Deployments使用 CLI 创建 Deployment前提条件YAML 文件示例通过 YAML 创建 Deployment使用 web console 创建 Deployment前提条件使用新的 web console 创建 Deployment操作步骤 - 配置基本信息操作步骤 - 配置 Pod操作步骤 - 配置容器参考信息健康检查何时在 Applications 视图中使用 Deployment提交前的 Deployment 检查点管理 Deployments使用 CLI 管理 Deployment查看 Deployment更新 Deployment扩缩容 Deployment回滚 Deployment删除 Deployment使用 web console 管理 Deployment查看 Deployment更新 Deployment删除 Deployment使用 CLI 排障检查 Deployment 状态检查 ReplicaSet 状态检查 Pod 状态查看日志进入 Pod 进行调试检查健康配置检查资源限制理解 Deployments
请参考 Kubernetes 官方文档:Deployments
Deployment 是 Kubernetes 中用于以声明式方式管理和更新应用 Pod 副本的高级工作负载资源。它提供了一种强大而灵活的方式来定义应用的运行方式,包括要保持多少副本,以及如何安全地执行滚动更新。
Deployment 是 Kubernetes API 中用于管理 Pod 和 ReplicaSets 的对象。创建 Deployment 时,Kubernetes 会自动创建一个 ReplicaSet,然后由该 ReplicaSet 负责维持指定数量的 Pod 副本。
使用 Deployments,你可以:
- 声明式管理:定义应用的期望状态,Kubernetes 会自动确保集群的实际状态与期望状态一致。
- 版本控制和回滚:跟踪 Deployment 的每个修订版本,并在出现问题时轻松回滚到之前的稳定版本。
- 零停机更新:使用滚动更新策略逐步更新应用,而不会中断服务。
- 自愈:如果 Pod 崩溃、终止或从节点上移除,Deployment 会自动替换 Pod 实例,确保始终可用的 Pod 数量符合预期。
其工作原理如下:
- 你通过 Deployment 定义应用的期望状态(例如使用哪个 image、运行多少个副本)。
- Deployment 创建一个 ReplicaSet,以确保运行指定数量的 Pod。
- ReplicaSet 创建并管理实际的 Pod 实例。
- 当你更新 Deployment 时(例如更改 image 版本),Deployment 会创建一个新的 ReplicaSet,并根据预定义的滚动更新策略逐步用新的 Pod 替换旧的 Pod,直到所有新 Pod 都运行起来,然后再删除旧的 ReplicaSet。
创建 Deployments
使用 CLI 创建 Deployment
前提条件
- 确保已配置
kubectl,并且已连接到集群。
YAML 文件示例
通过 YAML 创建 Deployment
使用 web console 创建 Deployment
前提条件
获取 image 地址。image 的来源可以是平台管理员通过 toolchain 集成的 image repository,也可以是第三方平台的 image repository。
-
对于前者,管理员通常会将 image repository 分配给你的项目,你可以使用其中的 image。如果未找到所需的 image repository,请联系管理员进行分配。
-
如果是第三方平台的 image repository,请确保当前集群能够直接从中拉取 image。
-
如果 image registry 需要认证,则需要配置相应的 image pull secret。更多信息,请参见 将 ImagePullSecrets 添加到 ServiceAccount。
-
通过 OCI Connector 选择 image 时,还需要为 Connector proxy 选择一个 image pull Secret,或者确认该工作负载的 ServiceAccount 已经引用了该 Secret。这两种引用方式是二选一的。请参见 在 OCI Connector 中使用 ImagePullSecret。
使用新的 web console 创建 Deployment
新的 web console 可以从不同视图暴露 Deployment 创建入口。请根据你是从项目范围还是从具体集群范围操作,选择合适的入口。
- Applications 视图:从当前项目开始。打开 Applications > Applications,选择目标 Cluster 和 Namespace,然后选择会创建 Deployment 的工作负载模型或创建流程。
- Clusters 视图:从具体集群开始。先打开目标集群,进入目标 namespace,然后导航到 Workloads > Deployments,点击 Create Deployment。
继续之前,请确认以下差异:
- 在 Applications 视图中,集群选择是项目范围应用工作流的一部分。
- 在 Clusters 视图中,由于你是从具体集群中进入,因此集群已经固定。
- 在 Applications 视图中,请确认 namespace 是否属于预期的项目范围。
- 在 Clusters 视图中,请确认该集群中的 namespace 侧资源是否已准备好供 Deployment 使用。
操作步骤 - 配置基本信息
-
在 Container Platform 左侧边栏中,导航到 Workloads > Deployments。
-
点击 Create Deployment。
-
Select 或 Input 一个 image,然后点击 Confirm。
说明:当使用已集成到 web console 的 image repository 中的 image 时,可以通过 Already Integrated 进行筛选。Integration Project Name,例如 images (registry-projectname),其中在该 web console 中包含项目名 projectname,而在 image repository 中包含项目名 containers。
-
在 Basic Info 区域中,为 Deployment 工作负载配置声明式参数:
操作步骤 - 配置 Pod
说明:在混合架构集群中部署单架构 image 时,请确保已正确配置 节点亲和性规则,以便进行 Pod 调度。
-
在 Pod 区域中,配置容器运行时参数和生命周期管理:
- 节点亲和性规则
- 网络配置
-
Kube-OVN
-
Calico
-
操作步骤 - 配置容器
-
在 Container 区域中,按照以下说明配置相关信息。
-
点击右上角的 Add Container,或者点击 Add Init Container。
请参见 Init Containers。 Init Container:
- 在应用容器之前启动(顺序执行)。
- 完成后释放资源。
- 允许删除的条件:
- Pod 中有 >1 个应用容器且至少有 1 个 init container。
- 单应用容器 Pod 不允许删除。
-
点击 Create。
参考信息
存储卷挂载说明
健康检查
何时在 Applications 视图中使用 Deployment
当工作负载主要是无状态的,并且应通过副本 Pod 替换来更新,而不是依赖稳定标识或每个副本的持久状态时,请使用 Deployment。
通常在以下情况下,Deployment 更适合:
- 副本标识在替换后不需要保持稳定
- 工作负载应通过可互换的 Pod 进行横向扩展
- 应用交付更倾向于使用滚动更新行为
如果工作负载依赖稳定的序号标识或每个副本的持久存储,请改为查看 StatefulSets。
提交前的 Deployment 检查点
在 Applications 视图中创建或更新 Deployment 之前,请仔细检查以下内容:
- 所选项目、集群和 namespace 是否为预期的运行范围
- 副本数量是否与预期的可用性目标一致
- 所选 image 和拉取凭据在目标集群中是否有效
- 引用的 ConfigMap、Secret、PVC 或 ServiceAccount 是否已存在于同一 namespace 中
- 资源 requests、limits 和探针是否与应用真实的启动和健康行为一致
- 发布策略是否适合该工作负载和流量模式
管理 Deployments
使用 CLI 管理 Deployment
查看 Deployment
-
检查 Deployment 是否已创建。
-
获取 Deployment 的详细信息。
更新 Deployment
按照以下步骤更新 Deployment:
-
将 nginx Pod 更新为使用 nginx:1 .16.1 image。
或者使用以下命令:
另外,你也可以编辑 Deployment,并将
.spec.template.spec.containers[0].image从nginx:1.14.2改为nginx:1.16.1: -
查看 rollout 状态,运行:
运行 kubectl get rs 可以看到 Deployment 通过创建新的 ReplicaSet 并将其扩容到 3 个副本,同时将旧的 ReplicaSet 缩减到 0 个副本,从而完成了 Pod 更新。
运行 get pods 现在应该只会显示新的 Pod:
当更改 image 或 OCI Connector 时,也请检查 Pod 模板的 Pull Secret、serviceAccountName 和 token 有效期。更新后,请验证新的 ReplicaSet 和 Pod:检查 Connector 注解,确认实际 Pod image 已重写为 Connector proxy,等待 Pod 变为 Running,并查看 Events。
扩缩容 Deployment
你可以使用以下命令对 Deployment 进行扩缩容:
回滚 Deployment
-
假设你在更新 Deployment 时出现了拼写错误,把 image 名称写成了
nginx:1.161,而不是nginx:1.16.1: -
rollout 会卡住。你可以通过检查 rollout 状态来验证这一点:
删除 Deployment
删除 Deployment 时,也会删除其托管的 ReplicaSet 和所有关联的 Pod。
使用 web console 管理 Deployment
查看 Deployment
你可以查看 Deployment,以获取应用的信息。
- 在 Container Platform 中,导航到 Workloads > Deployments。
- 找到要查看的 Deployment。
- 点击 Deployment 名称,查看 Details、Topology、Logs、Events、Monitoring 等信息。
更新 Deployment
- 在 Container Platform 中,导航到 Workloads > Deployments。
- 找到要更新的 Deployment。
- 在 Actions 下拉菜单中选择 Update,打开 Edit Deployment 页面。
更新操作会让 Deployment 保持在当前的 cluster 和 namespace 中。如果工作负载必须运行在不同的 cluster 或 namespace 中,请在目标范围内创建或应用一个单独的 Deployment,而不要把更新当作迁移操作。
在提交更新之前,请确认对 image、探针、环境变量、端口、卷挂载或资源设置的更改不会破坏正在运行的工作负载。
对 Pod 模板的更改可能会触发新的 rollout。成功的更新请求本身并不意味着 rollout 已经健康。只有当新的 Pod 修订版本正确调度、变为就绪,并且替换了之前的修订版本而没有导致工作负载不可用时,实际效果才会体现出来。
在 web console 中更改 image 或 OCI Connector 时,也请检查 Pull Secret、工作负载 ServiceAccount 和 token 有效期。确认最终生成的 Pod 使用了 Connector proxy image 并完成 rollout;仅更新成功并不能验证 image 拉取是否正常。
删除 Deployment
- 在 Container Platform 中,导航到 Workloads > Deployments。
- 找到要删除的 Deployment。
- 在 Actions 下拉菜单中,点击操作列中的 Delete 按钮并确认。
删除后,请验证 Deployment 已不再出现在列表中,并确认需要保留的独立 Service、ConfigMap、Secret 或 PVC 仍然存在。
使用 CLI 排障
当 Deployment 出现问题时,可以采用以下常见排障方法。
对于 OCI Connector image 拉取失败,请按以下顺序检查:
- 检查 Pod 模板中的
connectors.<baseDomain>/connectors注解。 - 检查
spec.imagePullSecrets以及工作负载 ServiceAccount 的imagePullSecrets。 - 检查实际 Pod image 是否已重写为 Connector proxy。
- 检查 Pod 状态和 Events。
如果 Events 中显示原始 HTTP registry 出现 HTTPS 错误,则工作负载可能没有进入 Connector proxy 路径。请在更改 registry 运行时设置之前,检查 Connector proxy Secret、ServiceAccount 和 token。请参见 在 OCI Connector 中使用 ImagePullSecret。
检查 Deployment 状态
检查 ReplicaSet 状态
检查 Pod 状态
查看日志
进入 Pod 进行调试
检查健康配置
确保 livenessProbe 和 readinessProbe 已正确配置,并且应用的健康检查端点能够正常响应。探针失败排障
检查资源限制
确保容器的 resource requests 和 limits 设置合理,并且容器没有因为资源不足而被杀死。
