K8S Nginx Ingress реализует канареечную версию

Канарскую публикацию можно реализовать, указав аннотацию, поддерживаемую Nginx Ingress, для ресурса Ingress.

Для сервиса необходимо создать два Ingress, один из которых — обычный Ingress , а другой —  nginx.ingress.kubernetes.io/canary: "true" Ingress с фиксированной аннотацией, называемый Canary Ingress.

Canary Ingress обычно представляет собой новую версию сервиса, и выпуски canary в различных сценариях могут быть реализованы путем настройки вместе с аннотациями стратегий сегментации трафика.

Ниже приводится подробное введение в соответствующие аннотации:

  • nginx.ingress.kubernetes.io/canary-by-header
    Указывает, что если указанное имя заголовка включено в заголовок запроса и значение равно  always, запрос будет перенаправлен в соответствующую серверную службу, определенную Ingress. Если значение  never не пересылается, его можно использовать для отката к старой версии. Если это любое другое значение, аннотация игнорируется.

  • nginx.ingress.kubernetes.io/canary-by-header-value
    Аннотация может использоваться  canary-by-header в качестве дополнения, а заголовок запроса может быть указан как пользовательское значение, включая, помимо прочего,  always или  never. Если значение заголовка запроса соответствует указанному настраиваемому значению, запрос будет перенаправлен в соответствующую серверную службу, определенную Ingress. Если это любое другое значение, аннотация будет игнорироваться.

  • nginx.ingress.kubernetes.io/canary-by-header-pattern
    Как и  canary-by-header-value в случае с , разница состоит в том, что в аннотации используются регулярные выражения для сопоставления значения заголовка запроса, а не просто для фиксации определенного значения. Если аннотация  canary-by-header-value существует одновременно, она будет игнорироваться.

  • nginx.ingress.kubernetes.io/canary-by-cookie
    Подобно  canary-by-header , эта аннотация используется для файлов cookie, поддерживает только  always и  never.

  • nginx.ingress.kubernetes.io/canary-weight
    Указывает процент трафика, выделенного Canary Ingress, диапазон значений: [0–100]. Например, если для него установлено значение 10, это означает, что 10 % трафика будет выделено внутренней службе, соответствующей Canary Ingress.

  • Правила Canary сортируются по приоритету следующим образом: canary-по заголовку -> canary-by-cookie -> canary-weight.

В зависимости от различных сценариев существует четыре типа выпусков в оттенках серого:

//第一种,所有的请求都会被转发到灰度(Canary)版本
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "always"
 
//第二种,所有的请求都不会被转发到灰度(Canary)版本
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "never"
 
//第三种,如果请求的header头包含"user-id: user_1",该请求会被转发到灰度(Canary)版本
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "user_id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "user_1"
 
//第四种,如果请求的header头包含"user-id: user_2"或"user-id: user-3"或"user-id: user4",该请求会被转发到灰度(Canary)版
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "user_id"    #在networking.k8s.io/v1中,canary-by-header的值尽量不用使用下划线“_”。如果使用了,请求头中要使用中横线“-”代替。
    nginx.ingress.kubernetes.io/canary-by-header-pattern: "user_2|user-3|user4"

1. Разверните службу версий синей среды.

1、Карта конфигурации

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-blue-config
data:
  nginx.conf: |-
    worker_processes  1;

    events {
        accept_mutex on;
        multi_accept on;
        use epoll;
        worker_connections  1024;
    }

    http {
        ignore_invalid_headers off;
        server {
            listen 80;
            location / {
                access_by_lua '
                    local header_str = ngx.say("blue")
                ';
            }
        }
    }

2、Развертывание

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-blue
  labels:
    dce.daocloud.io/app: nginx-blue
  annotations:
    dce.daocloud.io/last-replicas: '1'
    deployment.kubernetes.io/revision: '3'
    kubernetes.io/change-cause: update YAML
spec:
  replicas: 1
  selector:
    matchLabels:
      dce.daocloud.io/component: nginx-blue
  template:
    metadata:
      name: nginx-blue
      labels:
        dce.daocloud.io/app: nginx-blue
        dce.daocloud.io/component: nginx-blue
      annotations:
        dce.daocloud.io/parcel.egress.burst: '0'
        dce.daocloud.io/parcel.egress.rate: '0'
        dce.daocloud.io/parcel.ingress.burst: '0'
        dce.daocloud.io/parcel.ingress.rate: '0'
        dce.daocloud.io/parcel.net.type: calico
    spec:
      volumes:
        - name: nginx-blue-config
          configMap:
            name: nginx-blue-config
            defaultMode: 420
      containers:
        - name: nginx-blue
          image: 'x.x.x.x/library/openresty:1.19.9.1-sw-r4'
          resources:
            limits:
              cpu: 500m
              memory: '314572800'
            requests:
              cpu: 200m
              memory: '314572800'
          volumeMounts:
            - name: nginx-blue-config
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf

