Gateways hinzufügen

  1. Erstellen Sie ein neues Ingress-Gateway gemäß der Vorlage für das vorinstallierte Ingress-Gateway. Sie können die folgende YAML-Datei für die Schemadefinition verwenden, um ein neues Gateway zu erstellen. Ersetzen Sie in der YAML-Datei für die Sidecar-Datei POD_NAMESPACE durch Ihren Namespace und kopieren Sie den YAML-Code und fügen Sie ihn in eine Datei, GATEWAY_DEFINITION_FILE ein. 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 Nutzer-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 in etwa so aus: IP-Adressen für den integrierten istio-ingressgateway und das soeben erstellte Gateway. Andere Istio-Dienste werden der Übersichtlichkeit halber ausgelassen.

    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. Ändern Sie VirtualService so, dass sie auf das integrierte Gateway verweist, damit sie auf das neue Gateway verweist. Hier sehen Sie die geänderte VirtualService-Datei unter im Buchinfo-Beispiel:

    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 die neuen Gateway und VirtualService mit kubectl apply auf den Cluster an.

  7. Testen Sie, ob der Traffic Ihre Anwendungen sowohl über die alte als auch die neue externe IP-Adresse erreichen kann. Im Beispiel "Bookinfo" kann dies mit curl an die 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, um Traffic an die neue externe IP-Adresse weiterzuleiten.

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

  10. Entfernen Sie Gateways, das auf den integrierten Ingress verweist.