アリババの最も火の技術:k 8 sはIngress-nginxに基づいて階調の発表を実現します
5495 ワード
前言
Ingress-NginxはK 8 S ingressツールで、異なるシーンでの階調パブリケーションとテストを実現するためにIngress Annotationsの構成をサポートしています.Nginx Annotationsでは、次のいくつかのCanaryルールがサポートされています.
Nginx ingress annotations
古いバージョンとcanaryバージョンの2つのバージョンのサービスを導入したとします.
古いバージョンとcanaryバージョンの2つのバージョンのサービスを導入したとします.
導入サービス
ここで私たちのサービスのdeploymentは展示されていません.サービスの構成は以下の通りです.#
apiVersion: v1
kind: Service
metadata:
name: hello-service
labels:
app: hello-service
spec:
ports:
- port: 80
protocol: TCP
selector:
app: hello-service
# canary
apiVersion: v1
kind: Service
metadata:
name: canary-hello-service
labels:
app: canary-hello-service
spec:
ports:
- port: 80
protocol: TCP
selector:
app: canary-hello-service
ウェイトによる転送
ingressの構成は次のとおりです.apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: canary
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
rules:
- host: canary-service.abc.com
http:
paths:
- backend:
serviceName: canary-hello-service
servicePort: 80
テスト結果は次のとおりです.$ for i in $(seq 1 10); do curl http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version2
hello world-version2
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
リクエストヘッダによる転送
annotation構成は以下の通り(ingress残りは省略)annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
テスト結果は次のとおりです.$ for i in $(seq 1 5); do curl http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
特定のリクエストヘッダと値に基づいて転送
annotationの構成は次のとおりです. kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
テスト結果は次のとおりです.$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:abc' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
クッキーによる転送
cookieを使用してトラフィック管理を行うシーンは、ユーザのリクエストcookieに特殊なラベルが含まれているなど、A/B testに適しており、この部分のユーザのリクエストを特定のサービスに転送して処理することができる.annotationの構成は次のとおりです. kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "like_music"
テスト結果は次のとおりです.$ for i in $(seq 1 5); do curl -b 'like_music=1' http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -b 'like_music=always' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
3つのannotationは次の順序で一致します.
canary-by-header > canary-by-cookie > canary-weight
まとめ
以上のテスト結果から,トラフィックの転送は以下の2つに分類できる.
1.重みによる nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
70%
|------>
users --- 100% ---> Nginx Ingress ----| 30%
|------> canary
2.ユーザー別nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
others
|----------->
users ------> Nginx Ingress ------| "test:abc"
|-----------> canary
#
apiVersion: v1
kind: Service
metadata:
name: hello-service
labels:
app: hello-service
spec:
ports:
- port: 80
protocol: TCP
selector:
app: hello-service
# canary
apiVersion: v1
kind: Service
metadata:
name: canary-hello-service
labels:
app: canary-hello-service
spec:
ports:
- port: 80
protocol: TCP
selector:
app: canary-hello-service
ingressの構成は次のとおりです.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: canary
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
rules:
- host: canary-service.abc.com
http:
paths:
- backend:
serviceName: canary-hello-service
servicePort: 80
テスト結果は次のとおりです.
$ for i in $(seq 1 10); do curl http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version2
hello world-version2
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
リクエストヘッダによる転送
annotation構成は以下の通り(ingress残りは省略)annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
テスト結果は次のとおりです.$ for i in $(seq 1 5); do curl http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
特定のリクエストヘッダと値に基づいて転送
annotationの構成は次のとおりです. kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
テスト結果は次のとおりです.$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:abc' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
クッキーによる転送
cookieを使用してトラフィック管理を行うシーンは、ユーザのリクエストcookieに特殊なラベルが含まれているなど、A/B testに適しており、この部分のユーザのリクエストを特定のサービスに転送して処理することができる.annotationの構成は次のとおりです. kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "like_music"
テスト結果は次のとおりです.$ for i in $(seq 1 5); do curl -b 'like_music=1' http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -b 'like_music=always' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
3つのannotationは次の順序で一致します.
canary-by-header > canary-by-cookie > canary-weight
まとめ
以上のテスト結果から,トラフィックの転送は以下の2つに分類できる.
1.重みによる nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
70%
|------>
users --- 100% ---> Nginx Ingress ----| 30%
|------> canary
2.ユーザー別nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
others
|----------->
users ------> Nginx Ingress ------| "test:abc"
|-----------> canary
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
$ for i in $(seq 1 5); do curl http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
annotationの構成は次のとおりです.
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
テスト結果は次のとおりです.
$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:abc' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
クッキーによる転送
cookieを使用してトラフィック管理を行うシーンは、ユーザのリクエストcookieに特殊なラベルが含まれているなど、A/B testに適しており、この部分のユーザのリクエストを特定のサービスに転送して処理することができる.annotationの構成は次のとおりです. kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "like_music"
テスト結果は次のとおりです.$ for i in $(seq 1 5); do curl -b 'like_music=1' http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -b 'like_music=always' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
3つのannotationは次の順序で一致します.
canary-by-header > canary-by-cookie > canary-weight
まとめ
以上のテスト結果から,トラフィックの転送は以下の2つに分類できる.
1.重みによる nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
70%
|------>
users --- 100% ---> Nginx Ingress ----| 30%
|------> canary
2.ユーザー別nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
others
|----------->
users ------> Nginx Ingress ------| "test:abc"
|-----------> canary
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "like_music"
$ for i in $(seq 1 5); do curl -b 'like_music=1' http://canary-service.abc.com; echo '
'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -b 'like_music=always' http://canary-service.abc.com; echo '
'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
以上のテスト結果から,トラフィックの転送は以下の2つに分類できる.
1.重みによる
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
70%
|------>
users --- 100% ---> Nginx Ingress ----| 30%
|------> canary
2.ユーザー別
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
others
|----------->
users ------> Nginx Ingress ------| "test:abc"
|-----------> canary