Argo Rollouts和ALB Ingress Controller一起实现了金丝雀部署

大致内容

我们可以使用Kubernetes的Argo CD工具来实现GitOps,并通过Kubernetes的部署控制器Argo Rollouts来实现蓝/绿部署和金丝雀发布,以验证金丝雀发布的工作。

前次我們寫了一篇關於 Argo Rollouts 和 Nginx Ingress Controller 的配合文章。這次將介紹 ALB Ingress Controller 的版本。

因为有一些说明与Nginx重叠,所以这里将介绍ALB特定的设置。

使用 Argo Rollouts 和 Nginx Ingress Controller 进行金丝雀部署。请参阅前一篇文章:https://qiita.com/tomozo6/items/1bfc65a86a528f63d205

不需要多种选择,以下是用中文对“各マニフェスト”进行的释义:

各种宣言或宣告

进入

这是为ALB专门设计的入口控制器。当将Nginx与Rollouts配合使用时,并不需要对ingress进行太多特殊的配置,但在使用ALB的情况下,ingress的配置变得关键。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tomozo
  namespace: tomozo
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/security-groups: tomozo-securitygroup-arn
    alb.ingress.kubernetes.io/certificate-arn: tomozo-certificate-arn
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_302"}}'
    alb.ingress.kubernetes.io/conditions.x-canary-header: '[{"Field":"http-header","HttpHeaderConfig":{"HttpHeaderName": "X-Canary", "Values":["true"]}}]'
    alb.ingress.kubernetes.io/actions.x-canary-header: '{"Type":"forward","ForwardConfig":{"TargetGroups":[{"ServiceName":"tomozo-canary","ServicePort":"8080"}]}}'
spec:
  rules:
  - host: tomozo.tokyo
    http:
      paths:
      - path: /*
        backend:
          serviceName: ssl-redirect
          servicePort: use-annotation
      - path: /*
        backend:
          serviceName: x-canary-header
          servicePort: use-annotation
      - path: /*
        backend:
          serviceName: tomozo-stable
          servicePort: use-annotation

我将会逐步进行详细解释。

ALB的基本配置(与卷量无关)

annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/security-groups: tomozo-securitygroup-arn
    alb.ingress.kubernetes.io/certificate-arn: tomozo-certificate-arn

这是关于ALB的设置,即使没有Rollouts协作也是必要的。因此在这里不需要特别解释。

只需一种选择,用中文来释义以下内容:
将http重定向到https(与Rollouts无关)

annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_302"}}'
~
spec:
  rules:
  - host: tomozo.tokyo
    http:
      paths:
      - path: /*
        backend:
          serviceName: ssl-redirect
          servicePort: use-annotation

这与Rollouts协调无关。这是关于将http重定向到https的强制重定向设置。请参考ALB文件以了解更详细的信息。

只需提供特定的请求标头,确保访问时总是路由到金丝雀服务。

annotations:
    alb.ingress.kubernetes.io/conditions.x-canary-header: '[{"Field":"http-header","HttpHeaderConfig":{"HttpHeaderName": "X-Canary", "Values":["true"]}}]'
    alb.ingress.kubernetes.io/actions.x-canary-header: '{"Type":"forward","ForwardConfig":{"TargetGroups":[{"ServiceName":"tomozo-canary","ServicePort":"8080"}]}}'
~
spec:
  rules:
  - host: tomozo.tokyo
    http:
      paths:
      - path: /*
        backend:
          serviceName: x-canary-header
          servicePort: use-annotation

Canary 版本的发布通常会按照 stable 和 canary 的设定比例进行路由,但是通过引入这个机制,开发者可以确保始终将流量路由到 canary 版本。如果将流量路由到 canary 版本的比例设为 0%,那就可以实现基于头部路由的蓝绿部署。

当使用Nginx时,可以在Rollouts的strategy.canary.trafficRouting.nginx.additionalIngressAnnotations中进行配置以设置标题路由(canary-by-header),但是在针对ALB的策略中,我没有找到这样的配置,所以我感到很困扰。也许Rollouts的开发人员认为”你可以在ALB的ingress中做这个,就用那个做吧”。

在这里的设置是,如果请求头X-Canary的值为true,则路由到tomozo-canary。

与 Rollouts 的协作部分

spec:
  rules:
  - host: tomozo.tokyo
    http:
      paths:
      - path: /*
        backend:
          serviceName: tomozo-stable
          servicePort: use-annotation

这个地方是这次很难理解的。这里所提到的tomozo-stable,并不是指Kubernetes的svc,而是指注解名(alb.ingress.kubernetes.io/actions.tomozo-stable)。所以servicePort变成了user-annotation。alb.ingress.kubernetes.io/actions.tomozo-stable是Rollouts在Kubernetes上追加的,所以目前并不存在。所以我感到相当混乱…

服务

对于通常(安定版)使用的服务,我们定义为tomozo-stable。对于Canary使用的服务,我们定义为tomozo-canary。除了名称外,所有设置值都可以保持相同,没有问题。

---
kind: Service
apiVersion: v1
metadata:
  name: tomozo-stable
spec:
  type: NodePort
  selector:
    app: tomozo
  ports:
    - port: 8080
---
kind: Service
apiVersion: v1
metadata:
  name: tomozo-canary
spec:
  type: NodePort
  selector:
    app: tomozo
  ports:
    - port: 8080

推出

策略: 最高层次是部署,写法不变。关键是在 trafficRouting 中指定了 alb。

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: tomozo
  labels:
    app: tomozo
spec:
  selector:
    matchLabels:
      app: tomozo
  template:
    metadata:
      labels:
        app: tomozo
    spec:
      serviceAccountName: tomozo
      containers:
        - name: tomozo
          image: tomozo-repo/tomozo:0.0.1
# -----この行から上は元のDeploymentと一緒------
# -----この行から下はRolloutの拡張部分------
  strategy:
    canary:
      stableService: tomozo-stable  # ingressに actions.tomozo-stable が作成される
      canaryService: tomozo-canary
      trafficRouting:
        alb:
           ingress: tomozo      # ingress名を指定する
           servicePort: 8080
      steps:
        - setWeight: 10
        - pause: {}

通过设置tomozo-stable,将会在ingress中添加以下注释。

    alb.ingress.kubernetes.io/actions.tomozo-stable: |
      {
        "Type":"forward",
        "ForwardConfig":{
          "TargetGroups":[
            {
                "Weight":0,
                "ServiceName":"tomozo-canary",
                "ServicePort":"8080"
            },
            {
                "Weight":100,
                "ServiceName":"tomozo-stable",
                "ServicePort":"8080"
            }
          ]
        }
      }

通过调整上述注释的权重来实现金丝雀部署,以匹配 tomozo-stable.steps.setWeight ,当发布新的容器映像时。

广告
将在 10 秒后关闭
bannerAds