Use nginx ingress to implement grayscale deployment in kubernetes

Overview

1) kuberntes cluster environment: v1.14.2.
2) nginx ingress version: nginx-ingress-controller: 0.25.0.
3) nginx ingress deployment method: daemonset, and directly use the host network (ie host mode), port 80.
4) Official document address: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#canary

1) Gray release based on weight (30% of requests flow into the canary service)

1) Step 1: Deploy production and canary services

[root@master canary]# cat production.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: production
  labels:
    app: production
spec:
  replicas: 1
  selector:
    matchLabels:
      app: production
  template:
    metadata:
      labels:
        app: production
    spec:
      containers:
      - name: production
        image: registry.aliyuncs.com/google_containers/echoserver:1.10
        ports:
        - containerPort: 8080
        env:
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
---
apiVersion: v1
kind: Service
metadata:
  name: production
  labels:
    app: production
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: production


[root@master canary]# cat canary.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: canary
  labels:
    app: canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: canary
  template:
    metadata:
      labels:
        app: canary
    spec:
      containers:
      - name: canary
        image: registry.aliyuncs.com/google_containers/echoserver:1.10
        ports:
        - containerPort: 8080
        env:
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
---
apiVersion: v1
kind: Service
metadata:
  name: canary
  labels:
    app: canary
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: canary

2) Visit product and canary services to check whether the service is running normally
Insert picture description hereInsert picture description here

3) Deploy ingress corresponding to production and canary services

[root@master canary]# cat production-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: production
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: master.example.com
    http:
      paths:
      - backend:
          serviceName: production
          servicePort: 80
        path: /apis/echo

[root@master canary]# cat canary-weight-ingress.yaml
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: master.example.com
    http:
      paths:
      - backend:
          serviceName: canary
          servicePort: 80
        path: /apis/echo

4) Visit nginx to view the gray deployment effect
Insert picture description here

2) Grayscale release based on http header

#在已经成功部署production服务和canary服务的基础上,创建以下两个ingress
[root@master canary]# cat production-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: production
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: master.ly-sky.com
    http:
      paths:
      - backend:
          serviceName: production
          servicePort: 80
        path: /apis/echo


[root@master canary]# cat canary-header-ingress.yaml
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-by-header: "yourcanaryheader"
    nginx.ingress.kubernetes.io/canary-by-header-value: "boy"
spec:
  rules:
  - host: master.ly-sky.com
    http:
      paths:
      - backend:
          serviceName: canary
          servicePort: 80
        path: /apis/echo

4) Visit nginx to view the gray deployment effect

According to the settings in ingress, requests with http header "yourcanaryheader: boy" will flow into the canary service.
Insert picture description here
When the value of the http header of yourcanaryheader is not "boy", the request flows into the product service.
Insert picture description here

Guess you like

Origin blog.csdn.net/nangonghen/article/details/107101218