Kubernetes 基于Ingress Nginx 进行灰度发布【2024-02-02测试成功】

基于Ingress Nginx 的 Canary 规则

#解释1
Ingress Nginx Annotations文于的Canary规则
    #nginx.ingress.kubernetes.io/canary-by-header: 基于该Annotation中指定Request Header进行流量切分,适用于灰度发布以及A/B测试
        在请求报文中,若存在该Hleader且其值为always时,请求将会被发送到Canary版本
        若存在该Header且其值为never时,请求将不会被发送至Canary版本
        对于任何其它值,将忽略该Annotation指定的Headder,并通过优先级将请求与其他金丝雀规则进行优先级的比较

    #nginx.ingress.kubernetes,io/canary-by-header-value:基于该Annotation中指定的Request Header的值进行流量切分,标头名称则由前一个Annotation (nginx.ingress.kubernetes.io/canary-by-header) 进行指定
        请求报文中存在指定的标头,且其值与该Annotation的信匹配时,它将被路由到Canary版本
        对于任何其它值,将忽略该Annotation
    
    #nginx.ingress.kubernetes.io/canary-by-header-pattern
        同canary-by-header-value的功能类似,但该Annotation其于正则表达式匹配Request Header的值
        若该Annotation与canary-by-header-value同时存在,则该Annotation会被忽略
       
    #nginx.ingress.kubernetes.io/canary-weight: 基于服务权重进行流量切分,适用于绿部署,权重范围0-100按百分比将请求路由到Canary Ingress中指定的服务
        权重为0 意味着该金丝雀规则不会向Canary入口的服务发送任何请求
        权重为100意味着所有请求都将被发送到 Canary入口
    
    #nginx.ingress.kubernetes.io/canary-by-cookie: 基于 cookie 的流量切分,适用于灰度发布与 A/B 测试
        cookie的值设置为alwavs时,它将被路山到Canarv入口
        cookie的值设置为never时,请求不会被发送到Canary入口
        对于任何其他值,将忽略 cookie 并将请求与其他金丝雀规则进行优先级的比较

规则的应用次序
    #Canary规则会按特定的次序进行评估
        canary-by-header -> canary-by-cookie-> canary-weight

实战

示例: 
    Production: deployment-v10, demoapp:v1.0, service-v10
    Canary:     deployment-v11, demoapp:v1.1, service-v11

1、部署v1.0版本应用

[root@ca-k8s-master01 Simple_fanout]# vim deploy-demoapp-v1_0.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: demoapp
  name: demoapp-v10
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demoapp
      version: v1.0
  strategy: {}
  template:
    metadata:
      labels:
        app: demoapp
        version: v1.0
    spec:
      containers:
      - image: ikubernetes/demoapp:v1.0
        name: demoapp
        resources: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demoapp
  name: demoapp-v10
spec:
  ports:
  - name: http-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: demoapp
    version: v1.0
  type: ClusterIP
  
