Kubernetes 部署:滚动部署、金丝雀部署、蓝绿部署

2025-06-07

Kubernetes 部署:滚动部署、金丝雀部署、蓝绿部署

使用 Kubernetes 部署应用程序因其众多优势而日益流行。Kubernetes 能够轻松管理容器化应用程序,并提供一个用于应用程序部署、扩展和管理的平台。借助 Kubernetes,应用程序可以在不同环境(包括本地和云平台)之间快速一致地部署。

在使用 Kubernetes 部署应用程序时,我们许多人都会对使用哪种部署类型(滚动部署、蓝绿部署、金丝雀部署等)存有疑问。在本文中,我们将讨论这些部署类型:金丝雀部署、滚动部署和蓝绿部署,它们如何工作,以及您应该选择哪一种。

金丝雀部署

Kubernetes 金丝雀部署是一种在将更新发布到整个系统之前,先向一小部分用户或服务器推出新功能或变更的技术。具体方法是创建一个包含更新版本软件的新副本集,同时保持原始副本集运行。一小部分流量会被路由到新的副本集,而大部分流量则继续由原始副本集提供服务。这样一来,新版本就可以在实际环境中进行测试,同时最大限度地降低问题影响整个系统的风险。如果在金丝雀部署期间检测到问题,可以快速回滚到原始副本集。金丝雀部署是一种非常有效的工具,它允许在将变更发布到整个系统之前对其进行受控测试,从而最大限度地降低风险并确保复杂分布式系统的高可用性。

以下是 Kubernetes 中金丝雀部署 YAML 文件的示例。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:v1
        ports:
        - containerPort: 8080
      readinessProbe:
        httpGet:
          path: /
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 5
      livenessProbe:
        httpGet:
          path: /
          port: 8080
        initialDelaySeconds: 10
        periodSeconds: 10
Enter fullscreen mode Exit fullscreen mode

在此示例中,我们将部署一个 Kubernetes Deployment,它将创建应用程序的三个副本。该 Deployment 使用选择器根据标签app: myapp查找要管理的适当 Pod 。

template 部分指定了部署创建的 Pod 的配置。在本例中,我们在每个 Pod 中运行一个容器,该容器由 containers 字段指定。使用的容器镜像是myapp:v1,这是我们应用程序的第一个版本。

我们还为容器添加了两个探针来检查其健康状况。readinessProbe用于检查容器是否已准备好接收流量,livenessProbe用于检查容器是否仍在运行。如果其中一个探针失败,Pod 就会重启。

要执行金丝雀部署,我们需要创建第二个部署 YAML 文件,该文件指定应用程序的新版本,例如myapp:v2。然后,我们将更新原始部署以设置金丝雀测试,方法是将新版本的副本数扩容至 1,同时将旧版本的副本数保持在 2。

新版本运行后,我们可以进行测试,确保其正常运行。如果一切正常,我们可以更新原始部署,以扩展新版本的副本数,并逐步缩减旧版本的副本数。

这将导致一小部分流量逐渐从旧版本转移到新版本,直到所有流量都流向新版本。如果新版本出现任何问题,我们可以通过逆转此过程快速回滚到旧版本。

滚动部署

Kubernetes 滚动部署是一种以可控且循序渐进的方式更新和部署新版本软件的策略。Kubernetes 不会一次性部署所有更新,而是逐步推出变更,从而降低停机风险,并在出现错误时轻松回滚。滚动部署涉及使用更新后的软件版本创建新的副本集,同时逐步缩减旧副本集的规模。这样可以在旧版本仍在运行时部署新版本,确保服务不中断。新版本完全部署后,将删除旧副本集,部署完成。Kubernetes 滚动部署对于确保复杂分布式系统的高可用性和可靠性至关重要。

以下是 Kubernetes 中滚动部署 YAML 文件的示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:v1
        ports:
        - containerPort: 8080
Enter fullscreen mode Exit fullscreen mode

在此示例中,我们将部署一个 Kubernetes Deployment,它将创建应用程序的三个副本。该 Deployment 使用选择器根据标签app: myapp查找要管理的适当 Pod 。

策略部分指定 Kubernetes 更新部署时应使用的策略。在本例中,我们使用了滚动更新 (RollingUpdate) 策略。这意味着 Kubernetes 将逐步更新部署,用新副本替换旧副本。

maxSurgemaxUnavailable字段控制滚动更新过程。maxSurge确定在所需副本数之上可以创建的最大副本数,maxUnavailable确定更新期间可以使用最大副本数。

template 部分指定了部署创建的 Pod 的配置。在本例中,我们在每个 Pod 中运行一个容器,该容器由 containers 字段指定。使用的容器镜像是myapp:v1,这是我们应用程序的第一个版本。

