Kubernetes 实战:使用 Deployment 运行无状态应用
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
前言
在 Kubernetes 中,Deployment 是最常用的工作负载资源之一,它为我们提供了一种声明式的方式来管理应用部署。本文将深入探讨如何使用 Deployment 来运行和管理无状态应用,适合 Kubernetes 初学者和希望巩固基础的中级用户。
什么是 Deployment?
Deployment 是 Kubernetes 中用于管理无状态应用的高级抽象,它提供了以下关键功能:
- 声明式更新:只需描述期望状态,Deployment 控制器会自动将实际状态调整为期望状态
- 滚动更新:支持零停机时间的应用更新
- 回滚能力:当更新出现问题时可以轻松回退到之前的版本
- 扩缩容:可以轻松调整应用实例(Pod)的数量
创建第一个 Deployment
让我们从一个简单的 Nginx 部署开始。我们将使用 YAML 文件来定义 Deployment 的期望状态。
Deployment YAML 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
这个 YAML 文件定义了一个名为 nginx-deployment
的 Deployment,它会创建 2 个 Pod 副本,每个 Pod 都运行 nginx:1.14.2 容器。
创建 Deployment
使用 kubectl 应用这个 YAML 文件:
kubectl apply -f deployment.yaml
查看 Deployment 状态
创建 Deployment 后,我们可以使用以下命令检查其状态:
查看 Deployment 详情
kubectl describe deployment nginx-deployment
这个命令会输出 Deployment 的详细信息,包括:
- 副本数量
- 更新策略
- 当前状态
- 相关事件
查看 Deployment 创建的 Pod
kubectl get pods -l app=nginx
这会列出所有带有 app=nginx
标签的 Pod,这些 Pod 就是由我们的 Deployment 创建的。
更新 Deployment
更新 Deployment 是 Kubernetes 中非常常见的操作。假设我们需要将 Nginx 版本从 1.14.2 升级到 1.16.1:
更新 YAML 文件
修改之前的 YAML 文件,将镜像版本改为 1.16.1:
image: nginx:1.16.1
应用更新
kubectl apply -f deployment-update.yaml
Kubernetes 会自动执行滚动更新,逐步用新版本的 Pod 替换旧版本的 Pod,确保服务不中断。
扩缩容 Deployment
根据应用负载变化,我们可能需要调整 Pod 的数量。
水平扩展
将副本数从 2 增加到 4:
replicas: 4
应用修改:
kubectl apply -f deployment-scale.yaml
验证扩展
kubectl get pods -l app=nginx
现在应该能看到 4 个运行的 Pod。
Deployment 工作原理
理解 Deployment 的工作原理有助于更好地使用它:
- 控制器模式:Deployment 控制器持续监控集群状态
- ReplicaSet:Deployment 通过创建和管理 ReplicaSet 来实现副本控制
- 滚动更新策略:默认情况下,Deployment 会确保至少 75% 的 Pod 可用
- 版本记录:Deployment 会保留更新历史,方便回滚
最佳实践
- 使用标签选择器:确保 Deployment 的 selector 与 Pod 模板中的标签匹配
- 资源限制:为容器设置资源请求和限制
- 就绪探针:配置就绪探针以确保流量只路由到准备好的 Pod
- 版本控制:使用有意义的版本标签而非 latest
- 监控:设置适当的监控和告警
删除 Deployment
当不再需要 Deployment 时,可以将其删除:
kubectl delete deployment nginx-deployment
这会删除 Deployment 及其管理的所有 Pod。
总结
Deployment 是 Kubernetes 中管理无状态应用的核心资源,它提供了强大的部署、更新和扩缩容能力。通过本文的实践,你应该已经掌握了 Deployment 的基本使用方法。在实际生产环境中,Deployment 通常与其他 Kubernetes 资源如 Service、Ingress 等配合使用,构建完整的应用部署方案。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考