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 ,当发布新的容器映像时。