【云原生_K8S系列】Kubernetes 控制器之 Deployment

在 Kubernetes 中,Deployment 是一种高级控制器,负责管理应用的部署和生命周期。它提供了一种声明性的方式来定义应用的期望状态,并确保实际状态与期望状态保持一致。Deployment 可以自动处理应用的滚动更新、扩展和回滚等任务,是 Kubernetes 中最常用的控制器之一。本文将详细介绍 Deployment 的概念,并结合实际案例阐述其使用方法。

什么是 Deployment?

Deployment 是 Kubernetes 中的一个控制器,它管理 Pod 的副本集(ReplicaSet)。通过定义 Deployment,用户可以描述一个应用的期望状态,例如需要多少个副本、使用什么镜像以及如何进行滚动更新。Deployment 会根据这些定义自动创建和管理 Pod,确保应用始终处于期望状态。

Deployment 控制器可以确保无状态应用的高可用性和一致性,支持:

  • 动态创建和销毁 Pod
  • 查看升级进度和状态
  • 升级回滚,并具有版本记录
  • 暂停和恢复升级
  • 滚动重启

工作原理

Deployment 控制器通过 ReplicaSet(副本集控制器)来管理 Pod 的生命周期。ReplicaSet 确保指定数量的 Pod 副本始终运行。

Deployment 控制器的工作流程如下:

  • 创建 Deployment:用户创建一个 Deployment 对象,定义了应用的预期状态,包括 Pod 模板、副本数量等
  • 创建 ReplicaSet:Deployment 控制器创建或更新一个 ReplicaSet,以确保 Pod 副本的数量与预期状态一致
  • 创建 Pod:ReplicaSet 根据 Deployment 定义的 Pod 模板创建或更新 Pod
  • 监控 Pod:Deployment 控制器持续监控 Pod 的状态,确保副本数量与预期状态一致
  • 更新 Pod:当用户更新 Deployment 时,控制器会根据定义的更新策略逐步替换旧版本的 Pod

Deployment 的实际案例

接下来,通过一个实际案例来演示如何使用 Deployment 管理 Nginx 应用。

创建 Nginx Deployment

以下是一个用于创建 Nginx Deployment 的 YAML 文件:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19.6
        ports:
        - containerPort: 80
  • apiVersion: apps/v1:定义 API 版本。
  • kind: Deployment:表示我们要创建一个 Deployment 对象。
  • metadata:包含 Deployment 的元数据,如名称和标签。
  • spec:描述 Deployment 的具体配置。
    • replicas: 3:定义期望的 Pod 副本数量。
    • selector:指定 Deployment 关联的 Pod 标签。
    • template:定义 Pod 模板,包含 Pod 的元数据和具体配置。
      • containers:定义 Pod 中的容器。
        • name: nginx:容器的名称。
        • image: nginx:1.19.6:容器使用的镜像。
        • ports:容器暴露的端口。

部署 Nginx Deployment

使用 kubectl 命令可以在 Kubernetes 集群中部署这个 Deployment:

shell 复制代码
kubectl apply -f nginx-deployment.yaml

这个命令会读取 nginx-deployment.yaml 文件并在 Kubernetes 集群中创建一个 Nginx Deployment。

查看 Deployment 状态

使用以下命令查看 Deployment 的状态:

shell 复制代码
kubectl get deployments

输出示例:

这表明 Nginx Deployment 已成功创建并运行了三个副本。

更新 Nginx Deployment

假设我们需要将 Nginx 镜像更新到新版本 nginx:1.20.0,可以编辑 nginx-deployment.yaml 文件,修改镜像版本:

yaml 复制代码
...
      containers:
      - name: nginx
        image: nginx:1.20.0
        ports:
        - containerPort: 80
...

然后再次应用配置:

shell 复制代码
kubectl apply -f nginx-deployment.yaml

Kubernetes 会自动执行滚动更新,逐步替换旧版本的 Pod 为新版本的 Pod。

[外链图片转存中...(img-PqQ8vFl5-1717643635578)]

回滚 Deployment

在Kubernetes中,你可以使用kubectl rollout undo命令来回滚一个deployment到其前一个版本。如果你想要回滚到特定的版本,你可以使用--to-revision参数。

以下是回滚deployment到其前一个版本的命令:

shell 复制代码
kubectl rollout undo deployment/nginx-deployment

可以通过以下命令查看可回滚版本的版本:

shell 复制代码
kubectl rollout history deployment nginx-deployment

执行上述的命令后,输出结果如下:

这个命令会将 Nginx Deployment 回滚到之前的版本,确保应用正常运行。

扩展和缩减 Deployment

可以根据需要调整 Pod 的副本数量。例如,将副本数量扩展到 5:

shell 复制代码
kubectl scale deployment/nginx-deployment --replicas=5

查看 Deployment 状态:

shell 复制代码
kubectl get deployments

输出示例:

shell 复制代码
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   5/5     5            5           10m

总结

Kubernetes Deployment 是管理应用生命周期的强大工具。通过声明性的方式定义 Deployment,可以轻松实现应用的滚动更新、回滚和扩展等操作。本文通过 Nginx 的实际案例展示了如何使用 Deployment,希望能帮助读者更好地理解和应用 Kubernetes Deployment。

如果你对 Kubernetes 和云原生技术感兴趣,欢迎关注我们后续的文章。

相关推荐
年薪丰厚1 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container
zhangj11251 小时前
K8S Ingress 服务配置步骤说明
云原生·容器·kubernetes
岁月变迁呀1 小时前
kubeadm搭建k8s集群
云原生·容器·kubernetes
墨水\\1 小时前
二进制部署k8s
云原生·容器·kubernetes
Source、1 小时前
k8s-metrics-server
云原生·容器·kubernetes
上海运维Q先生1 小时前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
KubeSphere 云原生1 小时前
云原生周刊:利用 eBPF 增强 K8s
云计算·k8s·容器平台·kubesphere
颜淡慕潇1 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
ProtonBase1 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
大熊程序猿3 小时前
K8s证书过期
云原生·容器·kubernetes