3、Сервис

kind: Service
apiVersion: v1
metadata:
  name: nginx-blue-default
  labels:
    dce.daocloud.io/app: nginx-blue
  annotations:
    io.daocloud.dce.serviceSelectorType: service
spec:
  ports:
    - name: nginx-nginx-default-80680-80
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 31046
  selector:
    dce.daocloud.io/component: nginx-blue
  clusterIP: 172.31.69.137
  type: NodePort
  sessionAffinity: None
  externalTrafficPolicy: Cluster

4. Измените содержимое модуля.

cd /usr/local/openresty/nginx/html/

ls
50x.html  index.html

echo "Hello Blue" > index.html

cat index.html 
Hello Blue

2. Разверните службу версий зеленой среды.

1、Карта конфигурации

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-green-config
data:
  nginx.conf: |-
    worker_processes  1;

    events {
        accept_mutex on;
        multi_accept on;
        use epoll;
        worker_connections  1024;
    }

    http {
        ignore_invalid_headers off;
        server {
            listen 80;
            location / {
                access_by_lua '
                    local header_str = ngx.say("green")
                ';
            }
        }
    }

2、Развертывание

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-green
  labels:
    dce.daocloud.io/app: nginx-green
  annotations:
    deployment.kubernetes.io/revision: '5'
    kubernetes.io/change-cause: update YAML
spec:
  replicas: 1
  selector:
    matchLabels:
      dce.daocloud.io/component: nginx-green
  template:
    metadata:
      name: nginx-green
      labels:
        dce.daocloud.io/app: nginx-green
        dce.daocloud.io/component: nginx-green
        env: green
      annotations:
        dce.daocloud.io/parcel.egress.burst: '0'
        dce.daocloud.io/parcel.egress.rate: '0'
        dce.daocloud.io/parcel.ingress.burst: '0'
        dce.daocloud.io/parcel.ingress.rate: '0'
        dce.daocloud.io/parcel.net.type: calico
        dce.daocloud.io/parcel.net.value: default-ipv4-ippool
    spec:
      volumes:
        - name: nginx-green-config
          configMap:
            name: nginx-green-config
            defaultMode: 420
      containers:
        - name: nginx-green
          image: 'x.x.x.x/library/openresty:1.19.9.1-sw-r4'
          resources:
            limits:
              cpu: 500m
              memory: '314572800'
            requests:
              cpu: 200m
              memory: '314572800'
          volumeMounts:
            - name: nginx-green-config
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf

3、Сервис

kind: Service
apiVersion: v1
metadata:
  name: nginx-green-default
  labels:
    dce.daocloud.io/app: nginx-green
  annotations:
    io.daocloud.dce.serviceSelectorType: service
spec:
  ports:
    - name: nginx-nginx-default-15833-80
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 35218
  selector:
    dce.daocloud.io/component: nginx-green
  clusterIP: 172.31.207.22
  type: NodePort
  sessionAffinity: None
  externalTrafficPolicy: Cluster

 4. Измените содержимое модуля.

cd /usr/local/openresty/nginx/html/

ls
50x.html  index.html

echo "Hello Green" > index.html

cat index.html 
Hello Green

3. Установите вход

1. Вход в синюю среду

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: nginx-blue-ingress
  labels:
    dce.daocloud.io/app: nginx-blue
  annotations:
    nginx.ingress.kubernetes.io/use-port-in-redirects: 'true'
spec:
  rules:
    - host: nginx.ms-sit.xxxxxx.net
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              serviceName: nginx-blue-default
              servicePort: 80

2. Зеленая среда Проникновение

Дело 1:

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: nginx-green-ingress
  labels:
    dce.daocloud.io/app: nginx-green
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: 'true'
    nginx.ingress.kubernetes.io/canary-by-header: env
    nginx.ingress.kubernetes.io/canary-by-header-pattern: green
spec:
  rules:
    - host: nginx.ms-sit.xxxxxx.net
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              serviceName: nginx-green-default
              servicePort: 80

Случай 2:

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: nginx-green-ingress  
ingress
  labels:
    dce.daocloud.io/app: nginx-green
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: 'true'
    nginx.ingress.kubernetes.io/canary-by-header: Cookie
    nginx.ingress.kubernetes.io/canary-by-header-pattern: bu=xxxcn|bu=xxxsg
spec:
  rules:
    - host: nginx.ms-sit.aswatson.net
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              serviceName: nginx-green-default
              servicePort: 80

4. Тест

Дело 1:

Случай 2:

Guess you like

Origin blog.csdn.net/summer_fish/article/details/132538678