要更新部署,我们需要创建一个新的部署 YAML 文件,该文件指定应用程序的新版本,例如myapp:v2。然后,我们将更新原始部署以指向新的 YAML 文件。

一旦开始更新,Kubernetes 将逐步用新副本替换旧副本,直到所有副本都运行新版本。滚动更新过程可以最大程度地减少对用户的干扰,因为它始终确保在新版本推出时至少有一个旧版本的副本正在运行。

蓝绿部署策略

蓝绿 Kubernetes 部署策略是一种发布应用程序新版本的技术,旨在最大限度地减少停机时间和风险。它需要运行两个相同的环境,一个作为活跃的生产环境(蓝色),另一个作为新的候选发布环境(绿色)。新的候选发布环境在切换到生产环境之前会经过全面测试,以确保平稳过渡,不会出现任何停机或错误。

以下是 Kubernetes 上蓝绿部署的示例 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        version: blue
    spec:
      containers:
        - name: my-app
          image: myregistry/my-app:blue
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
Enter fullscreen mode Exit fullscreen mode

在此示例中,我们为名为“ my-app ”的应用程序定义了一个部署,该部署具有两个副本。该部署的标签选择器为“ app: my-app ”,它将匹配将流量路由到该部署的相应服务。

第一个模板定义了应用程序的“ blue ”版本。它使用标签“ version:blue ”进行定义,以便轻松识别当前生产环境中的版本。此版本的容器镜像从 Docker 注册表“ myregistry/my-app:blue ”中拉取。
当新版本准备就绪时,会添加一个带有标签“ version:green ”的新模板。此新模板将包含一个更新的容器镜像,其中包含应用程序的新版本。新模板创建完成并准备发布后,即可更新 Kubernetes 服务,将流量路由到新的“ green ”部署。

这种蓝绿部署策略可确保应用程序的新版本在发布之前能够得到全面测试,不会出现停机或错误。

使用 Harness 自动化您的 Kubernetes 部署

Kubernetes 部署

无论您选择哪种部署类型,Harness 都可以轻松地自动化您的部署,只需点击几下即可。您可以在创建管道时选择滚动部署、蓝绿部署或金丝雀部署等,仅此而已。剩下的交给 Harness 处理。

创建一个免费的 Harness 云帐户并选择持续交付 (CD) 模块。

转到模块并开始您的免费 CD 计划。
持续交付模块

从您的部署之旅开始。
开始部署

所有步骤都非常简单易懂。创建 CD 流水线后,您可以返回流水线工作室并选择 CD 阶段,点击“执行”选项卡,然后您应该会看到部署类型默认为“滚动”。
默认部署类型

您可以编辑部署类型并添加所需的部署类型。
部署策略

从上面的列表中可以看出,您可以使用列出的任何策略来部署您的应用程序。

在Harness部署流水线中,我们可以选择Canary部署策略。
部署管道

添加步骤并从可用选项中选择 Canary。
金丝雀部署

单击“Canary Deployment”并添加名称、超时和所需实例等详细信息。
金丝雀部署设置

您可以应用更改、保存并运行管道。
成功的管道

您可以看到成功的金丝雀部署。
同样,您可以选择蓝绿部署策略并部署您的应用程序。

这就是 Harness 如何帮助您通过几次点击,按照您想要的任何部署策略无缝地部署应用程序。

您应该选择哪一个?

Kubernetes 部署策略的选择取决于所部署的应用程序或服务的具体需求和要求。

金丝雀部署策略通常用于将新功能或更新部署到部分用户或服务器,以便在实际环境中进行测试,并且常用于需要频繁更新的应用程序。此策略允许在对生产环境影响最小的情况下测试新功能,并有助于在问题影响整个系统之前发现它们。

滚动部署策略非常适合那些在部署过程中要求零停机时间的应用程序。它涉及逐步推出应用程序的新版本,同时确保旧版本仍在运行,从而降低停机风险,并在出现问题时轻松回滚。

蓝绿部署策略适用于可接受停机时间但必须尽量减少停机时间的应用程序。该策略涉及运行两个相同的环境,一个用作活动生产环境,另一个用作新的候选发布环境。新的候选发布环境在切换到生产环境之前会进行测试,以确保平稳过渡,不会出现任何停机或错误。

总而言之,部署策略的选择取决于所部署应用程序或服务的具体需求。金丝雀部署适合频繁更新和测试,滚动部署适合零停机部署,而蓝绿部署则适合最大限度地减少部署期间的停机时间。

文章来源:https://dev.to/pavanbelagatti/kubernetes-deployments-rolling-vs-canary-vs-blue-green-4k9p
PREV
了解如何构建 Docker 镜像并将其推送到容器注册表
NEXT
面向开发人员的 Dockerfile 最佳实践