サービスを更新する前に、カナリアリリースを使用して新しいサービスバージョンの安定性をテストできます。 Application Load Balancer (ALB) Ingressでは、カナリアアノテーションを使用して、ヘッダー、Cookie、および重みに基づいてカナリアリリースを実行できます。 異なるルールを使用するカナリアリリースは、ヘッダーベース> クッキーベース> 重みベースの順に有効になります。 ヘッダーベース、クッキーベース、および重みベースのルールを同時に設定する場合、優先度が最も高いルールが優先されます。
使用上の注意
ヘッダーベースとクッキーベースのルールは、同じIngressで重みベースのルールを設定することはできません。 2つの別々のIngressでそれらを設定するか、カスタムルーティングルールを使用する必要があります。
カナリアアノテーションを使用してカナリアリリースを実行する場合、ALB Ingressルーティングルールが有効になる順序は、
Ingress名前空間または名前
の辞書式順序によって異なります。 カナリアリリースルールが正しい順序で適用されるようにするには、alb.ingress.kubernetes.io/order
アノテーションを使用して順序を定義します。alb.ingress.kubernetes.io/order
の有効な値は1 ~ 1000です。 デフォルト値は 10 です。 値が小さいほど、優先度が高くなります。 たとえば、Ingressの優先度を上げたい場合は、そのalb.ingress.kubernetes.io/order
設定の値を減らすことができます。カスタムルーティングルールを使用して、より複雑なルーティング条件に基づいてカナリアリリースを実行できます。 詳細については、「ALB Ingressのルーティングルールのカスタマイズ」をご参照ください。
ステップ1: アプリケーションの作成
teaという名前のサービスを展開します。
tea-deploy.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 1 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest ports: - containerPort: 80
次のコマンドを実行して、teaサービスをデプロイします。
kubectl apply -f tea-deploy.yaml
tea-svcという名前のサービスをデプロイします。
tea-svc.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePort
次のコマンドを実行して、tea-svcサービスをデプロイします。
kubectl apply -f tea-svc.yaml
tea-Ingressという名前のingressをデプロイします。
tea-ingress.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. http: paths: - path: / pathType: Prefix backend: service: name: tea-svc port: number: 80
次のコマンドを実行してIngressをデプロイします。
kubectl apply -f tea-ingress.yaml
ステップ2: 新しいサービスバージョンのカナリアリリースを実行する
新しいServiceバージョンと新しいIngressをデプロイして、canaryという名前の新しいServiceバージョンにlocation: hz
ヘッダーを運ぶすべての要求をルーティングし、他の要求の50% を新しいServiceバージョンにルーティングします。 他の要求は、他のヘッダを搬送する要求と、搬送ヘッダを搬送しない要求とを含む。
canaryという名前の新しいサービスバージョンを展開します。
canary-deploy.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: apps/v1 kind: Deployment metadata: name: canary spec: replicas: 1 selector: matchLabels: app: canary template: metadata: labels: app: canary spec: containers: - name: canary image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx:latest ports: - containerPort: 80
次のコマンドを実行してカナリアサービスをデプロイします。
kubectl apply -f canary-deploy.yaml
canary-svcという名前のサービスをデプロイします。
canary-svc.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: v1 kind: Service metadata: name: canary-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: canary type: NodePort
次のコマンドを実行して、canary-svc Serviceをデプロイします。
kubectl apply -f canary-svc.yaml
ヘッダーに基づいてリクエストをルーティングするIngressをデプロイします。
canary-header-ingress.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-by-header: "location" alb.ingress.kubernetes.io/canary-by-header-value: "hz" name: canary-header-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefix
カナリア注釈を有効にするには、alb.ingress.kubernetes.io/canaryをtrueに設定します。
alb.ingress.kubernetes.io/canary-by-headerとalb.ingress.kubernetes.io/canary-by-header-valueを、一致させるヘッダーのキーと値に設定します。 この例では、ヘッダーのKVペアは
location: hz
に設定されています。location: hz
ヘッダーを持つすべてのリクエストは、新しいサービスバージョンにルーティングされます。 他のヘッダーを持つリクエストは、ルールの優先順位に基づいて他のカナリアリリースルールと照合され、一致するルールに関連付けられたサービスバージョンにルーティングされます。
次のコマンドを実行して、ヘッダーに基づいてリクエストをルーティングするIngressをデプロイします。
kubectl apply -f canary-header-ingress.yaml
Ingressをデプロイして、重みに基づいてリクエストをルーティングします。
canary-weight-ingress.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-weight: "50" name: canary-weight-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefix
alb.ingress.kubernetes.io/canary-weight: 新しいサービスバージョンにルーティングされるトラフィックの割合を指定します。 この例では、値は50に設定されています。これは、トラフィックの50% が新しいサービスバージョンにルーティングされることを示します。
次のコマンドを実行して、Ingressをデプロイし、重みに基づいてリクエストをルーティングします。
kubectl apply -f canary-weight-ingress.yaml
カナリアリリースが成功したかどうかを確認します。
次のコマンドを実行して、ALBインスタンスのIPアドレスを照会します。
kubectl get ing
期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE canary-header-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m23s canary-weight-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m16s tea-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 7m5s
次のコマンドを複数回実行して、
location: hz
ヘッダーをサービスに送信するリクエストを送信します。curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com
期待される出力:
new
location: hz
ヘッダーを持つリクエストに対してnew
が返されます。location: hz
ヘッダーを持つリクエストは、新しいサービスバージョンにルーティングされます。次のコマンドを複数回実行して、ヘッダーを含まないリクエストをサービスに送信します。
curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com
new
はヘッダーを持たないリクエストの50% に対して返され、old
はリクエストの残りの50% に対して返されます。 ヘッダーを持たないリクエストの50% は、新しいサービスバージョンにルーティングされます。次のコマンドを複数回実行して、
location: bj
ヘッダーを含むリクエストをサービスに送信します。curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com
new
は、location: bj
ヘッダを搬送する要求の50% に対して返され、old
は、要求の残りの50% に対して返される。location: bj
ヘッダーを運ぶ要求の50% は、新しいサービスバージョンにルーティングされます。
location: hz
ヘッダーを持つすべてのリクエストは、canaryという名前の新しいサービスバージョンにルーティングされます。 他のヘッダーを運び、ヘッダーを運ばない50% のリクエストのみが、新しいサービスバージョンにルーティングされます。 カナリアのリリースは成功しました。
ステップ3: 古いサービスバージョンを廃止する
新しいサービスバージョンが一定期間、期待どおりに実行されたら、古いサービスバージョンを廃止し、新しいサービスバージョンのみを保持する必要があります。 これを行うには、古いサービスバージョンのIngressのサービスを新しいサービスバージョンに変更して、Ingressが新しいサービスバージョンにトラフィックをルーティングできるようにする必要があります。 次に、カナリアIngressを削除します。
次のコマンドを実行して、tea-ingress.yamlファイルを変更します。
vim tea-ingress.yaml
次のコマンドを実行して、tea-ingress.yamlファイルのサービスをtea-svcからcanary-svcに変更します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. http: paths: - path: / pathType: Prefix backend: service: name: canary-svc # Change tea-svc to canary-svc. port: number: 80
変更されたIngressを有効にするには、次のコマンドを実行します。
kubectl apply -f tea-ingress.yaml
古いサービスバージョンが廃止されているかどうかを確認します。
次のコマンドを複数回実行して、
location: hz
ヘッダーをサービスに送信するリクエストを送信します。curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com
期待される出力:
new
location: hz
ヘッダーを持つリクエストに対してnew
が返されます。location: hz
ヘッダーを持つリクエストは、新しいサービスバージョンにルーティングされます。次のコマンドを複数回実行して、ヘッダーを含まないリクエストをサービスに送信します。
curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com
期待される出力:
new
ヘッダーを持たないリクエストに対しては、
new
が返されます。 ヘッダーを持たないリクエストは、新しいサービスバージョンにルーティングされます。次のコマンドを複数回実行して、
location: bj
ヘッダーを含むリクエストをサービスに送信します。curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com
期待される出力:
new
location: bj
ヘッダーを持つリクエストに対して、new
が返されます。location: bj
ヘッダーを持つリクエストは、新しいサービスバージョンにルーティングされます。
location: hz
ヘッダーを運ぶリクエスト、他のヘッダーを運ぶリクエスト、およびヘッダーを運ばないリクエストはすべて、新しいサービスバージョンにルーティングされます。 古いサービスバージョンは非推奨です。次のコマンドを実行して、canary-weight-ingressおよびcanary-header-ingressという名前のcanary ingressを削除します。
kubectl delete ing canary-weight-ingress canary-header-ingress