Incorporar cargas de trabajo de Kubernetes
En esta página se explica cómo incorporar cargas de trabajo de Kubernetes con Cloud Service Mesh.
Desplegar servicios de Kubernetes
Para desplegar servicios de Kubernetes en clústeres con Cloud Service Mesh, debes hacer lo siguiente:
Crea servicios de Kubernetes para todos los contenedores. Todos los despliegues deben tener un servicio de Kubernetes asociado.
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. De esta forma, puedes usar las funciones de gestión del tráfico de Cloud Service Mesh, como dividir el tráfico entre versiones del mismo servicio.
En el siguiente ejemplo de implementación y servicio se ilustran estos requisitos:
Después de desplegar tus servicios en un clúster con Cloud Service Mesh, asegúrate de insertar proxies sidecar.
Ejemplo: desplegar el ejemplo Online Boutique
La aplicación de ejemplo Online Boutique del repositorio anthos-service-mesh-packages
se ha modificado a partir del conjunto original de manifiestos del repositorio microservices-demo
. Siguiendo las prácticas recomendadas, cada servicio se implementa en un espacio de nombres independiente con una cuenta de servicio única.
Crea los espacios de nombres de 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
Habilita los espacios de nombres para la inyección. Los pasos dependen de la implementación del plano de control.
Gestionado (TD)
Aplica la etiqueta de inyección predeterminada al espacio de nombres:
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio.io/rev- istio-injection=enabled --overwrite done;
Gestionado (Istiod)
Recomendación: Ejecuta el siguiente comando para aplicar la etiqueta de inyección predeterminada al espacio de nombres:
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio.io/rev- istio-injection=enabled --overwrite done;
Si ya eres usuario del plano de control de Istiod gestionado: Te recomendamos que utilices la inyección predeterminada, pero también se admite la inyección basada en revisiones. Sigue estas instrucciones:
Ejecuta el siguiente comando para localizar los canales de lanzamiento disponibles:
kubectl -n istio-system get controlplanerevision
El resultado debería ser similar al siguiente:
NAME AGE asm-managed-rapid 6d7h
En el resultado, el valor de la columna
NAME
es la etiqueta de revisión que corresponde al canal de lanzamiento disponible para la versión de Cloud Service Mesh.Aplica la etiqueta de revisión al espacio de nombres:
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite done;
En el clúster
Recomendación: Ejecuta el siguiente comando para aplicar la etiqueta de inyección predeterminada al espacio de nombres:
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio.io/rev- istio-injection=enabled --overwrite done;
Te recomendamos que uses la inyección predeterminada, pero también se admite la inyección basada en revisiones: Sigue estas instrucciones:
Usa el siguiente comando para localizar 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"}'
Aplica la etiqueta de revisión al espacio de nombres. En el siguiente comando,
REVISION_LABEL
es el valor de la etiqueta de revisiónistiod
que has anotado en el paso anterior.for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite done;
Despliega la aplicación de ejemplo en el clúster.
Crea las cuentas de servicio y las implementaciones:
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
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
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
Nombrar los puertos de servicio
Para que se incluyan en Cloud Service Mesh, los puertos de servicio deben tener un nombre, y este 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 de servicio puede incluir un sufijo con la siguiente sintaxis:
name: protocol[-suffix]
donde los corchetes indican un sufijo opcional que debe empezar por 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 Google Cloud , los puertos de servicio deben tener uno de los siguientes protocolos: http
, http2
o grpc
.
Los puertos de servicio con el protocolo https
se tratan como tcp
y no se muestran métricas de esos servicios.
Insertar proxies de sidecar
En esta sección se explica cómo configurar la inyección de proxy sidecar con Cloud Service Mesh para mejorar la seguridad, la fiabilidad 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 sidecar), que se proporciona como un contenedor independiente en el mismo pod. Puedes usar las funciones de Cloud Service Mesh sin tener que rediseñar tus aplicaciones de producción para que participen en una malla de servicios.
La inyección automática de proxy sidecar 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.
Habilitar la inyección automática de sidecars
Habilita el espacio de nombres para la inyección. Los pasos dependen de la implementación del plano de control.
Gestionado (TD)
- Aplica la etiqueta de inyección predeterminada al espacio de nombres:
kubectl label namespace NAMESPACE istio.io/rev- istio-injection=enabled --overwrite
Gestionado (Istiod)
Recomendación: Ejecuta el siguiente comando para aplicar la etiqueta de inyección predeterminada al espacio de nombres:
kubectl label namespace NAMESPACE \ istio.io/rev- istio-injection=enabled --overwrite
Si ya eres usuario del plano de control de Istiod gestionado: Te recomendamos que utilices la inyección predeterminada, pero también se admite la inyección basada en revisiones. Sigue estas instrucciones:
Ejecuta el siguiente comando para localizar los canales de lanzamiento disponibles:
kubectl -n istio-system get controlplanerevision
El resultado debería ser similar al siguiente:
NAME AGE asm-managed-rapid 6d7h
NOTA: Si aparecen dos revisiones del plano de control en la lista anterior, elimina una. No se admite tener varios canales del plano de control en el clúster.
En el resultado, el valor de la columna
NAME
es la etiqueta de revisión que corresponde al canal de lanzamiento disponible para la versión de Cloud Service Mesh.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
Recomendación: Ejecuta el siguiente comando para aplicar la etiqueta de inyección predeterminada al espacio de nombres:
kubectl label namespace NAMESPACE \ istio.io/rev- istio-injection=enabled --overwrite
Te recomendamos que uses la inyección predeterminada, pero también se admite la inyección basada en revisiones: Sigue estas instrucciones:
Usa el siguiente comando para localizar 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"}'
Aplica la etiqueta de revisión al espacio de nombres. En el siguiente comando,
REVISION_LABEL
es el valor de la etiqueta de revisiónistiod
que has anotado en el paso anterior.kubectl label namespace NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Reinicia los pods afectados siguiendo los pasos de la siguiente sección.
Anota el espacio de nombres
demo
de la siguiente manera:kubectl annotate --overwrite namespace NAMESPACE \ mesh.cloud.google.com/proxy='{"managed":"true"}'
Reiniciar los pods para actualizar los proxies adicionales
Con la inserción automática de sidecars, puedes actualizar los sidecars de los pods que ya tengas reiniciando los pods:
La forma de reiniciar los pods depende de si se han creado como parte de una implementación.
Si has usado un Deployment, reinícialo para que se reinicien todos los pods con sidecars:
kubectl rollout restart deployment -n NAMESPACE
Si no has usado un Deployment, elimina los pods y se volverán a crear automáticamente con sidecars:
kubectl delete pod -n NAMESPACE --all
Comprueba que todos los pods del espacio de nombres tengan sidecars insertados:
kubectl get pod -n NAMESPACE
En el siguiente ejemplo de salida del comando anterior, observe que la columna
READY
indica que hay dos contenedores para cada una de sus cargas de trabajo: el contenedor principal y el contenedor del proxy sidecar.NAME READY STATUS RESTARTS AGE WORKLOAD 2/2 Running 0 20s ...