Kubernetes Deployment 教程

305 阅读3分钟

简介

Kubernetes(K8s)是一个开源的容器编排平台,用于自动部署、扩展和管理容器化应用程序。在Kubernetes中,Deployment是一种高级API对象,用于管理无状态应用的副本。

1. 理解Deployment

Deployment是Kubernetes中用于声明式管理无状态应用的副本集(ReplicaSet)和Pod的工具。它确保Pod副本数与声明的目标一致,并提供自动回滚和滚动更新的功能。

2. 背景问题

在没有Deployment的情况下,直接管理Pod会遇到以下问题:

  • Pod分布散乱
  • 难以保证可用Pod数量
  • 镜像版本更新困难
  • 服务更新时难以保证可用性
  • 难以快速回滚至旧版本

3. Deployment的基本概念

3.1. 核心组件

  • Pod:Kubernetes的基本工作单元,每个Pod包含一个或多个容器。
  • ReplicaSet:确保指定数量的Pod副本始终运行。
  • Deployment:管理ReplicaSet的生命周期,负责声明期望的副本数量和更新策略。

3.2. YAML文件结构

一个典型的Deployment YAML文件包含以下部分:

  • apiVersion:指定Kubernetes API的版本。
  • kind:声明资源类型,对于Deployment为Deployment
  • metadata:包含Deployment的元数据,如名称、标签等。
  • spec:定义Deployment的期望状态,包括副本数、选择器和模板。
  • status:显示Deployment的当前状态,如副本数、更新进度等。

例子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8.0
        ports:
        - containerPort: 80
          protocol: TCP
  • 第一个是 replicas,就是 Deployment 中期望的或者终态数量;
  • 第二个是 template,也就是 Pod 相关的一个模板。

4. 操作Deployment

4.1. 创建Deployment

使用kubectl命令创建Deployment:

kubectl apply -f deployment.yaml

4.2. 更新镜像

通过以下命令更新Deployment中的容器镜像:

kubectl set image deployment/<deployment-name> <container-name>=<new-image>

4.3. 查看Deployment状态

查看Deployment的状态和详细信息:

kubectl get deployment <deployment-name> -o yaml

4.4. 快速回滚

如果更新出现问题,可以执行回滚:

kubectl rollout undo deployment/<deployment-name>

5. 架构设计

5.1. 管理模式

Deployment只负责管理ReplicaSet,ReplicaSet负责管理Pod副本。每个ReplicaSet对应Deployment模板的一个版本。

5.2. 控制器实现原理

Deployment控制器通过Informer机制关注Deployment和ReplicaSet的事件,并根据事件进行处理。

6. 升级策略

6.1. 扩/缩容策略

  • MinReadySeconds:设置Pod在被认为是可用之前的最小等待时间。
  • revisionHistoryLimit:设置保留历史ReplicaSet的数量。
  • paused:设置Deployment是否暂停发布新版本。

6.2. 滚动更新策略

  • MaxUnavailable:设置滚动更新过程中最多有多少个Pod不可用。
  • MaxSurge:设置滚动更新过程中最多存在多少个超过预期副本数的Pod。

总结

Deployment是Kubernetes中用于管理无状态应用副本的重要工具。通过理解其工作原理和掌握基本操作,可以有效管理和更新容器化应用,确保应用的高可用性和平滑过渡。