Esta página descreve como usar o GKE Sandbox para proteger o kernel anfitrião nos seus nós quando os contentores no pod executam código desconhecido ou não fidedigno, ou precisam de isolamento adicional do nó. Esta página explica como pode ativar o GKE Sandbox e monitorizar os seus clusters quando o GKE Sandbox está em execução.
Esta página destina-se a especialistas em segurança que têm de isolar as respetivas cargas de trabalho para proteção adicional contra código desconhecido ou não fidedigno. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Trusted Cloud by S3NS
Antes de ler esta página, certifique-se de que conhece a vista geral do GKE Sandbox.
Ative o GKE Sandbox
O GKE Sandbox está pronto a ser usado em clusters do Autopilot com a versão 1.27.4-gke.800 e posterior do GKE. Para começar a implementar cargas de trabalho do Autopilot numa sandbox, avance para a secção Trabalhar com a sandbox do GKE.
Para usar o GKE Sandbox em clusters GKE Standard novos ou existentes, tem de ativar manualmente o GKE Sandbox no cluster.
Para mais informações sobre os lançamentos de versões da GPU, consulte o artigo Apoio técnico para modelos de GPU para ver detalhes sobre os lançamentos de versões da GPU.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
Ative o GKE Sandbox num novo cluster padrão
O conjunto de nós predefinido, que é criado quando cria um novo cluster, não pode usar o GKE Sandbox se for o único conjunto de nós no cluster, porque as cargas de trabalho do sistema geridas pelo GKE têm de ser executadas separadamente das cargas de trabalho em sandbox não fidedignas. Para ativar o GKE Sandbox durante a criação do cluster, tem de adicionar, pelo menos, um conjunto de nós adicional ao cluster.
Consola
Para ver os seus clusters, visite o menu do Google Kubernetes Engine na Trusted Cloud consola.
Na Trusted Cloud consola, aceda à página Criar um cluster do Kubernetes.
Opcional, mas recomendado: no menu de navegação, em Cluster, clique em Funcionalidades e selecione as seguintes caixas de verificação para que as mensagens do gVisor sejam registadas:
- Cloud Logging
- Cloud Monitoring
- Managed Service for Prometheus
Clique em add_box Adicionar conjunto de nós.
No menu de navegação, em Node Pools, expanda o novo conjunto de nós e clique em Nodes.
Configure as seguintes definições para o node pool:
- Na lista pendente Tipo de imagem, selecione SO otimizado para contentores com o Containerd (cos_containerd). Este é o único tipo de imagem suportado para o GKE Sandbox.
- Em Configuração da máquina, selecione uma Série e um Tipo de máquina.
Opcionalmente, se estiver a executar uma versão do GKE suportada, selecione um tipo de GPU ou TPU. Tem de ser um dos seguintes tipos de GPU:
nvidia-gb200
: NVIDIA GB200 NVL72 (pré-visualização)nvidia-b200
: NVIDIA B200 (180 GB) (pré-visualização)nvidia-h200-141gb
: NVIDIA H200 (141 GB) (pré-visualização)nvidia-h100-mega-80gb
: NVIDIA H100 Mega (80GB)nvidia-h100-80gb
: NVIDIA H100 (80GB)nvidia-a100-80gb
: NVIDIA A100 (80GB)nvidia-tesla-a100
: NVIDIA A100 (40GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
ou os seguintes tipos de TPU:
v4
v5e
v5p
v6e
No menu de navegação, abaixo do nome do conjunto de nós que está a configurar, clique em Segurança e selecione a caixa de verificação Ativar sandbox com gVisor.
Continue a configurar o cluster e os conjuntos de nós conforme necessário.
Clique em Criar.
gcloud
Não é possível ativar o GKE Sandbox para o conjunto de nós predefinido, e não é possível criar conjuntos de nós adicionais ao mesmo tempo que cria um novo cluster com o comando gcloud
. Em alternativa, crie o cluster como faria normalmente. Embora seja opcional, recomendamos que ative
o registo e a monitorização
para que as mensagens do gVisor sejam registadas.
Em seguida, use o comando gcloud container node-pools create
e defina a flag --
sandbox
como type=gvisor
. O tipo de imagem do nó tem de ser cos_containerd
para o GKE Sandbox.
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-version=NODE_VERSION \
--machine-type=MACHINE_TYPE \
--image-type=cos_containerd \
--sandbox type=gvisor
Substitua as seguintes variáveis:
NODE_POOL_NAME
: o nome do novo node pool.CLUSTER_NAME
: o nome do cluster.NODE_VERSION
: a versão a usar para o node pool.MACHINE_TYPE
: o tipo de máquina a usar para os nós.
Para criar um conjunto de nós de GPU com o GKE Sandbox, execute o seguinte comando:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-version=NODE_VERSION \
--machine-type=MACHINE_TYPE \
--accelerator=type=GPU_TYPE,gpu-driver-version=DRIVER_VERSION \
--image-type=cos_containerd \
--sandbox type=gvisor
Substitua o seguinte:
GPU_TYPE
: um tipo de GPU suportado. Para obter detalhes, consulte o GKE Sandbox.MACHINE_TYPE
: uma máquina que corresponda ao tipo de GPU pedido. Para obter detalhes, consulte os requisitos de GPU do Google Kubernetes Engine.DRIVER_VERSION
: a versão do controlador NVIDIA a instalar. Pode ser uma das seguintes opções:default
: instale a versão predefinida do controlador para a sua versão do GKE.latest
: instale a versão mais recente do controlador disponível para a sua versão do GKE. Disponível apenas para nós que usam o SO otimizado para contentores.
Para criar um node pool de TPU com o GKE Sandbox, execute o seguinte comando:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-version=NODE_VERSION \
--num-nodes=NUM_NODES \
--tpu-topology=TPU_TOPOLOGY \
--machine-type=MACHINE_TYPE \
--image-type=cos_containerd \
--sandbox type=gvisor
MACHINE_TYPE
: um tipo de TPU suportado. Para obter detalhes, consulte o GKE Sandbox.
Ative o GKE Sandbox num cluster Standard existente
Pode ativar o GKE Sandbox num cluster padrão existente adicionando um novo conjunto de nós e ativando a funcionalidade para esse conjunto de nós.
Consola
Para criar um novo node pool com o GKE Sandbox ativado:
Aceda à página do Google Kubernetes Engine na Trusted Cloud consola.
Clique no nome do cluster que quer modificar.
Clique em add_box Adicionar conjunto de nós.
Configure a página Detalhes do conjunto de nós conforme selecionado.
No menu de navegação, clique em Nodes e configure as seguintes definições:
- Na lista pendente Tipo de imagem, selecione SO otimizado para contentores com o Containerd (cos_containerd). Este é o único tipo de imagem suportado para o GKE Sandbox.
- Em Configuração da máquina, selecione uma Série e um Tipo de máquina.
Opcionalmente, se estiver a executar uma versão do GKE suportada, selecione um tipo de GPU ou TPU. Tem de ser um dos seguintes tipos de GPU:
nvidia-gb200
: NVIDIA GB200 NVL72 (pré-visualização)nvidia-b200
: NVIDIA B200 (180 GB) (pré-visualização)nvidia-h200-141gb
: NVIDIA H200 (141 GB) (pré-visualização)nvidia-h100-mega-80gb
: NVIDIA H100 Mega (80GB)nvidia-h100-80gb
: NVIDIA H100 (80GB)nvidia-a100-80gb
: NVIDIA A100 (80GB)nvidia-tesla-a100
: NVIDIA A100 (40GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
ou os seguintes tipos de TPU:
v4
v5e
v5p
v6e
No menu de navegação, clique em Segurança e selecione a caixa de verificação Ativar sandbox com gVisor.
Clique em Criar.
gcloud
Para criar um novo conjunto de nós com o GKE Sandbox ativado, use um comando como o seguinte:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--machine-type=MACHINE_TYPE \
--image-type=cos_containerd \
--sandbox type=gvisor
O tipo de imagem do nó tem de ser cos_containerd
para o GKE Sandbox.
Para criar um conjunto de nós de GPU com o GKE Sandbox, execute o seguinte comando:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-version=NODE_VERSION \
--machine-type=MACHINE_TYPE \
--accelerator=type=GPU_TYPE,gpu-driver-version=DRIVER_VERSION \
--image-type=cos_containerd \
--sandbox type=gvisor
Substitua o seguinte:
GPU_TYPE
: um tipo de GPU suportado. Para obter detalhes, consulte o GKE Sandbox.MACHINE_TYPE
: uma máquina que corresponda ao tipo de GPU pedido. Para obter detalhes, consulte os requisitos de GPU do Google Kubernetes Engine.DRIVER_VERSION
: a versão do controlador NVIDIA a instalar. Pode ser uma das seguintes opções:default
: instale a versão predefinida do controlador para a sua versão do GKE.latest
: instale a versão mais recente do controlador disponível para a sua versão do GKE. Disponível apenas para nós que usam o SO otimizado para contentores.
Para criar um node pool de TPU com o GKE Sandbox, execute o seguinte comando:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-version=NODE_VERSION \
--num-nodes=NUM_NODES \
--tpu-topology=TPU_TOPOLOGY \
--machine-type=MACHINE_TYPE \
--image-type=cos_containerd \
--sandbox type=gvisor
MACHINE_TYPE
: um tipo de TPU suportado. Para obter detalhes, consulte o GKE Sandbox.
Opcional: ative a monitorização e o registo
É opcional, mas recomendamos que ative o Cloud Logging e o Cloud Monitoring no cluster para que as mensagens do gVisor sejam registadas. Estes serviços estão ativados por predefinição para novos clusters.
Pode usar a consola Trusted Cloud para ativar estas funcionalidades num cluster existente.
Aceda à página do Google Kubernetes Engine na Trusted Cloud consola.
Clique no nome do cluster que quer modificar.
Em Funcionalidades, no campo Cloud Logging clique em edit Editar Cloud Logging.
Selecione a caixa de verificação Ativar o Cloud Logging.
Clique em Guardar alterações.
Repita os mesmos passos para os campos Cloud Monitoring e Managed Service for Prometheus para ativar essas funcionalidades.
Use o GKE Sandbox no Autopilot e no Standard
Nos clusters do Autopilot e nos clusters Standard com o GKE Sandbox ativado, pede um ambiente em sandbox para um pod especificando a gvisor
RuntimeClass na especificação do pod.
Para clusters do Autopilot, certifique-se de que está a usar a versão 1.27.4-gke.800 ou posterior do GKE.
Execute uma aplicação numa sandbox
Para executar uma implementação num nó com o GKE Sandbox ativado, defina o respetivo spec.template.spec.runtimeClassName
como gvisor
, conforme mostrado no seguinte exemplo:
# httpd.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd
labels:
app: httpd
spec:
replicas: 1
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
runtimeClassName: gvisor
containers:
- name: httpd
image: httpd
Crie a implementação:
kubectl apply -f httpd.yaml
O pod é implementado num nó com o GKE Sandbox ativado. Para validar a implementação, encontre o nó onde o pod está implementado:
kubectl get pods
O resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE
httpd-db5899bc9-dk7lk 1/1 Running 0 24s
Na saída, procure o nome do Pod e, em seguida, verifique o valor de RuntimeClass:
kubectl get pods POD_NAME -o jsonpath='{.spec.runtimeClassName}'
O resultado é gvisor
.
Em alternativa, pode listar a RuntimeClass de cada Pod e procurar os Pods onde está definida como gvisor
:
kubectl get pods -o jsonpath=$'{range .items[*]}{.metadata.name}: {.spec.runtimeClassName}\n{end}'
O resultado é o seguinte:
POD_NAME: gvisor
Este método de verificação de que o Pod está a ser executado numa sandbox é fidedigno porque não depende de dados na própria sandbox. Tudo o que for comunicado a partir da sandbox não é fidedigno, uma vez que pode estar defeituoso ou ser malicioso.
Execute um pod com aceleradores no GKE Sandbox
Para executar uma carga de trabalho de GPU ou TPU no GKE Sandbox, adicione o campo
runtimeClassName: gvisor
ao manifesto, como nos seguintes
exemplos:
Exemplo de manifesto para agrupamentos de GPU no modo padrão:
apiVersion: v1 kind: Pod metadata: name: my-gpu-pod spec: runtimeClassName: gvisor containers: - name: my-gpu-container image: nvidia/samples:vectoradd-cuda10.2 resources: limits: nvidia.com/gpu: 1
Exemplo de manifesto para pods de GPU no modo Autopilot:
apiVersion: v1 kind: Pod metadata: name: my-gpu-pod spec: runtimeClassName: gvisor nodeSelector: cloud.google.com/gke-gpu-driver-version: "latest" cloud.google.com/gke-accelerator: nvidia-tesla-t4 containers: - name: my-gpu-container image: nvidia/samples:vectoradd-cuda10.2 resources: limits: nvidia.com/gpu: 1
Exemplo de manifesto para agrupamentos de TPUs no modo padrão ou automático:
apiVersion: v1 kind: Pod metadata: name: my-tpu-pod spec: runtimeClassName: gvisor nodeSelector: cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice cloud.google.com/gke-tpu-topology: 1x1 containers: - name: my-tpu-container image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest command: - bash - -c - | python -c 'import jax; print("TPU cores:", jax.device_count())' resources: limits: google.com/tpu: 1 requests: google.com/tpu: 1
Pode executar quaisquer pods de acelerador do modo Autopilot ou Standard que cumpram os requisitos de versão e tipo de acelerador no GKE Sandbox adicionando o campo runtimeClassName: gvisor
ao manifesto. Para executar pods de GPU no GKE, consulte o seguinte:
Para executar TPU Pods no GKE, consulte o seguinte:
Os tipos de GPUs suportados para o Autopilot são os seguintes:
nvidia-gb200
: NVIDIA GB200 NVL72 (pré-visualização)nvidia-b200
: NVIDIA B200 (180 GB) (pré-visualização)nvidia-h200-141gb
: NVIDIA H200 (141 GB) (pré-visualização)nvidia-h100-mega-80gb
: NVIDIA H100 Mega (80GB)nvidia-h100-80gb
: NVIDIA H100 (80GB)nvidia-a100-80gb
: NVIDIA A100 (80GB)nvidia-tesla-a100
: NVIDIA A100 (40GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
Execute um pod normal juntamente com pods em sandbox
Os passos nesta secção aplicam-se a cargas de trabalho do modo padrão. Não precisa de executar pods normais juntamente com pods de sandbox no modo Autopilot, porque o modelo de preços do Autopilot elimina a necessidade de otimizar manualmente o número de pods agendados nos nós.
Depois de ativar o GKE Sandbox num conjunto de nós, pode executar aplicações fidedignas nesses nós sem usar um sandbox através de restrições e tolerâncias de nós. Estes pods são denominados "pods normais" para os distinguir dos pods em sandbox.
Os pods normais, tal como os pods em sandbox, são impedidos de aceder a outros Trusted Cloud serviços ou metadados do cluster. Esta prevenção faz parte da configuração do nó. Se os seus pods normais ou pods em sandbox precisarem de acesso a Trusted Cloud serviços, use a Federação do Workload Identity para o GKE.
O GKE Sandbox adiciona a seguinte etiqueta e taint aos nós que podem executar pods em sandbox:
labels:
sandbox.gke.io/runtime: gvisor
taints:
- effect: NoSchedule
key: sandbox.gke.io/runtime
value: gvisor
Além de quaisquer definições de tolerância e afinidade de nós no manifesto do pod, o GKE Sandbox aplica a seguinte tolerância e afinidade de nós a todos os pods com RuntimeClass
definido como gvisor
:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: sandbox.gke.io/runtime
operator: In
values:
- gvisor
tolerations:
- effect: NoSchedule
key: sandbox.gke.io/runtime
operator: Equal
value: gvisor
Para agendar um Pod normal num nó com o GKE Sandbox ativado, aplique manualmente a afinidade de nós e a tolerância descritas anteriormente no manifesto do Pod.
- Se o seu pod puder ser executado em nós com o GKE Sandbox ativado, adicione a tolerância.
- Se o seu pod tiver de ser executado em nós com o GKE Sandbox ativado, adicione a afinidade de nós e a tolerância.
Por exemplo, o seguinte manifesto modifica o manifesto usado em Executar uma aplicação numa sandbox para que seja executado como um Pod normal num nó com Pods em sandbox, removendo o runtimeClass e adicionando a contaminação e a tolerância descritas anteriormente.
# httpd-no-sandbox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-no-sandbox
labels:
app: httpd
spec:
replicas: 1
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: sandbox.gke.io/runtime
operator: In
values:
- gvisor
tolerations:
- effect: NoSchedule
key: sandbox.gke.io/runtime
operator: Equal
value: gvisor
Primeiro, verifique se a implementação não está a ser executada num sandbox:
kubectl get pods -o jsonpath=$'{range .items[*]}{.metadata.name}: {.spec.runtimeClassName}\n{end}'
O resultado é semelhante ao seguinte:
httpd-db5899bc9-dk7lk: gvisor
httpd-no-sandbox-5bf87996c6-cfmmd:
A implementação httpd
criada anteriormente está a ser executada num ambiente de testes, porque a respetiva
runtimeClass é gvisor
. A implementação httpd-no-sandbox
não tem valor para runtimeClass, pelo que não está a ser executada numa sandbox.
Em seguida, valide se a implementação não em sandbox está a ser executada num nó com o GKE Sandbox executando o seguinte comando:
kubectl get pod -o jsonpath=$'{range .items[*]}{.metadata.name}: {.spec.nodeName}\n{end}'
O nome do conjunto de nós está incorporado no valor de nodeName
. Verifique se o pod está a ser executado num nó num conjunto de nós com a GKE Sandbox ativada.
Valide a proteção de metadados
Para validar a afirmação de que os metadados estão protegidos contra nós que podem executar pods em sandbox, pode executar um teste:
Crie uma implementação em sandbox a partir do seguinte manifesto, usando o comando
kubectl apply -f
. Usa a imagemfedora
, que inclui o comandocurl
. O pod executa o comando/bin/sleep
para garantir que a implementação é executada durante 10 000 segundos.# sandbox-metadata-test.yaml apiVersion: apps/v1 kind: Deployment metadata: name: fedora labels: app: fedora spec: replicas: 1 selector: matchLabels: app: fedora template: metadata: labels: app: fedora spec: runtimeClassName: gvisor containers: - name: fedora image: fedora command: ["/bin/sleep","10000"]
Obtenha o nome do Pod através de
kubectl get pods
e, em seguida, usekubectl exec
para se ligar ao Pod de forma interativa.kubectl exec -it POD_NAME /bin/sh
Tem ligação a um contentor em execução no pod, numa sessão do
/bin/sh
.Na sessão interativa, tente aceder a um URL que devolva metadados do cluster:
curl -s "http://169.254.169.254/computeMetadata/v1/instance/attributes/kube-env" -H "Metadata-Flavor: Google"
O comando fica bloqueado e, eventualmente, expira porque os pacotes são ignorados silenciosamente.
Prima Ctrl+C para terminar o comando
curl
e escrevaexit
para se desligar do Pod.Remova a linha
RuntimeClass
do manifesto YAML e volte a implementar o pod usandokubectl apply -f FILENAME
. O pod em sandbox é terminado e recriado num nó sem o GKE Sandbox.Obtenha o novo nome do pod, ligue-se ao mesmo através de
kubectl exec
e execute novamente o comandocurl
. Desta vez, são devolvidos resultados. O resultado deste exemplo foi truncado.ALLOCATE_NODE_CIDRS: "true" API_SERVER_TEST_LOG_LEVEL: --v=3 AUTOSCALER_ENV_VARS: kube_reserved=cpu=60m,memory=960Mi,ephemeral-storage=41Gi;... ...
Digite
exit
para desassociar do Pod.Remova a implementação:
kubectl delete deployment fedora
Desative o GKE Sandbox
Não pode desativar o GKE Sandbox em clusters do GKE Autopilot nem em pools de nós do GKE Standard. Se quiser parar de usar o GKE Sandbox, elimine o conjunto de nós.
O que se segue?
- Saiba mais sobre a gestão de conjuntos de nós.
- Leia a descrição geral de segurança.