6

使用K8S进行蓝绿部署的简明实操指南 - Seal软件

 2 years ago
source link: https://www.cnblogs.com/sealio/p/17235291.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在之前的应用部署系列文章里,我们已经介绍过什么是蓝绿部署。如需回顾,点击下方文章链接即可重温。本文我们将会介绍如何使用 Kubernetes 实现蓝绿部署。

应用部署初探:3个主要阶段、4种常见模式
应用部署初探:微服务的3大部署模式
应用部署初探:6个保障安全的最佳实践

前期准备:

  • Kubernetes 集群
  • kubectl
  • 要部署的应用程序的 Docker 镜像

如果你已经准备就绪,那么我们就开始部署啦!

2903698-20230320093648032-599714264.png

Step 1:创建命名空间

首先,我们需要创建命名空间来部署我们的应用程序。输入以下命令即可:
kubectl create namespace blue-green

Step 2:创建部署

接下来,我们需要创建2个部署,一个是蓝环境,另一个是绿环境。除了标签之外,两个部署应该是相同的(标签主要是为了辨别哪个是蓝环境,哪个是绿环境)。以下是部署 manifest 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-blue
  labels:
    app: myapp
    env: blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      env: blue
  template:
    metadata:
      labels:
        app: myapp
        env: blue
    spec:
      containers:
      - name: myapp
        image: myapp:v1.0
        ports:
        - containerPort: 80

将 manifest 保存为 blue-deployment.yaml,并使用以下命令在蓝环境中创建部署:

kubectl apply -f blue-deployment.yaml -n blue-green

同理,通过在 manifest 文件中更改名称和标签来在绿环境中创建另一个部署,并将其保存为 green-deployment.yaml。接下来,使用以下命令将其部署在绿环境:

kubectl apply -f green-deployment.yaml -n blue-green

Step 3:创建服务

现在,我们需要创建服务将我们的应用程序暴露给外部世界。该服务应该使用 label selector 来将流量路由到蓝部署和绿部署中。以下是服务 manifest 示例:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

将 manifest 保存为 service.yaml,并使用以下命令创建服务:
kubectl apply -f service.yaml -n blue-green

Step 4:验证部署

现在,我们来验证部署和服务是否能正常运行。首先,我们需要获得服务的外部IP地址:
kubectl get service myapp-service -n blue-green

该命令将输出服务的外部IP地址。使用这个IP地址可以在浏览器内访问应用。你应该可以看到应用在蓝环境中运行。

Step 5:执行蓝绿部署

既然蓝绿部署都在运行,我们就可以通过从蓝环境路由流量到绿环境来执行蓝绿部署。

Step 6:更新绿部署

首先,我们需要使用应用程序的新版本更新绿部署。在绿部署的 manifest 里用新版本的 Docker 镜像来更新镜像字段并将其保存为 green-deployment-v2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-green
  labels:
    app: myapp
    env: green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      env: green
  template:
    metadata:
      labels:
        app: myapp
        env: green
    spec:
      containers:
      - name: myapp
        image: myapp:v2.0
        ports:
        - containerPort: 80

使用以下命令,应用更新好的绿部署:

kubectl apply -f green-deployment-v2.yaml -n blue-green

Step 7:更新服务

接下来,我们需要更新服务以将流量路由到绿部署。首先,在服务的manifest里更新 label selector,以选择绿部署:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    env: green
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

使用以下命令应用更新完毕的服务:

kubectl apply -f service.yaml -n blue-green

Step 8:验证部署

最后,我们需要验证部署是否成功。首先,使用 kubectl get service 命令获取服务的外部IP地址,并在浏览器中访问应用程序。你应该看到已经更新好的应用版本在绿环境中运行。

Step 9:回滚

如果在部署期间发生错误,我们可以轻松回滚到之前的应用版本:通过在服务的manifest里更新 label selector 来选择蓝环境并重新应用服务 manifest。

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    env: blue
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

应用更新完毕的服务:

kubectl apply -f service.yaml -n blue-green

需要考虑的因素

当您在 Kubernetes 中进行蓝绿部署时,需要考虑一些其他因素:

  • 存储:如果你的应用程序需要持久化存储,你要确保蓝绿部署都使用相同的持久卷。否则,你可能会在部署过程中丢失数据。
  • DNS:如果你的应用程序属于自定义域名,那么当从蓝部署切换到绿部署时,你需要更新 DNS 记录以指向新的IP地址。
  • 测试:在将流量切换到绿部署之前,彻底地测试应用新版本以保证其正常工作是至关重要的。也可以使用金丝雀发布来将流量逐步切换的新版本并监控其性能。

尽管蓝绿部署是一种高效的部署应用程序的方法,但它可能并不适用于每种情况。例如,如果你的应用需要进行大量的数据迁移或更改数据库格式,蓝绿部署可能不是最佳策略,因为它会导致蓝绿环境之间数据不一致。

此外,对于需要持久性存储的有状态的应用程序来说,蓝绿部署的实施可能具有挑战性,因为数据必须在蓝色和绿色环境之间同步进行。在这些情况下,你也许需要考虑其他部署策略,比如滚动更新或金丝雀部署。

在本文中,我们了解了如何使用 Kubernetes 进行蓝绿部署。蓝绿部署是一种备受欢迎的部署策略,因为它提供了零停机时间,并在出错时提供了快速、简单的回滚方式。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK