Gateways hinzufügen

  1. Erstellen Sie ein neues Gateway für eingehenden Traffic anhand der Vorlage für das vorinstallierte Gateway für eingehenden Traffic. Verwenden Sie die folgende Gateway-Definitions-YAML, um ein neues Gateway zu erstellen. Ersetzen Sie in der YAML-Datei für die Gateway-Definition POD_NAMESPACE durch Ihren Namespace und kopieren Sie dann die YAML-Datei in die Datei GATEWAY_DEFINITION_FILE. Achten Sie darauf, Ressourcen wie PodDisruptionBudget und HorizontalPodAutoscaler entsprechend Ihrer Umgebung zu bearbeiten.

    Gateway-Definitions-YAML

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: user-ingressgateway-service-account
      namespace: istio-system
      labels:
        app: istio-ingressgateway
        chart: gateways
        heritage: Tiller
        release: istio
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: user-ingressgateway
      namespace: istio-system
      annotations:
      labels:
        chart: gateways
        heritage: Tiller
        release: istio
        app: istio-ingressgateway
        istio: ingressgateway
    spec:
      type: LoadBalancer
      selector:
        release: istio
        app: istio-ingressgateway
        istio: ingressgateway
      ports:
        -
          name: status-port
          port: 15020
          targetPort: 15020
        -
          name: http2
          nodePort: 31380
          port: 80
          targetPort: 80
        -
          name: https
          nodePort: 31390
          port: 443
        -
          name: tcp
          nodePort: 31400
          port: 31400
        -
          name: https-kiali
          port: 15029
          targetPort: 15029
        -
          name: https-prometheus
          port: 15030
          targetPort: 15030
        -
          name: https-grafana
          port: 15031
          targetPort: 15031
        -
          name: https-tracing
          port: 15032
          targetPort: 15032
        -
          name: tls
          port: 15443
          targetPort: 15443
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: user-ingressgateway
      namespace: istio-system
      labels:
        app: istio-ingressgateway
        chart: gateways
        heritage: Tiller
        istio: ingressgateway
        release: istio
    spec:
      selector:
        matchLabels:
          app: istio-ingressgateway
          istio: ingressgateway
      strategy:
        rollingUpdate:
          maxSurge: 100%
          maxUnavailable: 25%
      template:
        metadata:
          labels:
            app: istio-ingressgateway
            chart: gateways
            heritage: Tiller
            istio: ingressgateway
            release: istio
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          serviceAccountName: user-ingressgateway-service-account
          containers:
            - name: istio-proxy
              image: "gcr.io/istio-testing/proxyv2:1.4-dev"
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 15020
                - containerPort: 80
                - containerPort: 443
                - containerPort: 31400
                - containerPort: 15029
                - containerPort: 15030
                - containerPort: 15031
                - containerPort: 15032
                - containerPort: 15443
                - containerPort: 15090
                  protocol: TCP
                  name: http-envoy-prom
              args:
              - proxy
              - router
              - --domain
              - POD_NAMESPACE.svc.cluster.local
              - --log_output_level=default:info
              - --drainDuration
              - '45s' #drainDuration
              - --parentShutdownDuration
              - '1m0s' #parentShutdownDuration
              - --connectTimeout
              - '10s' #connectTimeout
              - --serviceCluster
              - user-ingressgateway
              - --zipkinAddress
              - zipkin:9411
              - --proxyAdminPort
              - "15000"
              - --statusPort
              - "15020"
              - --controlPlaneAuthPolicy
              - NONE
              - --discoveryAddress
              - istio-pilot:15010
              readinessProbe:
                failureThreshold: 30
                httpGet:
                  path: /healthz/ready
                  port: 15020
                  scheme: HTTP
                initialDelaySeconds: 1
                periodSeconds: 2
                successThreshold: 1
                timeoutSeconds: 1
              resources:
                limits:
                  cpu: 2000m
                  memory: 1024Mi
                requests:
                  cpu: 100m
                  memory: 128Mi
              env:
              - name: NODE_NAME
                valueFrom:
                  fieldRef:
                    apiVersion: v1
                    fieldPath: spec.nodeName
              - name: POD_NAME
                valueFrom:
                  fieldRef:
                    apiVersion: v1
                    fieldPath: metadata.name
              - name: POD_NAMESPACE
                valueFrom:
                  fieldRef:
                    apiVersion: v1
                    fieldPath: metadata.namespace
              - name: INSTANCE_IP
                valueFrom:
                  fieldRef:
                    apiVersion: v1
                    fieldPath: status.podIP
              - name: HOST_IP
                valueFrom:
                  fieldRef:
                    apiVersion: v1
                    fieldPath: status.hostIP
              - name: SERVICE_ACCOUNT
                valueFrom:
                  fieldRef:
                    fieldPath: spec.serviceAccountName
              - name: ISTIO_META_POD_NAME
                valueFrom:
                  fieldRef:
                    apiVersion: v1
                    fieldPath: metadata.name
              - name: ISTIO_META_CONFIG_NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: ISTIO_METAJSON_LABELS
                value: |
                  {"app":"istio-ingressgateway","chart":"gateways","heritage":"Tiller","istio":"ingressgateway","release":"istio"}
              - name: ISTIO_META_CLUSTER_ID
                value: "Kubernetes"
              - name: SDS_ENABLED
                value: "false"
              - name: ISTIO_META_WORKLOAD_NAME
                value: user-ingressgateway
              - name: ISTIO_META_OWNER
                value: kubernetes://apis/apps/v1/namespaces/istio-system/deployments/user-ingressgateway
              - name: ISTIO_META_ROUTER_MODE
                value: sni-dnat
              volumeMounts:
              - name: istio-certs
                mountPath: /etc/certs
                readOnly: true
              - name: ingressgateway-certs
                mountPath: "/etc/istio/ingressgateway-certs"
                readOnly: true
              - name: ingressgateway-ca-certs
                mountPath: "/etc/istio/ingressgateway-ca-certs"
                readOnly: true
          volumes:
          - name: istio-certs
            secret:
              secretName: istio.user-ingressgateway-service-account
              optional: true
          - name: ingressgateway-certs
            secret:
              secretName: "istio-ingressgateway-certs"
              optional: true
          - name: ingressgateway-ca-certs
            secret:
              secretName: "istio-ingressgateway-ca-certs"
              optional: true
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                    - "amd64"
                    - "ppc64le"
                    - "s390x"
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 2
                preference:
                  matchExpressions:
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                    - "amd64"
              - weight: 2
                preference:
                  matchExpressions:
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                    - "ppc64le"
              - weight: 2
                preference:
                  matchExpressions:
                  - key: beta.kubernetes.io/arch
                    operator: In
                    values:
                    - "s390x"
    ---
    apiVersion: policy/v1beta1
    kind: PodDisruptionBudget
    metadata:
      name: user-ingressgateway
      namespace: istio-system
      labels:
        chart: gateways
        heritage: Tiller
        release: istio
        app: istio-ingressgateway
        istio: ingressgateway
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          release: istio
          app: istio-ingressgateway
          istio: ingressgateway
    —
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    metadata:
      name: user-ingressgateway
      namespace: istio-system
      labels:
        chart: gateways
        heritage: Tiller
        release: istio
        app: istio-ingressgateway
        istio: ingressgateway
    spec:
      maxReplicas: 5
      minReplicas: 1
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: user-ingressgateway
      metrics:
        - type: Resource
          resource:
            name: cpu
            targetAverageUtilization: 80
    ---
    
  2. Wenden Sie die User-Gateway-Datei auf den Cluster an:

    kubectl apply -f GATEWAY_DEFINITION_FILE
    
  3. Prüfen Sie, ob dem neuen Gateway eine externe IP-Adresse zugewiesen wurde:

    kubectl get svc -n istio-system
    

    Die Ausgabe sieht etwa so aus, wobei die IP-Adressen für das integrierte istio-ingressgateway und das Gateway, das Sie gerade erstellt haben, verwendet werden. (Weitere Istio-Dienste werden der Kürze halber weggelassen.)

    NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP
    istio-ingressgateway   LoadBalancer   10.103.245.98    35.225.130.192 ...
    user-ingressgateway    LoadBalancer   10.103.240.33    104.198.174.26 ...
  4. Fügen Sie eine Gateway-Ressource für das neue Gateway hinzu. Weitere Informationen zu Gateways finden Sie in der Referenz zu istio.io.

    kind: Gateway
    metadata:
      name: user-gateway
    spec:
      selector:
        app: user-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    
  5. Jeder VirtualService, der auf das integrierte Gateway verweist, muss so geändert werden, dass er auch auf das neue Gateway verweist. Hier ist der geänderte VirtualService, der auf dem im Bookinfo-Beispiel basiert:

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
        - bookinfo-gateway
        - user-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
    
  6. Wenden Sie das neue Gateway und den VirtualService mithilfe von kubectl apply auf den Cluster an.

  7. Testen Sie, ob der Traffic Ihre Anwendungen über die alte und neue externe IP-Adresse erreicht. Im Bookinfo-Beispiel könnte dies mit curl zu den zugewiesenen externen IP-Adressen erfolgen:

    curl http://35.225.130.192/productpage
    curl http://104.198.174.26/productpage
    
  8. Aktualisieren Sie das DNS oder den Load-Balancer so, dass der Traffic an die neue externe IP-Adresse weitergeleitet wird.

  9. Entfernen Sie alle Referenzen in VirtualServices auf alle Gateways, die auf den integrierten Ingress verweisen.

  10. Entfernen Sie alle Gateways, die auf den integrierten Ingress verweisen.