Utilice la entrada de nginx para implementar la implementación en escala de grises en kubernetes

Visión de conjunto

1) entorno de clúster de kuberntes: v1.14.2.
2) versión de entrada de nginx: nginx-ingress-controller: 0.25.0.
3) método de implementación de ingreso de nginx: daemonset, y use directamente la red de host (es decir, el modo de host), puerto 80.
4) Dirección del documento oficial: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#canary

1) Liberación gris basada en el peso (el 30% de las solicitudes fluyen al servicio canario)

1) Paso 1: Implementar la producción y los servicios canarios

[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) Visite el producto y los servicios de Canary para verificar si el servicio se está ejecutando normalmente.
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

3) Implementar el ingreso correspondiente a la producción y los servicios canarios.

[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) Visite nginx para ver el efecto de implementación gris
Inserte la descripción de la imagen aquí

2) Versión en escala de grises basada en el encabezado http

#在已经成功部署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) Visite nginx para ver el efecto de implementación gris

De acuerdo con la configuración en el ingreso, las solicitudes con el encabezado http "yourcanaryheader: boy" fluirán hacia el servicio canary.
Inserte la descripción de la imagen aquí
Cuando el valor del encabezado http de yourcanaryheader no es "boy", la solicitud fluye hacia el servicio del producto.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/nangonghen/article/details/107101218
Recomendado
Clasificación