Integra cargas de trabajo de Kubernetes

En esta página, se muestra cómo integrar cargas de trabajo de Kubernetes con Cloud Service Mesh.

Implementa servicios de Kubernetes

Para implementar servicios de Kubernetes en clústeres con Cloud Service Mesh, debes hacer lo siguiente:

  • Crear objetos Service de Kubernetes para todos los contenedores. Todas las implementaciones deben tener un servicio de Kubernetes adjunto.

  • Asigna un nombre a los puertos de servicio. Aunque GKE te permite definir puertos de servicio sin nombre, Cloud Service Mesh requiere que proporciones un nombre para un puerto que coincida con el protocolo del puerto.

  • Etiqueta tus implementaciones. Esto te permite usar las funciones de administración del tráfico de Cloud Service Mesh, como dividir el tráfico entre las versiones del mismo servicio.

En el siguiente ejemplo de implementación y servicio, se ilustran estos requisitos:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloserver
  template:
    metadata:
      labels:
        app: helloserver
    spec:
      containers:
      - image: gcr.io/google-samples/istio/helloserver:v0.0.1
        imagePullPolicy: Always
        name: main
      restartPolicy: Always
      terminationGracePeriodSeconds: 5
apiVersion: v1
kind: Service
metadata:
  name: hellosvc
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8080
  selector:
    app: helloserver
  type: LoadBalancer

Después de implementar los servicios en un clúster con Cloud Service Mesh, asegúrate de insertar proxies de sidecar.

Ejemplo: Implementa la muestra de Online Boutique

La aplicación de ejemplo Online Boutique en el repositorio anthos-service-mesh-packages se modifica del conjunto original de manifiestos en el repositorio microservices-demo. Según las prácticas recomendadas, cada servicio se implementa en un espacio de nombres independiente con una cuenta de servicio única.

  1. Crea los espacios de nombres para la aplicación:

    kubectl apply -f \
      DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
    

    Resultado esperado:

    namespace/ad created
    namespace/cart created
    namespace/checkout created
    namespace/currency created
    namespace/email created
    namespace/frontend created
    namespace/loadgenerator created
    namespace/payment created
    namespace/product-catalog created
    namespace/recommendation created
    namespace/shipping created
    
  2. Habilita la inserción automática del sidecar (inserción automática). Este comando es diferente si usas Cloud Service Mesh administrado o en Cloud Service Mesh dentro del clúster. Si usas Cloud Service Mesh administrado, usa etiquetas de inserción predeterminadas (por ejemplo, istio-injection=enabled). Si usas Cloud Service Mesh en el clúster, usa la misma etiqueta de revisión que usaste para anotar el espacio de nombres de la puerta de enlace de entrada. Ten en cuenta que los clientes existentes del plano de control administrado migrado también pueden usar sus etiquetas de revisión existentes además de la etiqueta de inserción predeterminada.

    Etiquetas de inserción predeterminadas

    Aplica las etiquetas de inserción predeterminadas al espacio de nombres. En el siguiente comando, GATEWAY_NAMESPACE es el mismo valor que usaste para anotar el espacio de nombres de la puerta de enlace de entrada.

    for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
      kubectl label namespace $ns istio-injection=enabled istio.io/rev-
    done;
    

    Resultado esperado:

     namespace/ad labeled
     namespace/cart labeled
     namespace/checkout labeled
     namespace/currency labeled
     namespace/email labeled
     namespace/frontend labeled
     namespace/loadgenerator labeled
     namespace/payment labeled
     namespace/product-catalog labeled
     namespace/recommendation labeled
     namespace/shipping labeled
    

    Etiqueta de revisión

    Aplica la etiqueta de revisión a los espacios de nombres de la aplicación. En el siguiente comando, REVISION es el mismo valor que usaste para anotar el espacio de nombres de la puerta de enlace de entrada.

    for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
      kubectl label namespace $ns istio.io/rev=REVISION --overwrite
    done;
    

    Resultado esperado:

    namespace/ad labeled
    namespace/cart labeled
    namespace/checkout labeled
    namespace/currency labeled
    namespace/email labeled
    namespace/frontend labeled
    namespace/loadgenerator labeled
    namespace/payment labeled
    namespace/product-catalog labeled
    namespace/recommendation labeled
    namespace/shipping labeled
    
  3. Implementa la aplicación de ejemplo en el clúster.

    1. Crea las implementaciones y cuentas de servicio:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
      

      Resultado esperado:

      serviceaccount/ad created
      deployment.apps/adservice created
      serviceaccount/cart created
      deployment.apps/cartservice created
      serviceaccount/checkout created
      deployment.apps/checkoutservice created
      serviceaccount/currency created
      deployment.apps/currencyservice created
      serviceaccount/email created
      deployment.apps/emailservice created
      serviceaccount/frontend created
      deployment.apps/frontend created
      serviceaccount/loadgenerator created
      deployment.apps/loadgenerator created
      serviceaccount/payment created
      deployment.apps/paymentservice created
      serviceaccount/product-catalog created
      deployment.apps/productcatalogservice created
      serviceaccount/recommendation created
      deployment.apps/recommendationservice created
      serviceaccount/shipping created
      deployment.apps/shippingservice created
      
    2. Crea los servicios:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/kubernetes-manifests/services
      

      Resultado esperado:

      service/adservice created
      service/cartservice created
      service/checkoutservice created
      service/currencyservice created
      service/emailservice created
      service/frontend created
      service/frontend-external created
      service/paymentservice created
      service/productcatalogservice created
      service/recommendationservice created
      service/shippingservice created
      
    3. Crea las entradas de servicio:

      kubectl apply -f \
       DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
      

      Resultado esperado:

      serviceentry.networking.istio.io/allow-egress-googleapis created
      serviceentry.networking.istio.io/allow-egress-google-metadata created
      