[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f deploy-demoapp-v1_0.yaml
deployment.apps/demoapp-v10 created
service/demoapp-v10 created

[root@ca-k8s-master01 Simple_fanout]# kubectl get pods
NAME                                                    READY   STATUS        RESTARTS          AGE
demoapp-v10-758f9b94f-26jnn                             1/1     Running       0                 21s
demoapp-v10-758f9b94f-fvqzm                             1/1     Running       0                 21s
demoapp-v10-758f9b94f-ndn55                             1/1     Running       0                 21s

2、正常通过Ingress发布资源

[root@ca-k8s-master01 Simple_fanout]# vim 01-ingress-demoapp.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demoapp
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: demoapp.sheca.com
    http:
      paths:
      - backend:
          service:
            name: demoapp-v10
            port:
              number: 80
        path: /
        pathType: Prefix

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 01-ingress-demoapp.yaml
ingress.networking.k8s.io/demoapp created

#这里的ADDRESS IP是通过MetaILB部署 分配的 Load Balance地址
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME                CLASS    HOSTS               ADDRESS         PORTS     AGE
demoapp             <none>   demoapp.sheca.com   192.168.40.53   80        2m20s

#windows配置域名解析
192.168.40.53 demoapp.sheca.com
#windows通过浏览器访问 demoapp.sheca.com

#Linux编辑hosts文件 192.168.40.53 demoapp.sheca.com
[root@ca-k8s-master01 Simple_fanout]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.40.120 ca-k8s-master01
192.168.40.121 ca-k8s-node01
192.168.40.122 ca-k8s-node02
192.168.40.190 event.sheca.com argocd.magedu.com
192.168.40.104 harbor.sheca.com
192.168.40.53 demoapp.sheca.com

#Linux客户端访问
[root@ca-k8s-master01 Simple_fanout]# while true; do curl demoapp.sheca.com; sleep .8;done
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!

3、此时需要发布新版本、部署v1.1版本应用

[root@ca-k8s-master01 Simple_fanout]# vim deploy-demoapp-v1_1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: demoapp
  name: demoapp-v11
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demoapp
      version: v1.1
  strategy: {}
  template:
    metadata:
      labels:
        app: demoapp
        version: v1.1
    spec:
      containers:
      - image: ikubernetes/demoapp:v1.1
        name: demoapp
        resources: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demoapp
  name: demoapp-v11
spec:
  ports:
  - name: http-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: demoapp
    version: v1.1
  type: ClusterIP

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f deploy-demoapp-v1_1.yaml

[root@ca-k8s-master01 Simple_fanout]# kubectl get pods | grep demoapp
demoapp-v10-758f9b94f-26jnn                             1/1     Running            0                 10m
demoapp-v10-758f9b94f-fvqzm                             1/1     Running            0                 10m
demoapp-v10-758f9b94f-ndn55                             1/1     Running            0                 10m
demoapp-v11-59cfdb6cf9-5fdld                            1/1     Running            0                 71s
demoapp-v11-59cfdb6cf9-g28kq                            1/1     Running            0                 71s

 4、配置canary策略:canary-by-header 默认值:always

#    nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
#    表示 Header 请求X-Canary=always 请求到 demoapp-v11 其他都是demoapp-v10

[root@ca-k8s-master01 Simple_fanout]# vim 02-canary-by-header.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
  name: demoapp-canary-by-header
spec:
  rules:
  - host: demoapp.sheca.com
    http:
      paths:
      - backend:
          service:
            name: demoapp-v11
            port:
              number: 80
        path: /
        pathType: Prefix

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 02-canary-by-header.yaml
ingress.networking.k8s.io/demoapp-canary-by-header created

#测试结果curl -H "X-Canary: always" demoapp.sheca.com 都到了 demoapp v1.1 版本上 
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary: always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!

[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-header
Name:             demoapp-canary-by-header
Labels:           <none>
Namespace:        default
Address:
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host               Path  Backends
  ----               ----  --------
  demoapp.sheca.com
                     /   demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations:         kubernetes.io/ingress.class: nginx
                     nginx.ingress.kubernetes.io/canary: true
                     nginx.ingress.kubernetes.io/canary-by-header: X-Canary
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  Sync    29s   nginx-ingress-controller  Scheduled for sync

[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME                       CLASS    HOSTS               ADDRESS         PORTS   AGE
demoapp                    <none>   demoapp.sheca.com   192.168.40.53   80      12m
demoapp-canary-by-header   <none>   demoapp.sheca.com   192.168.40.53   80      43s

 5、配置canary策略:canary-by-header-value 指定确认值

#    nginx.ingress.kubernetes.io/canary-by-header: "IsVIP"
#    nginx.ingress.kubernetes.io/canary-by-header-value: "false"
#    表示 Header IsVIP=false 转给 demoapp-v11 其他转给 demoapp-v10
[root@ca-k8s-master01 Simple_fanout]# vim 03-canary-by-header-value.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "IsVIP"
    nginx.ingress.kubernetes.io/canary-by-header-value: "false"
  name: demoapp-canary-by-header-value
spec:
  rules:
  - host: demoapp.sheca.com
    http:
      paths:
      - backend:
          service:
            name: demoapp-v11
            port: 
              number: 80
        path: /
        pathType: Prefix

#删除之前的
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 02-canary-by-header.yaml
ingress.networking.k8s.io "demoapp-canary-by-header" deleted

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 03-canary-by-header-value.yaml
ingress.networking.k8s.io/demoapp-canary-by-header-value created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-header-value
Name:             demoapp-canary-by-header-value
Labels:           <none>
Namespace:        default
Address:
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host               Path  Backends
  ----               ----  --------
  demoapp.sheca.com
                     /   demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations:         kubernetes.io/ingress.class: nginx
                     nginx.ingress.kubernetes.io/canary: true
                     nginx.ingress.kubernetes.io/canary-by-header: IsVIP
                     nginx.ingress.kubernetes.io/canary-by-header-value: false
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  Sync    16s   nginx-ingress-controller  Scheduled for sync

#测试"IsVIP: false" 转到 v1.1
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: false" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: false" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
#"IsVIP: true" 或者 其他值都是 v1.0
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: true" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
[root@ca-k8s-master01 Simple_fanout]# curl -H "IsVIP: xxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
[root@ca-k8s-master01 Simple_fanout]# curl -H "xxxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!

6、配置canary策略:canary-by-header-pattern 通配符值

#    nginx.ingress.kubernetes.io/canary: "true"
#    nginx.ingress.kubernetes.io/canary-by-header: "Username"
#    nginx.ingress.kubernetes.io/canary-by-header-pattern: "(vip|VIP)_.*"
#    表示  Header 访问 Username=vip_通配 或者    Username=VIP_通配 访问 demoapp-v11 其他访问 demoapp-v10

[root@ca-k8s-master01 Simple_fanout]# vim 04-canary-by-header-pattern.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "Username"
    nginx.ingress.kubernetes.io/canary-by-header-pattern: "(vip|VIP)_.*"
  name: demoapp-canary-by-header-pattern
spec:
  rules:
  - host: demoapp.sheca.com
    http:
      paths:
      - backend:
          service:
            name: demoapp-v11
            port:
              number: 80
        path: /
        pathType: Prefix

#删除之前的Ingress配置
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 03-canary-by-header-value.yaml
ingress.networking.k8s.io "demoapp-canary-by-header-value" deleted

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 04-canary-by-header-pattern.yaml
ingress.networking.k8s.io/demoapp-canary-by-header-pattern created

[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-header-pattern
Name:             demoapp-canary-by-header-pattern
Labels:           <none>
Namespace:        default
Address:
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host               Path  Backends
  ----               ----  --------
  demoapp.sheca.com
                     /   demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations:         kubernetes.io/ingress.class: nginx
                     nginx.ingress.kubernetes.io/canary: true
                     nginx.ingress.kubernetes.io/canary-by-header: Username
                     nginx.ingress.kubernetes.io/canary-by-header-pattern: (vip|VIP)_.*
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  Sync    10s   nginx-ingress-controller  Scheduled for sync

[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME                               CLASS    HOSTS               ADDRESS         PORTS   AGE
demoapp                            <none>   demoapp.sheca.com   192.168.40.53   80      26m
demoapp-canary-by-header-pattern   <none>   demoapp.sheca.com   192.168.40.53   80      79s

#测试"Username: VIP_abc" "Username: vip_abc" 转到 v1.1 其他访问到 v1.0
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: VIP_abc"  demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: vip_abc"  demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: vip_wwww"  demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: VIP_xks"  demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: VIp_xks"  demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
[root@ca-k8s-master01 Simple_fanout]# curl -H "Username: vIP_hy"  demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!

7、配置canary策略:canary-weight 流量权重

#    nginx.ingress.kubernetes.io/canary: "true"
#    nginx.ingress.kubernetes.io/canary-weight: "40"
#    表示权重进行流量策略

[root@ca-k8s-master01 Simple_fanout]# vim 05-canary-by-weight.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "40"
  name: demoapp-canary-by-weight
spec:
  rules:
  - host: demoapp.sheca.com
    http:
      paths:
      - backend:
          service:
            name: demoapp-v11
            port:
              number: 80
        path: /
        pathType: Prefix

#删除之前Ingress
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 04-canary-by-header-pattern.yaml
ingress.networking.k8s.io "demoapp-canary-by-header-pattern" deleted

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 05-canary-by-weight.yaml
ingress.networking.k8s.io/demoapp-canary-by-weight created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-weight
Name:             demoapp-canary-by-weight
Labels:           <none>
Namespace:        default
Address:
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host               Path  Backends
  ----               ----  --------
  demoapp.sheca.com
                     /   demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations:         kubernetes.io/ingress.class: nginx
                     nginx.ingress.kubernetes.io/canary: true
                     nginx.ingress.kubernetes.io/canary-weight: 40
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  Sync    11s   nginx-ingress-controller  Scheduled for sync
  
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME                       CLASS    HOSTS               ADDRESS         PORTS   AGE
demoapp                    <none>   demoapp.sheca.com   192.168.40.53   80      38m
demoapp-canary-by-weight   <none>   demoapp.sheca.com   192.168.40.53   80      30s

#测试 分配40%流量到了 v1.1
[root@ca-k8s-master01 Simple_fanout]# while true; do curl demoapp.sheca.com; sleep .8;done
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!

 8、配置canary策略:canary-by-cookie

#nginx.ingress.kubernetes.io/canary: "true"
#nginx.ingress.kubernetes.io/canary-by-cookie: "vip_user"
#表示 通过cookie "vip_user"=always 转发到 demoapp-v11 其他转发到 demoapp-v10

[root@ca-k8s-master01 Simple_fanout]# vim 06-canary-by-cookie.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "vip_user"
  name: demoapp-canary-by-cookie
spec:
  rules:
  - host: demoapp.sheca.com
    http:
      paths:
      - backend:
          service:
            name: demoapp-v11
            port:
              number: 80
        path: /
        pathType: Prefix

#删除之前的Ingress
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 05-canary-by-weight.yaml
ingress.networking.k8s.io "demoapp-canary-by-weight" deleted

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 06-canary-by-cookie.yaml
ingress.networking.k8s.io/demoapp-canary-by-cookie created
[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-cookie
Name:             demoapp-canary-by-cookie
Labels:           <none>
Namespace:        default
Address:
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host               Path  Backends
  ----               ----  --------
  demoapp.sheca.com
                     /   demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations:         kubernetes.io/ingress.class: nginx
                     nginx.ingress.kubernetes.io/canary: true
                     nginx.ingress.kubernetes.io/canary-by-cookie: vip_user
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  Sync    15s   nginx-ingress-controller  Scheduled for sync
  
[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME                       CLASS    HOSTS               ADDRESS         PORTS   AGE
demoapp                    <none>   demoapp.sheca.com   192.168.40.53   80      44m
demoapp-canary-by-cookie   <none>   demoapp.sheca.com   192.168.40.53   80      61s

#测试  "vip_user=always" 转发到 v1.1 其他都是 v1.0
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip=never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!

 9、配置canary策略:组合使用

[root@ca-k8s-master01 Simple_fanout]# vim 07-canary-by-cookie-header-weight.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "vip_user"
    nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
    nginx.ingress.kubernetes.io/canary-weight: "70"
  name: demoapp-canary-by-cookie-header-weight
spec:
  rules:
  - host: demoapp.sheca.com
    http:
      paths:
      - backend:
          service:
            name: demoapp-v11
            port:
              number: 80
        path: /
        pathType: Prefix

#删除之前Ingress
[root@ca-k8s-master01 Simple_fanout]# kubectl delete -f 06-canary-by-cookie.yaml

[root@ca-k8s-master01 Simple_fanout]# kubectl apply -f 07-canary-by-cookie-header-weight.yaml
ingress.networking.k8s.io/demoapp-canary-by-cookie-header-weight created

[root@ca-k8s-master01 Simple_fanout]# kubectl describe ingress demoapp-canary-by-cookie-header-weight
Name:             demoapp-canary-by-cookie-header-weight
Labels:           <none>
Namespace:        default
Address:
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host               Path  Backends
  ----               ----  --------
  demoapp.sheca.com
                     /   demoapp-v11:80 (10.244.132.230:80,10.244.36.59:80)
Annotations:         kubernetes.io/ingress.class: nginx
                     nginx.ingress.kubernetes.io/canary: true
                     nginx.ingress.kubernetes.io/canary-by-cookie: vip_user
                     nginx.ingress.kubernetes.io/canary-by-header: X-Canary
                     nginx.ingress.kubernetes.io/canary-by-weight: 70
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  Sync    13s   nginx-ingress-controller  Scheduled for sync

[root@ca-k8s-master01 Simple_fanout]# kubectl get ingress
NAME                                     CLASS    HOSTS               ADDRESS         PORTS   AGE
demoapp                                  <none>   demoapp.sheca.com   192.168.40.53   80      54m
demoapp-canary-by-cookie-header-weight   <none>   demoapp.sheca.com   192.168.40.53   80      41s

#测试1 正常访问70% v1.1 其他 v1.0上
[root@ca-k8s-master01 Simple_fanout]#  while true; do curl demoapp.sheca.com; sleep .8;done
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!

#测试2 "vip_user=always"转给 v1.1 "vip_user=never" 转给1.0 
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!
# 其他值根据负载策略随机转发 "vip_user=xxx"  "vip_user=xks" 
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
[root@ca-k8s-master01 Simple_fanout]# curl -b "vip_user=xxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-fvqzm, ServerIP: 10.244.132.239!


#测试3 "X-Canary:  always" 转发v1.1 "X-Canary:  never"转发v1.0 
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary:  always" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary:  never" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-ndn55, ServerIP: 10.244.36.63!
#"X-Canary:  xxxx" 其他值根据负载策略随机转发
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary:  xxxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary:  xxxx" demoapp.sheca.com
iKubernetes demoapp v1.0 !! ClientIP: 10.244.132.248, ServerName: demoapp-v10-758f9b94f-26jnn, ServerIP: 10.244.132.193!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary:  xxxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-g28kq, ServerIP: 10.244.36.59!
[root@ca-k8s-master01 Simple_fanout]# curl -H "X-Canary:  xxxx" demoapp.sheca.com
iKubernetes demoapp v1.1 !! ClientIP: 10.244.132.248, ServerName: demoapp-v11-59cfdb6cf9-5fdld, ServerIP: 10.244.132.230!

 

posted @ 2024-02-02 01:09  しみずよしだ  阅读(66)  评论(0)    收藏  举报