En esta guía se explica cómo configurar Knative Serving para permitir que uno o varios proyectos ejecuten y gestionen las cargas de trabajo que se ejecutan en un clúster de GKE de otro proyecto. Google Cloud Google Cloud
Un modelo operativo habitual con Knative Serving es que un equipo de desarrolladores de aplicaciones use su Google Cloud proyecto para implementar y gestionar serviciosGoogle Cloud que se ejecutan en clústeres de GKE distintos en otros proyectos de equipos. Esta función, llamada multitenancy, te permite, como operador de la plataforma, adaptar el acceso de tus equipos de desarrollo solo a los servicios que se ejecutan en los distintos entornos de tu organización (por ejemplo, producción y staging).
El servicio de Knative admite específicamente la multitenencia empresarial. Este tipo de multitenencia permite que un proyecto Google Cloud de clúster acceda a recursos específicos de su clúster de GKE. El Google Cloud proyecto al que se le concede acceso al clúster Google Cloud es el proyecto de inquilino Google Cloud . Los arrendatarios del proyecto de clúster Google Cloud pueden usar Knative Serving para acceder, operar y poseer los servicios y recursos a los que se les haya concedido acceso.
Conceptualmente, hay cuatro pasos para configurar la propiedad múltiple empresarial con Knative Serving:
- Configura el acceso de los arrendatarios al proyecto del clúster Google Cloud mediante un grupo de Google y la gestión de identidades y accesos.
- Asigna cada proyecto de inquilino Google Cloud al proyecto de clúster Google Cloud .
- Dirige los datos de registro del proyecto del clúster Google Cloud al proyecto del arrendatario Google Cloud mediante segmentos y receptores de registro.
- Define los permisos de clúster para los inquilinos mediante el control de acceso basado en roles.
Antes de empezar
El operador de la plataforma responsable de configurar la multitenencia debe conocer y cumplir los siguientes requisitos:
Como se explica en la documentación de GKE, debes conocer los siguientes conceptos de multitenencia:
En este documento se presupone que ya existen los Google Cloud proyectos en los que quieres habilitar la arquitectura multiempresa.
Debes tener acceso a los siguientes servicios y recursos de proyectos: Google Cloud
Permisos de Gestión de Identidades y Accesos en el proyecto Google Cloud del arrendatario:
- roles/logging.configWriter
- Administrador de arrendatario del grupo de Google
Permisos de Gestión de Identidades y Accesos en el proyecto Google Cloud del clúster:
Debes tener instalada la versión más reciente de la [CLI de Google Cloud]](/sdk/docs/install).
Definir variables de entorno locales
Para simplificar los comandos que se usan en este proceso, define variables de entorno locales para el proyecto del clúster ( Google Cloud ) y el proyecto del arrendatario ( Google Cloud ):
Sustituye
YOUR_CLUSTER_PROJECT_ID
por el ID del proyecto del clúster Google Cloud y, a continuación, ejecuta el siguiente comando:export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
Sustituye
YOUR_TENANT_PROJECT_ID
por el ID del proyecto de inquilino Google Cloud y, a continuación, ejecuta el siguiente comando:export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
Verifica las variables de entorno locales ejecutando los siguientes comandos:
echo "cluster Google Cloud project is:" $CLUSTER_PROJECT_ID echo "tenant Google Cloud project is:" $TENANT_PROJECT_ID
Ahora, el ID de proyecto del clúster Google Cloud y el ID de proyecto del arrendatario Google Cloud se usan en todos los comandos siguientes en los que se especifican $CLUSTER_PROJECT_ID
y $TENANT_PROJECT_ID
.
Verificar tus permisos de gestión de identidades y accesos
Ejecuta los siguientes comandos testIamPermissions para comprobar que tienes los permisos de gestión de identidades y accesos necesarios para acceder a los recursos del proyecto del clúster Google Cloud , así como a los proyectos del arrendatario Google Cloud .
Ejecuta el siguiente comando para validar tus permisos en el proyecto del clúster: Google Cloud
curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
--header "Content-Type: application/json" \
--data '{"permissions":["logging.sinks.create", "logging.sinks.get", "resourcemanager.projects.setIamPolicy"]}' \
https://cloudresourcemanager.googleapis.com/v1/projects/$CLUSTER_PROJECT_ID:testIamPermissions
Resultados esperados del proyecto del clúster Google Cloud :
{
"permissions": [
"logging.sinks.create",
"logging.sinks.get",
"resourcemanager.projects.setIamPolicy"
]
}
Ejecuta el siguiente comando para validar tus permisos en cada proyecto de inquilino: Google Cloud
curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
--header "Content-Type: application/json" \
--data '{"permissions":["logging.buckets.create", "logging.buckets.get", "resourcemanager.projects.setIamPolicy", "resourcesettings.settingvalues.create", "serviceusage.services.enable"]}' \
https://cloudresourcemanager.googleapis.com/v1/projects/$TENANT_PROJECT_ID:testIamPermissions
Resultados esperados para cada proyecto de inquilino: Google Cloud
{
"permissions": [
"logging.buckets.create",
"logging.buckets.get",
"resourcemanager.projects.setIamPolicy",
"resourcesettings.settingvalues.create",
"serviceusage.services.enable",
]
}
Usar un grupo de Google y Gestión de Identidades y Accesos para configurar el acceso al arrendatario
Usa un grupo de Google para permitir que los arrendatarios accedan al clúster de GKE. Los permisos de IAM dan a los tenants los permisos para obtener credenciales, pero no podrán hacer nada en el clúster hasta que se configure el control de acceso basado en roles de Kubernetes en un paso posterior.
Debes crear un grupo de Google que contenga a todos los usuarios del proyecto de tu inquilino Google Cloud . Para obtener más información sobre cómo usar un grupo de seguridad, consulta Usar Grupos de Google en GKE.
Crea la siguiente variable de entorno local para tu grupo de Google:
export SECURITY_GROUP=gke-security-groups@company.com
Lector de clústeres de Kubernetes
Ejecuta los siguientes comandos para permitir que los arrendatarios obtengan credenciales para el clúster. Esto no permite que los arrendatarios lean ni manipulen ningún recurso del clúster de GKE.
Referencia de gestión de identidades y accesos
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/container.clusterViewer' \
--condition=None
Para restringir el acceso a un clúster específico, puedes usar una condición de gestión de identidades y accesos.
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/container.clusterViewer' \
--condition="expression=resource.name == 'cluster-name',title=Restrict cluster access"
Lector de supervisión
Ejecuta el siguiente comando para permitir que los arrendatarios lean métricas de monitorización.
Referencia de roles de Monitoring
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/monitoring.viewer' \
--condition=None
Asignar cada proyecto de inquilino al proyecto de clúster Google Cloud Google Cloud
Los valores de configuración de recursos se usan para asignar proyectos de inquilino Google Cloud a un proyecto de clúster Google Cloud .
El ajuste de recursos se puede configurar para cada proyecto de inquilino Google Cloud o se puede definir en cualquier nivel de la jerarquía de carpetas. Es más fácil definirlo a nivel de carpeta de un solo arrendatario, pero es más flexible hacerlo a nivel de proyecto de cada arrendatario. Una vez configurado, cada vez que los propietarios naveguen por la interfaz de usuario de Knative Serving, también verán sus servicios en el proyecto del clúster Google Cloud . Esto no cambia los permisos de gestión de identidades y accesos en el proyecto del clúster Google Cloud ni en los clústeres de GKE, sino que solo es una asignación de un proyecto (o una carpeta) de un arrendatario a un proyecto del clúster Google Cloud .
Habilita la API
resourcesettings
en el proyecto del arrendatario Google Cloud .gcloud services enable resourcesettings.googleapis.com \ --project=$TENANT_PROJECT_ID
Añade los privilegios de administrador de la organización (
roles/resourcesettings.admin
) a tu ID de usuario ejecutando el siguiente comando:gcloud organizations add-iam-policy-binding YOUR_ORGANIZATION_ID \ --member=YOUR_ADMIN_MEMBER_ID \ --role='roles/resourcesettings.admin'
Sustituye
YOUR_ORGANIZATION_ID
por el ID de tu organización yYOUR_ADMIN_MEMBER_ID
por tu ID de usuario, por ejemplo,user:my-email@my-domain.com
.Elige uno de los siguientes métodos para definir la asignación.
Puedes definir el valor del ajuste de recursos en una carpeta principal Google Cloud si todos los proyectos Google Cloud y las carpetas Google Cloud secundarios usan el mismo valor.
Proyectos de cliente
Define el valor de configuración del recurso de cada proyecto de inquilino: Google Cloud
- Obtén el
name
del proyecto del cliente Google Cloud y asígnalo a una variable de entorno local:export TENANT_PROJECT_NUMBER=$(gcloud projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
- Crea un archivo de valores de configuración de recursos para definir la asignación del proyecto Google Cloud inquilino al proyecto Google Cloud clúster. Se pueden definir varios IDs de proyecto de clúster en este archivo y añadirlos a un solo proyecto de inquilino. Google Cloud Google Cloud
cat > value-file.json << EOF { "name": "projects/$TENANT_PROJECT_NUMBER/settings/cloudrun-multiTenancy/value", "value": { "stringSetValue": { "values": [ "projects/$CLUSTER_PROJECT_ID" ] } } } EOF
- Implementa la configuración de recursos en el proyecto del cliente: Google Cloud
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --project $TENANT_PROJECT_ID
Carpetas de inquilino
Define el valor de un ajuste de recurso de una carpeta de un arrendatario principal para que se aplique a todos los proyectos y carpetas del arrendatario secundario: Google Cloud
- Obtén el
number
de la carpeta del arrendatario y asígnalo a una variable de entorno local:export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
- Crea un archivo de valores de configuración de recursos para definir la asignación de la carpeta de inquilino al proyecto de clúster. Google Cloud Se pueden definir varios IDs de proyecto de clúster en este archivo y añadirlos a una sola carpeta de inquilino. Google Cloud
cat > value-file.json << EOF { "name": "folders/$TENANT_FOLDER_NUMBER/settings/cloudrun-multiTenancy/value", "value": { "stringSetValue": { "values": [ "projects/$CLUSTER_PROJECT_ID" ] } } } EOF
- Implementa los ajustes de recursos en la carpeta del arrendatario:
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --folder $TENANT_FOLDER_NUMBER
Configurar los segmentos y sumideros de registros para enrutar los datos de registro
Por cada arrendatario, se crea un segmento de registros, un sumidero y los permisos para enrutar los datos de registro del proyecto del clúster Google Cloud al proyecto del arrendatario Google Cloud . En los pasos siguientes, todos los registros del espacio de nombres del proyecto Google Cloud del clúster se enrutan al segmento. Consulta el conjunto de abajo para obtener más información sobre cómo limitar los registros que se comparten.
Crea las siguientes variables de entorno locales:
- Especifica el espacio de nombres del clúster de GKE al que acceden tus inquilinos.
- El nombre del receptor. Para simplificar este paso, el nombre es una combinación de las variables de entorno locales del proyecto de clúster Google Cloud y del proyecto de inquilino Google Cloud que has creado anteriormente. Puedes modificar este valor.
export NAMESPACE=$NAMESPACE
export SINK_NAME=$CLUSTER_PROJECT_ID-$TENANT_PROJECT_ID
Ejecuta el siguiente comando para crear el contenedor de registros en el proyecto de inquilino. Ten en cuenta que el nombre del contenedor de registro debe ser el ID del proyecto del clúster Google Cloud y no se puede cambiar ni modificar.
gcloud logging buckets \
create $CLUSTER_PROJECT_ID \
--location=global \
--project=$TENANT_PROJECT_ID
Ejecuta el siguiente comando para crear el receptor a partir del espacio de nombres especificado en el proyecto del clúster Google Cloud , en el segmento del proyecto del arrendatario Google Cloud . Ten en cuenta que puedes acotar el ámbito de los registros, por ejemplo, para compartir solo un clúster de GKE o recursos de Knative Serving específicos, definiendo valores de log-filter
adicionales.
gcloud logging sinks \
create $SINK_NAME \
logging.googleapis.com/projects/$TENANT_PROJECT_ID/locations/global/buckets/$CLUSTER_PROJECT_ID \
--log-filter=resource.labels.namespace_name=$NAMESPACE \
--project $CLUSTER_PROJECT_ID
Ejecuta los siguientes comandos para añadir el permiso de la cuenta de servicio del receptor de registro al bucket que has creado.
export SINK_SERVICE_ACCOUNT=$(gcloud logging sinks \
describe $SINK_NAME \
--project $CLUSTER_PROJECT_ID \
--format="value(writerIdentity)")
gcloud projects add-iam-policy-binding $TENANT_PROJECT_ID \
--member=$SINK_SERVICE_ACCOUNT \
--role='roles/logging.bucketWriter' \
--condition="expression=resource.name.endsWith\
(\"locations/global/buckets/$CLUSTER_PROJECT_ID\"),\
title=Log bucket writer from $CLUSTER_PROJECT_ID"
Configurar permisos de inquilino con el control de acceso basado en roles (RBAC)
Antes, usabas Grupos de Google y Gestión de identidades y accesos (IAM) para configurar permisos que permitieran a los arrendatarios acceder al proyecto Google Cloud del clúster de GKE. Para permitir que los arrendatarios accedan a los recursos del clúster de GKE, debes definir permisos con el control de acceso basado en roles (RBAC) de Kubernetes.
Crear roles de clúster
Después de definir y crear los siguientes roles de clúster, puedes seguir usándolos en el futuro para añadir todos los inquilinos posteriores del proyecto de clúster Google Cloud .
Roles de la interfaz de usuario
Este rol permite a los arrendatarios consultar todos los espacios de nombres. Esto es necesario para saber a qué espacios de nombres tienen acceso los usuarios para crear servicios /sdk/gcloud/reference/logging/sinks/create
.
kubectl create clusterrole \
namespace-lister \
--verb=list \
--resource=namespaces
Este rol permite a los arrendatarios ver los servicios de Knative Serving. Este paso es necesario para mostrar los servicios en la interfaz de usuario de Knative Serving.
kubectl create clusterrole \
ksvc-lister \
--verb=list \
--resource=services.serving.knative.dev
Crear roles de clúster
Solo se necesita uno de estos permisos. El primer permiso permite a los inquilinos manipular cualquier recurso de su espacio de nombres. El segundo permiso permite crear un conjunto más limitado de servicios de Knative Serving.
kubectl create clusterrole \
kubernetes-developer \
--verb="*" \
--resource="*.*"
Si el permiso kubernetes-developer
es demasiado permisivo, los arrendatarios podrán crear servicios de Knative en sus espacios de nombres y ver los demás recursos de Knative.
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: knative-developer
rules:
- apiGroups: ["serving.knative.dev"]
resources: ["services"]
verbs: ["*"]
- apiGroups: ["serving.knative.dev"]
resources: ["*"]
verbs: ["get", "list", "watch"]
EOF
Crea un espacio de nombres de inquilino y asigna permisos.
Ten en cuenta que esto presupone que has configurado Grupos de Google para GKE. Es necesario hacerlo en cada inquilino.
export TENANT_GROUP=tenant-a@company.com
TENANT_GROUP debe formar parte de SECURITY_GROUP
Permiso para ver todos los espacios de nombres
Para consultar el clúster de GKE, todos los arrendatarios deben tener la capacidad de enumerar los espacios de nombres. Actualmente no hay ningún auth can-i que devuelva los espacios de nombres en los que se puede realizar una acción. La única solución alternativa es enumerar los espacios de nombres y, a continuación, consultar cada espacio de nombres individualmente.
kubectl create clusterrolebinding \
all-namespace-listers \
--clusterrole=namespace-lister \
--group=$TENANT_GROUP
Capacidad para enumerar servicios de Knative
kubectl create clusterrolebinding \
all-ksvc-listers \
--clusterrole=ksvc-lister \
--group=$TENANT_GROUP
Permiso para manipular recursos en el espacio de nombres
Primero, crea el espacio de nombres:
kubectl create namespace $NAMESPACE
Si usas el rol kubernetes-developer:
kubectl create rolebinding \
kubernetes-developer \
--namespace=$NAMESPACE \
--clusterrole=kubernetes-developer \
--group=$TENANT_GROUP
Si usas el rol knative-developer:
kubectl create rolebinding \
kubernetes-developer \
--namespace=$NAMESPACE \
--clusterrole=knative-developer \
--group=$TENANT_GROUP
Añadir la posibilidad de que el arrendatario acceda a la dirección IP externa
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ingress-reader
rules:
- apiGroups: [""]
resources: ["services"]
verbs: ["get"]
EOF
kubectl create rolebinding \
ingress-reader-$TENANT_GROUP \
--namespace=istio-system \
--clusterrole=ingress-reader \
--group=$TENANT_GROUP
Verificar
Para comprobar que ha configurado correctamente la multitenencia empresarial, abra el proyecto de inquilino en Knative Serving e implemente un servicio en un clúster de GKE. Google Cloud
Enhorabuena, tu arrendatario ahora puede interactuar con los servicios y recursos del espacio de nombres del clúster de GKE al que se le ha concedido acceso.
Referencia de arquitectura multicliente
- Arquitectura multiinquilino de GKE
- Prácticas recomendadas para la multitenencia de GKE
- Cuota de espacio de nombres