Asigna nombres a puertos de servicio

Para que se los incluya en Cloud Service Mesh, los puertos del servicio deben tener un nombre, que debe incluir el protocolo del puerto, por ejemplo:

apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http

El nombre del puerto del servicio puede incluir un sufijo en la sintaxis name: protocol[-suffix], en la que los corchetes indican un sufijo opcional que debe comenzar con un guion, por ejemplo:

kind: Service
metadata:
  name: myservice
spec:
  ports:
  - number: 3306
    name: mysql
  - number: 80
    name: http-web

Para que las métricas se muestren en la consola de Google Cloud, los puertos del servicio deben tener nombres con alguno de los siguientes protocolos: http, http2 o grpc. Los puertos del servicio con el protocolo https se tratan como tcp, y no se muestran las métricas de esos servicios.

Inserta proxies de sidecar

En esta sección, se explica cómo configurar la inserción del proxy de sidecar con Cloud Service Mesh para mejorar la seguridad, la confiabilidad y la observabilidad de la red. Estas funciones se abstraen del contenedor principal de la aplicación y se implementan en un proxy común fuera del proceso (el archivo adicional), que se entrega como un contenedor separado en el mismo Pod. Puedes usar las funciones de Cloud Service Mesh sin rediseñar tus aplicaciones de producción para que participen en una malla de servicios.

La inyección automática del proxy de sidecar (inyección automática) se produce cuando Cloud Service Mesh detecta una etiqueta de espacio de nombres que configuras para el Pod de la carga de trabajo. El proxy intercepta todo el tráfico entrante y saliente de las cargas de trabajo y se comunica con Cloud Service Mesh.

Habilita la inserción automática de sidecar

  1. Habilita el espacio de nombres para la inserción. Los pasos dependen de la implementación del plano de control.

    Gestionada (TD)

    1. Aplica la etiqueta de revisión al espacio de nombres:
    kubectl label namespace NAMESPACE
        istio.io/rev- istio-injection=enabled --overwrite
    

    Administrado (Istiod)

    Los usuarios nuevos usan el siguiente comando para aplicar la etiqueta de revisión al espacio de nombres:

      kubectl label namespace NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Los usuarios existentes con el plano de control administrado de Istiod usan las siguientes instrucciones:

    1. Usa el siguiente comando para ubicar los canales de versiones disponibles:

      kubectl -n istio-system get controlplanerevision
      

      El resultado es similar al siguiente:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      NOTA: Si aparecen dos revisiones del plano de control en la lista anterior, quita una. No se admite tener varios canales del plano de control en el clúster.

      En el resultado, el valor en la columna NAME es la etiqueta de revisión que corresponde al canal de versiones disponible para la versión de Cloud Service Mesh.

    2. Aplica la etiqueta de revisión al espacio de nombres:

      kubectl label namespace NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    En el clúster

    1. Usa el siguiente comando para encontrar la etiqueta de revisión en istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
        jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Aplica la etiqueta de revisión a los espacios de nombres. En el siguiente comando, REVISION es el valor de la etiqueta de revisión istiod que anotaste en el paso anterior.

      kubectl label namespace NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
      
  2. Para reiniciar los Pods afectados, sigue los pasos de la siguiente sección.

  3. Anota el espacio de nombres demo de la siguiente manera:

    kubectl annotate --overwrite namespace NAMESPACE \
    mesh.cloud.google.com/proxy='{"managed":"true"}'
    

Reinicia los Pods para actualizar los proxies de sidecar

Con la inserción automática de sidecar, puedes actualizar los sidecars para pods existentes con un reinicio de pods:

La forma en que reinicias los Pods depende de si se crearon como parte de un objeto Deployment.

  1. Si usaste un Deployment, debes reiniciarlo, de modo que se reinicien todos los pods con sidecars:

    kubectl rollout restart deployment -n NAMESPACE

    Si no usaste un Deployment, borra los pods, y se volverán a crear de forma automática con sidecars:

    kubectl delete pod -n NAMESPACE --all
  2. Verifica que todos los pods en el espacio de nombres tengan sidecars incorporados:

    kubectl get pod -n NAMESPACE

    En el siguiente resultado de ejemplo del comando anterior, observa que la columna READY indica que hay dos contenedores para cada una de tus cargas de trabajo: el contenedor principal y el contenedor del proxy de sidecar.

    NAME                    READY   STATUS    RESTARTS   AGE
    WORKLOAD           2/2     Running   0          20s
    ...