Agregar puertas de enlace

  1. Crea una puerta de enlace de entrada nueva según la plantilla para la puerta de enlace de entrada preinstalada. Puedes usar el siguiente YAML de definición de puerta de enlace para crear una puerta de enlace nueva. En el YAML de definición de Gateway, reemplaza POD_NAMESPACE por tu espacio de nombres y, luego, copia y pega el YAML en un archivo, GATEWAY_DEFINITION_FILE. Asegúrate de editar recursos como PodDisruptionBudget y HorizontalPodAutoscaler según corresponda para tu entorno.

    YAML de definición de puerta de enlace

    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. Aplica el archivo de puerta de enlace del usuario al clúster:

    kubectl apply -f GATEWAY_DEFINITION_FILE
    
  3. Verifica que se haya asignado una IP externa a la puerta de enlace nueva:

    kubectl get svc -n istio-system
    

    El resultado es similar al siguiente, con direcciones IP tanto para istio-ingressgateway integrados como para la puerta de enlace que acabas de crear. (Otros servicios de Istio se omiten para abreviar).

    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. Agrega un recurso de puerta de enlace para la nueva puerta de enlace. Para obtener más información sobre las entradas, consulta la referencia de istio.io.

    kind: Gateway
    metadata:
      name: user-gateway
    spec:
      selector:
        app: user-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    
  5. Modifica cualquier VirtualService que apunte a la puerta de enlace integrada para que también apunte a la nueva puerta de enlace. Este es el VirtualService modificado según el del ejemplo de Bookinfo:

    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. Aplica las Gateway y VirtualService nuevas al clúster mediante kubectl apply.

  7. Prueba que el tráfico pueda llegar a tus aplicaciones aunque las direcciones IP externas antiguas y nuevas. Con el ejemplo de Bookinfo, esto se puede hacer con curl a las direcciones IP externas asignadas:

    curl http://35.225.130.192/productpage
    curl http://104.198.174.26/productpage
    
  8. Actualiza tu DNS o balanceador de cargas para enrutar el tráfico a la nueva dirección IP externa.

  9. Quita cualquier referencia en VirtualServices a cualquier Gateways que apunte a la entrada incorporada.

  10. Quita cualquier Gateways que apunte a la entrada incorporada.