kubernetes基于nginx-ingress进行蓝绿部署/金丝雀发布
测试结果汇总分析:
1、正式/灰度各一个pod ,canary权重设置 30%
发送500个请求 ,canary占147个
发送1000个请求,canary占293个
2、正式pod1个/canary 2个 ,canary权重占比 30%
发送500个请求,canary占71+72=143个
发送1000个请求,canary占139 + 138 = 277个
[root@master1 test]# cat xc-test-ingress.yaml
# source: kubernetes/templates/ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ops-sre-ngconf2
namespace: yidian-prod
annotations:
kubernetes.io/ingress.class: ingress-nginx1
nginx.ingress.kubernetes.io/configuration-snippet: |
add_header Cache-Control no-cache;
access_log /var/log/nginx/test.int.test.com.access.log upstreaminfo;
error_log /var/log/nginx/test.int.test.com.error.log;
spec:
rules:
- host: "test.int.test.com"
http:
paths:
- path: /
backend:
serviceName: ops-sre-ngconf2
servicePort: 80
[root@master1 test]# cat xc-test-canary-ingress.yaml
# source: kubernetes/templates/ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ops-sre-ngconf2-canary
namespace: yidian-prod
annotations:
kubernetes.io/ingress.class: ingress-nginx1
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
nginx.ingress.kubernetes.io/configuration-snippet: |
access_log /var/log/nginx/test.int.test.com.access.log upstreaminfo;
error_log /var/log/nginx/test.int.test.com.error.log;
spec:
rules:
- host: "test.int.test.com"
http:
paths:
- path: /
backend:
serviceName: ops-sre-ngconf2-canary
servicePort: 80
----------------------------------
3、要求:所有带有“version:canary”请求头的请求,都打到灰度的pod上面
实现逻辑:
- 在ingress的配置文件中添加配置
nginx.ingress.kubernetes.io/canary-by-header: "version" nginx.ingress.kubernetes.io/canary-by-header-value: "canary"
- 测试的ingress配置文件
[root@master1 test]# cat xc-test-canary-ingress.yaml # source: kubernetes/templates/ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ops-sre-ngconf2-canary namespace: yidian-prod annotations: kubernetes.io/ingress.class: ingress-nginx1 nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "version" nginx.ingress.kubernetes.io/canary-by-header-value: "canary" nginx.ingress.kubernetes.io/canary-weight: "30" nginx.ingress.kubernetes.io/configuration-snippet: | access_log /var/log/nginx/test.int.test.com.access.log upstreaminfo; error_log /var/log/nginx/test.int.test.com.error.log; spec: rules: - host: "test.int.test.com" http: paths: - path: / backend: serviceName: ops-sre-ngconf2-canary servicePort: 80
3、测试命令及结果
命令:curl -H "version:canary" test.int.test.com/index.html
结果:压测500次,所有请求都打到了灰度的pod上面
4、要求:对请求头的内容进行正则匹配
实现逻辑:
- 在ingress的配置文件中添加配置
nginx.ingress.kubernetes.io/canary-by-header-pattern: "canary*" ⚠️:当使用正则进行配置时,一定要将canary-by-header-value去掉,否则正则匹配将被忽略
- 测试的ingress配置文件
[root@master1 test]# cat xc-test-canary-ingress.yaml # source: kubernetes/templates/ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ops-sre-ngconf2-canary namespace: yidian-prod annotations: kubernetes.io/ingress.class: ingress-nginx1 nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "version" #nginx.ingress.kubernetes.io/canary-by-header-value: "canary" nginx.ingress.kubernetes.io/canary-by-header-pattern: "canary*" nginx.ingress.kubernetes.io/canary-weight: "30" nginx.ingress.kubernetes.io/configuration-snippet: | access_log /var/log/nginx/test.int.test.com.access.log upstreaminfo; error_log /var/log/nginx/test.int.test.com.error.log; spec: rules: - host: "test.int.test.com" http: paths: - path: / backend: serviceName: ops-sre-ngconf2-canary servicePort: 80
- 测试命令及结果
命令:for i in `seq 100`;do curl -H "version:canary123123" test.int.test.com/index.html ;done
结果:压测500次,所有请求都打到了灰度的pod上面