【云原生_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 和云原生技术感兴趣,欢迎关注我们后续的文章。

相关推荐
梅见十柒26 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Python私教1 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
运维&陈同学2 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
O&REO3 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
politeboy3 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
运维小文4 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻4 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
wuxingge12 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX13 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总13 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes