1. Introdução
O GCP oferece suporte a várias interfaces no nível da instância de VM há muito tempo. Com várias interfaces, uma VM pode conectar até sete novas interfaces (padrão + 7 interfaces) a diferentes VPCs. A rede do GKE agora estende esse comportamento aos pods que estão sendo executados nos nós. Antes desse recurso, os clusters do GKE permitiam que todos os NodePools tivessem apenas uma interface e, portanto, fossem mapeados para uma única VPC. Com o recurso de várias redes em pods, um usuário agora pode ativar mais de uma interface em nós e pods em um cluster do GKE.
O que você vai criar
Neste tutorial, você vai criar um ambiente multinic do GKE abrangente que ilustra os casos de uso mostrados na Figura 1.
- Crie o netdevice-l3-pod usando o busybox para:
- Faça um PING e wget -S para a instância netdevice-apache na netdevice-vpc em eth2
- Execute um PING e wget -S na instância l3-apache na l3-vpc em eth1
- Crie um l3-pod usando o busybox para realizar um PING e wget -S na instância l3-apache em eth1
Nos dois casos de uso, a interface eth0 do pod está conectada à rede padrão.
Figura 1.

O que você vai aprender
- Como criar uma sub-rede do tipo L3
- Como criar uma sub-rede de tipo netdevice
- Como estabelecer um pool de nós do GKE multi-NIC
- Como criar um pod com recursos de netdevice e L3
- Como criar um pod com recursos da camada 3
- Como criar e validar a rede de objetos do GKE
- Como validar a conectividade com servidores Apache remotos usando PING, wget e registros de firewall
O que é necessário
- Projeto do Google Cloud
2. Terminologia e conceitos
VPC principal: a VPC principal é uma VPC pré-configurada que inclui um conjunto de configurações e recursos padrão. O cluster do GKE é criado nessa VPC.
Sub-rede: no Google Cloud, uma sub-rede é a maneira de criar roteamento entre domínios sem classe (CIDR) com máscaras de rede em uma VPC. Uma sub-rede tem um único intervalo de endereços IP principal que é atribuído aos nós e pode ter vários intervalos secundários que podem pertencer a pods e serviços.
Rede-nó: refere-se a uma combinação dedicada de um par de VPC e sub-rede. Nessa rede de nós, os nós pertencentes ao pool de nós são endereços IP alocados do intervalo de endereços IP principal.
Intervalo secundário: um intervalo secundário do Google Cloud é um CIDR e uma máscara de rede que pertencem a uma região em uma VPC. O GKE usa isso como uma rede de pod de camada 3. Uma VPC pode ter vários intervalos secundários, e um pod pode se conectar a várias redes de pods.
Rede (L3 ou dispositivo): um objeto de rede que serve como ponto de conexão para pods. No tutorial, as redes são l3-network e netdevice-network, em que o dispositivo pode ser netdevice ou dpdk. A rede padrão é obrigatória e criada quando o cluster é criado com base na sub-rede do pool de nós padrão.
As redes da camada 3 correspondem a um intervalo secundário em uma sub-rede, representadas como:
VPC -> Nome da sub-rede -> Nome do intervalo secundário
A rede de dispositivos corresponde a uma sub-rede em uma VPC, representada como:
VPC -> Nome da sub-rede
Rede de pods padrão: o Google Cloud cria uma rede de pods padrão durante a criação do cluster. A rede de pods padrão usa a VPC principal como a rede do nó. Por padrão, a rede de pods padrão está disponível em todos os nós e pods do cluster.
Pods com várias interfaces: não é possível conectar pods com várias interfaces no GKE à mesma rede de pods, porque cada interface do pod precisa estar conectada a uma rede exclusiva.
Atualizar o projeto para oferecer suporte ao codelab
Este codelab usa $variáveis para ajudar na implementação da configuração da gcloud no Cloud Shell.
No Cloud Shell, faça o seguinte:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
3. Configuração da VPC principal
Criar a VPC principal
No Cloud Shell, faça o seguinte:
gcloud compute networks create primary-vpc --project=$projectid --subnet-mode=custom
Criar o nó e as sub-redes secundárias
No Cloud Shell, faça o seguinte:
gcloud compute networks subnets create primary-node-subnet --project=$projectid --range=192.168.0.0/24 --network=primary-vpc --region=us-central1 --enable-private-ip-google-access --secondary-range=sec-range-primay-vpc=10.0.0.0/21
4. Criação de cluster do GKE
Crie o cluster particular do GKE especificando as sub-redes da VPC principal para criar o pool de nós padrão com as flags necessárias: "–enable-multi-networking" e "–enable-dataplane-v2" para oferecer suporte a pools de nós de várias placas de rede (NICs).
No Cloud Shell, crie o cluster do GKE:
gcloud container clusters create multinic-gke \
--zone "us-central1-a" \
--enable-dataplane-v2 \
--enable-ip-alias \
--enable-multi-networking \
--network "primary-vpc" --subnetwork "primary-node-subnet" \
--num-nodes=2 \
--max-pods-per-node=32 \
--cluster-secondary-range-name=sec-range-primay-vpc \
--no-enable-master-authorized-networks \
--release-channel "regular" \
--enable-private-nodes --master-ipv4-cidr "100.100.10.0/28" \
--enable-ip-alias
Validar o cluster multinic-gke
No Cloud Shell, autentique-se com o cluster:
gcloud container clusters get-credentials multinic-gke --zone us-central1-a --project $projectid
No Cloud Shell, valide se dois nós foram gerados do pool padrão:
kubectl get nodes
Exemplo:
user@$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p Ready <none> 2m4s v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb Ready <none> 2m4s v1.27.3-gke.100
5. Configuração do netdevice-vpc
Criar a rede netdevice-vpc
No Cloud Shell, faça o seguinte:
gcloud compute networks create netdevice-vpc --project=$projectid --subnet-mode=custom
Criar as sub-redes netdevice-vpc
No Cloud Shell, crie a sub-rede usada para a rede multinic netdevice:
gcloud compute networks subnets create netdevice-subnet --project=$projectid --range=192.168.10.0/24 --network=netdevice-vpc --region=us-central1 --enable-private-ip-google-access
No Cloud Shell, crie uma sub-rede para a instância netdevice-apache:
gcloud compute networks subnets create netdevice-apache --project=$projectid --range=172.16.10.0/28 --network=netdevice-vpc --region=us-central1 --enable-private-ip-google-access
Configuração do Cloud Router e do NAT
O Cloud NAT é usado no tutorial para instalação de pacotes de software porque a instância de VM não tem um endereço IP externo.
No Cloud Shell, crie o Cloud Router.
gcloud compute routers create netdevice-cr --network netdevice-vpc --region us-central1
No Cloud Shell, crie o gateway NAT.
gcloud compute routers nats create cloud-nat-netdevice --router=netdevice-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
Criar a instância netdevice-apache
Na seção a seguir, você vai criar a instância netdevice-apache.
No Cloud Shell, crie a instância:
gcloud compute instances create netdevice-apache \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=netdevice-apache \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Welcome to the netdevice-apache instance !!' | tee /var/www/html/index.html
EOF"
6. Configuração da l3-vpc
Criar a rede l3-vpc
No Cloud Shell, faça o seguinte:
gcloud compute networks create l3-vpc --project=$projectid --subnet-mode=custom
Crie as sub-redes l3-vpc
No Cloud Shell, crie uma sub-rede com intervalos principal e secundário. O intervalo secundário(sec-range-l3-subnet) é usado para a rede l3 multinic:
gcloud compute networks subnets create l3-subnet --project=$projectid --range=192.168.20.0/24 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access --secondary-range=sec-range-l3-subnet=10.0.8.0/21
No Cloud Shell, crie uma sub-rede para a instância l3-apache:
gcloud compute networks subnets create l3-apache --project=$projectid --range=172.16.20.0/28 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access
Configuração do Cloud Router e do NAT
O Cloud NAT é usado no tutorial para instalação de pacotes de software porque a instância de VM não tem um endereço IP externo.
No Cloud Shell, crie o Cloud Router.
gcloud compute routers create l3-cr --network l3-vpc --region us-central1
No Cloud Shell, crie o gateway NAT.
gcloud compute routers nats create cloud-nat-l3 --router=l3-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
Criar a instância l3-apache
Na seção a seguir, você vai criar a instância l3-apache.
No Cloud Shell, crie a instância:
gcloud compute instances create l3-apache \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=l3-apache \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Welcome to the l3-apache instance !!' | tee /var/www/html/index.html
EOF"
7. Criar o pool de nós multinic
Na seção a seguir, você vai criar um pool de nós multinic com as seguintes flags:
–additional-node-network (obrigatório para interfaces do tipo dispositivo)
Exemplo:
--additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet
–additional-node-network e –additional-pod-network ( obrigatório para interfaces do tipo L3)
Exemplo:
--additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8
Tipo de máquina: ao implantar o pool de nós, considere a dependência do tipo de máquina. Por exemplo, um tipo de máquina como "e2-standard-4" com quatro vCPUs é compatível com até quatro VPCs no total. Por exemplo, netdevice-l3-pod terá um total de três interfaces (padrão, netdevice e l3). Portanto, o tipo de máquina usado no tutorial é e2-standard-4.
No Cloud Shell, crie o pool de nós com um dispositivo do tipo e L3:
gcloud container --project "$projectid" node-pools create "multinic-node-pool" --cluster "multinic-gke" --zone "us-central1-a" --additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet --additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8 --machine-type "e2-standard-4"
8. Validar o multnic-node-pool
No Cloud Shell, valide se três nós foram gerados no multinic-node-pool:
kubectl get nodes
Exemplo:
user@$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p Ready <none> 15m v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb Ready <none> 15m v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-0tfx Ready <none> 3m51s v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-86gz Ready <none> 3m51s v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-t66p Ready <none> 3m51s v1.27.3-gke.100
9. Criar a rede netdevice
Nas etapas a seguir, você vai gerar um objeto do Kubernetes Network e GKENetworkParamSet para criar o netdevice-network, que será usado para associar pods em etapas posteriores.
Crie o objeto netdevice-network
No Cloud Shell, crie o objeto de rede YAML netdevice-network.yaml usando o editor VI ou o nano. Observe que "rotas para" é a sub-rede 172.16.10.0/28 (netdevice-apache) na netdevice-vpc.
apiVersion: networking.gke.io/v1
kind: Network
metadata:
name: netdevice-network
spec:
type: "Device"
parametersRef:
group: networking.gke.io
kind: GKENetworkParamSet
name: "netdevice"
routes:
- to: "172.16.10.0/28"
No Cloud Shell, aplique netdevice-network.yaml:
kubectl apply -f netdevice-network.yaml
No Cloud Shell, valide se o tipo de status netdevice-network é "Pronto".
kubectl describe networks netdevice-network
Exemplo:
user@$ kubectl describe networks netdevice-network
Name: netdevice-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:37:38Z
Generation: 1
Resource Version: 1578594
UID: 46d75374-9fcc-42be-baeb-48e074747052
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: netdevice
Routes:
To: 172.16.10.0/28
Type: Device
Status:
Conditions:
Last Transition Time: 2023-07-30T22:37:38Z
Message: GKENetworkParamSet resource was deleted: netdevice
Reason: GNPDeleted
Status: False
Type: ParamsReady
Last Transition Time: 2023-07-30T22:37:38Z
Message: Resource referenced by params is not ready
Reason: ParamsNotReady
Status: False
Type: Ready
Events: <none>
Criar o GKENetworkParamSet
No Cloud Shell, crie o objeto de rede YAML netdevice-network-parm.yaml usando o editor VI ou o nano. A especificação é mapeada para a implantação da sub-rede netdevice-vpc.
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
name: "netdevice"
spec:
vpc: "netdevice-vpc"
vpcSubnet: "netdevice-subnet"
deviceMode: "NetDevice"
No Cloud Shell, aplique netdevice-network-parm.yaml
kubectl apply -f netdevice-network-parm.yaml
No Cloud Shell, valide o motivo do status netdevice-network GNPParmsReady e NetworkReady:
kubectl describe networks netdevice-network
Exemplo:
user@$ kubectl describe networks netdevice-network
Name: netdevice-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:37:38Z
Generation: 1
Resource Version: 1579791
UID: 46d75374-9fcc-42be-baeb-48e074747052
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: netdevice
Routes:
To: 172.16.10.0/28
Type: Device
Status:
Conditions:
Last Transition Time: 2023-07-30T22:39:44Z
Message:
Reason: GNPParamsReady
Status: True
Type: ParamsReady
Last Transition Time: 2023-07-30T22:39:44Z
Message:
Reason: NetworkReady
Status: True
Type: Ready
Events: <none>
No Cloud Shell, valide o bloco CIDR gkenetworkparamset 192.168.10.0/24 usado para a interface dos pods em uma etapa posterior.
kubectl describe gkenetworkparamsets.networking.gke.io netdevice
Exemplo:
user@$ kubectl describe gkenetworkparamsets.networking.gke.io netdevice
Name: netdevice
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: GKENetworkParamSet
Metadata:
Creation Timestamp: 2023-07-30T22:39:43Z
Finalizers:
networking.gke.io/gnp-controller
networking.gke.io/high-perf-finalizer
Generation: 1
Resource Version: 1579919
UID: 6fe36b0c-0091-4b6a-9d28-67596cbce845
Spec:
Device Mode: NetDevice
Vpc: netdevice-vpc
Vpc Subnet: netdevice-subnet
Status:
Conditions:
Last Transition Time: 2023-07-30T22:39:43Z
Message:
Reason: GNPReady
Status: True
Type: Ready
Network Name: netdevice-network
Pod CID Rs:
Cidr Blocks:
192.168.10.0/24
Events: <none>
10. Criar as redes L3
Nas etapas a seguir, você vai gerar um objeto do Kubernetes Network e GKENetworkParamSet para criar a rede l3 que será usada para associar pods nas etapas posteriores.
Criar o objeto de rede l3
No Cloud Shell, crie o objeto de rede YAML l3-network.yaml usando o editor VI ou o nano. Observe que "rotas para" é a sub-rede 172.16.20.0/28 (l3-apache) na l3-vpc.
apiVersion: networking.gke.io/v1
kind: Network
metadata:
name: l3-network
spec:
type: "L3"
parametersRef:
group: networking.gke.io
kind: GKENetworkParamSet
name: "l3-network"
routes:
- to: "172.16.20.0/28"
No Cloud Shell, aplique l3-network.yaml:
kubectl apply -f l3-network.yaml
No Cloud Shell, valide se o tipo de status da rede l3 é "Ready".
kubectl describe networks l3-network
Exemplo:
user@$ kubectl describe networks l3-network
Name: l3-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:43:54Z
Generation: 1
Resource Version: 1582307
UID: 426804be-35c9-4cc5-bd26-00b94be2ef9a
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: l3-network
Routes:
to: 172.16.20.0/28
Type: L3
Status:
Conditions:
Last Transition Time: 2023-07-30T22:43:54Z
Message: GKENetworkParamSet resource was deleted: l3-network
Reason: GNPDeleted
Status: False
Type: ParamsReady
Last Transition Time: 2023-07-30T22:43:54Z
Message: Resource referenced by params is not ready
Reason: ParamsNotReady
Status: False
Type: Ready
Events: <none>
Criar o GKENetworkParamSet
No Cloud Shell, crie o objeto de rede YAML l3-network-parm.yaml usando o editor VI ou o nano. Observe que a especificação é mapeada para a implantação da sub-rede l3-vpc.
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
name: "l3-network"
spec:
vpc: "l3-vpc"
vpcSubnet: "l3-subnet"
podIPv4Ranges:
rangeNames:
- "sec-range-l3-subnet"
No Cloud Shell, aplique l3-network-parm.yaml
kubectl apply -f l3-network-parm.yaml
No Cloud Shell, valide se o motivo do status da l3-network é GNPParmsReady e NetworkReady:
kubectl describe networks l3-network
Exemplo:
user@$ kubectl describe networks l3-network
Name: l3-network
Namespace:
Labels: <none>
Annotations: networking.gke.io/in-use: false
API Version: networking.gke.io/v1
Kind: Network
Metadata:
Creation Timestamp: 2023-07-30T22:43:54Z
Generation: 1
Resource Version: 1583647
UID: 426804be-35c9-4cc5-bd26-00b94be2ef9a
Spec:
Parameters Ref:
Group: networking.gke.io
Kind: GKENetworkParamSet
Name: l3-network
Routes:
To: 172.16.20.0/28
Type: L3
Status:
Conditions:
Last Transition Time: 2023-07-30T22:46:14Z
Message:
Reason: GNPParamsReady
Status: True
Type: ParamsReady
Last Transition Time: 2023-07-30T22:46:14Z
Message:
Reason: NetworkReady
Status: True
Type: Ready
Events: <none>
No Cloud Shell, valide o CIDR 10.0.8.0/21 da rede l3 gkenetworkparamset usado para criar a interface do pod.
kubectl describe gkenetworkparamsets.networking.gke.io l3-network
Exemplo:
user@$ kubectl describe gkenetworkparamsets.networking.gke.io l3-network
Name: l3-network
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: GKENetworkParamSet
Metadata:
Creation Timestamp: 2023-07-30T22:46:14Z
Finalizers:
networking.gke.io/gnp-controller
Generation: 1
Resource Version: 1583656
UID: 4c1f521b-0088-4005-b000-626ca5205326
Spec:
podIPv4Ranges:
Range Names:
sec-range-l3-subnet
Vpc: l3-vpc
Vpc Subnet: l3-subnet
Status:
Conditions:
Last Transition Time: 2023-07-30T22:46:14Z
Message:
Reason: GNPReady
Status: True
Type: Ready
Network Name: l3-network
Pod CID Rs:
Cidr Blocks:
10.0.8.0/21
Events: <none>
11. Crie o netdevice-l3-pod
Na seção a seguir, você vai criar o netdevice-l3-pod executando o busybox, conhecido como um "canivete suíço" que oferece suporte a mais de 300 comandos comuns. O pod está configurado para se comunicar com a l3-vpc usando eth1 e netdevice-vpc usando eth2.
No Cloud Shell, crie o contêiner busybox chamado netdevice-l3-pod.yaml usando o editor VI ou nano.
apiVersion: v1
kind: Pod
metadata:
name: netdevice-l3-pod
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"},
{"interfaceName":"eth2","network":"netdevice-network"}
]
spec:
containers:
- name: netdevice-l3-pod
image: busybox
command: ["sleep", "10m"]
ports:
- containerPort: 80
restartPolicy: Always
No Cloud Shell, aplique netdevice-l3-pod.yaml
kubectl apply -f netdevice-l3-pod.yaml
Validar a criação do pod netdevice-l3
No Cloud Shell, valide se o netdevice-l3-pod está em execução:
kubectl get pods netdevice-l3-pod
Exemplo:
user@$ kubectl get pods netdevice-l3-pod
NAME READY STATUS RESTARTS AGE
netdevice-l3-pod 1/1 Running 0 74s
No Cloud Shell, valide os endereços IP atribuídos às interfaces do pod.
kubectl get pods netdevice-l3-pod -o yaml
No exemplo fornecido, o campo networking.gke.io/pod-ips contém os endereços IP associados às interfaces do pod das redes l3-network e netdevice-network. O endereço IP da rede padrão 10.0.1.22 é detalhado em podIPs:
user@$ kubectl get pods netdevice-l3-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"networking.gke.io/default-interface":"eth0","networking.gke.io/interfaces":"[\n{\"interfaceName\":\"eth0\",\"network\":\"default\"},\n{\"interfaceName\":\"eth1\",\"network\":\"l3-network\"},\n{\"interfaceName\":\"eth2\",\"network\":\"netdevice-network\"}\n]\n"},"name":"netdevice-l3-pod","namespace":"default"},"spec":{"containers":[{"command":["sleep","10m"],"image":"busybox","name":"netdevice-l3-pod","ports":[{"containerPort":80}]}],"restartPolicy":"Always"}}
networking.gke.io/default-interface: eth0
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"},
{"interfaceName":"eth2","network":"netdevice-network"}
]
networking.gke.io/pod-ips: '[{"networkName":"l3-network","ip":"10.0.8.4"},{"networkName":"netdevice-network","ip":"192.168.10.2"}]'
creationTimestamp: "2023-07-30T22:49:27Z"
name: netdevice-l3-pod
namespace: default
resourceVersion: "1585567"
uid: d9e43c75-e0d1-4f31-91b0-129bc53bbf64
spec:
containers:
- command:
- sleep
- 10m
image: busybox
imagePullPolicy: Always
name: netdevice-l3-pod
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
networking.gke.io.networks/l3-network.IP: "1"
networking.gke.io.networks/netdevice-network: "1"
networking.gke.io.networks/netdevice-network.IP: "1"
requests:
networking.gke.io.networks/l3-network.IP: "1"
networking.gke.io.networks/netdevice-network: "1"
networking.gke.io.networks/netdevice-network.IP: "1"
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-f2wpb
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: gke-multinic-gke-multinic-node-pool-135699a1-86gz
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
- effect: NoSchedule
key: networking.gke.io.networks/l3-network.IP
operator: Exists
- effect: NoSchedule
key: networking.gke.io.networks/netdevice-network
operator: Exists
- effect: NoSchedule
key: networking.gke.io.networks/netdevice-network.IP
operator: Exists
volumes:
- name: kube-api-access-f2wpb
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:28Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:33Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:33Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2023-07-30T22:49:28Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://dcd9ead2f69824ccc37c109a47b1f3f5eb7b3e60ce3865e317dd729685b66a5c
image: docker.io/library/busybox:latest
imageID: docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
lastState: {}
name: netdevice-l3-pod
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2023-07-30T22:49:32Z"
hostIP: 192.168.0.4
phase: Running
podIP: 10.0.1.22
podIPs:
- ip: 10.0.1.22
qosClass: BestEffort
startTime: "2023-07-30T22:49:28Z"
Validar rotas netdevice-l3-pod
No Cloud Shell, valide as rotas para netdevice-vpc e l3-vpc de netdevice-l3-pod:
kubectl exec --stdin --tty netdevice-l3-pod -- /bin/sh
Forme a instância e valide as interfaces do pod:
ifconfig
No exemplo, eth0 está conectado à rede padrão, eth1 está conectado à rede l3 e eth2 está conectado à rede netdevice.
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 26:E3:1B:14:6E:0C
inet addr:10.0.1.22 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:558 (558.0 B)
eth1 Link encap:Ethernet HWaddr 92:78:4E:CB:F2:D4
inet addr:10.0.8.4 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:446 (446.0 B) TX bytes:516 (516.0 B)
eth2 Link encap:Ethernet HWaddr 42:01:C0:A8:0A:02
inet addr:192.168.10.2 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:50581 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:26169 (25.5 KiB) TX bytes:2148170 (2.0 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
No netdevice-l3-pod, valide as rotas para netdevice-vpc (172.16.10.0/28) e l3-vpc (172.16.20.0/28).
Forme a instância e valide as rotas do pod:
ip route
Exemplo:
/ # ip route
default via 10.0.1.1 dev eth0 #primary-vpc
10.0.1.0/24 via 10.0.1.1 dev eth0 src 10.0.1.22
10.0.1.1 dev eth0 scope link src 10.0.1.22
10.0.8.0/21 via 10.0.8.1 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.1 dev eth1 scope link
172.16.10.0/28 via 192.168.10.1 dev eth2 #netdevice-vpc (netdevice-apache subnet)
172.16.20.0/28 via 10.0.8.1 dev eth1 #l3-vpc (l3-apache subnet)
192.168.10.0/24 via 192.168.10.1 dev eth2 #pod interface subnet
192.168.10.1 dev eth2 scope link
Para voltar ao Cloud Shell, saia do pod na instância.
exit
12. Crie o l3-pod
Na seção a seguir, você vai criar o pod l3 executando o busybox, conhecido como um "canivete suíço" que oferece suporte a mais de 300 comandos comuns. O pod está configurado para se comunicar com a l3-vpc usando apenas eth1.
No Cloud Shell, crie o contêiner busybox chamado l3-pod.yaml usando o editor VI ou o nano.
apiVersion: v1
kind: Pod
metadata:
name: l3-pod
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"}
]
spec:
containers:
- name: l3-pod
image: busybox
command: ["sleep", "10m"]
ports:
- containerPort: 80
restartPolicy: Always
No Cloud Shell, aplique l3-pod.yaml
kubectl apply -f l3-pod.yaml
Validar a criação do l3-pod
No Cloud Shell, valide se o netdevice-l3-pod está em execução:
kubectl get pods l3-pod
Exemplo:
user@$ kubectl get pods l3-pod
NAME READY STATUS RESTARTS AGE
l3-pod 1/1 Running 0 52s
No Cloud Shell, valide os endereços IP atribuídos às interfaces do pod.
kubectl get pods l3-pod -o yaml
No exemplo fornecido, o campo networking.gke.io/pod-ips contém os endereços IP associados às interfaces do pod da rede l3. O endereço IP da rede padrão 10.0.2.12 é detalhado em podIPs:
user@$ kubectl get pods l3-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"networking.gke.io/default-interface":"eth0","networking.gke.io/interfaces":"[\n{\"interfaceName\":\"eth0\",\"network\":\"default\"},\n{\"interfaceName\":\"eth1\",\"network\":\"l3-network\"}\n]\n"},"name":"l3-pod","namespace":"default"},"spec":{"containers":[{"command":["sleep","10m"],"image":"busybox","name":"l3-pod","ports":[{"containerPort":80}]}],"restartPolicy":"Always"}}
networking.gke.io/default-interface: eth0
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"l3-network"}
]
networking.gke.io/pod-ips: '[{"networkName":"l3-network","ip":"10.0.8.22"}]'
creationTimestamp: "2023-07-30T23:22:29Z"
name: l3-pod
namespace: default
resourceVersion: "1604447"
uid: 79a86afd-2a50-433d-9d48-367acb82c1d0
spec:
containers:
- command:
- sleep
- 10m
image: busybox
imagePullPolicy: Always
name: l3-pod
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
networking.gke.io.networks/l3-network.IP: "1"
requests:
networking.gke.io.networks/l3-network.IP: "1"
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-w9d24
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: gke-multinic-gke-multinic-node-pool-135699a1-t66p
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
- effect: NoSchedule
key: networking.gke.io.networks/l3-network.IP
operator: Exists
volumes:
- name: kube-api-access-w9d24
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:29Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:35Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:35Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2023-07-30T23:22:29Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://1d5fe2854bba0a0d955c157a58bcfd4e34cecf8837edfd7df2760134f869e966
image: docker.io/library/busybox:latest
imageID: docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
lastState: {}
name: l3-pod
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2023-07-30T23:22:35Z"
hostIP: 192.168.0.5
phase: Running
podIP: 10.0.2.12
podIPs:
- ip: 10.0.2.12
qosClass: BestEffort
startTime: "2023-07-30T23:22:29Z"
Validar rotas de l3-pod
No Cloud Shell, valide as rotas para l3-vpc do netdevice-l3-pod:
kubectl exec --stdin --tty l3-pod -- /bin/sh
Forme a instância e valide as interfaces do pod:
ifconfig
No exemplo, eth0 está conectado à rede padrão e eth1 está conectado à rede l3.
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 22:29:30:09:6B:58
inet addr:10.0.2.12 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:558 (558.0 B)
eth1 Link encap:Ethernet HWaddr 6E:6D:FC:C3:FF:AF
inet addr:10.0.8.22 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:446 (446.0 B) TX bytes:516 (516.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
No l3-pod, valide as rotas para a l3-vpc (172.16.20.0/28).
Forme a instância e valide as rotas do pod:
ip route
Exemplo:
/ # ip route
default via 10.0.2.1 dev eth0 #primary-vpc
10.0.2.0/24 via 10.0.2.1 dev eth0 src 10.0.2.12
10.0.2.1 dev eth0 scope link src 10.0.2.12
10.0.8.0/21 via 10.0.8.17 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.17 dev eth1 scope link #pod interface subnet
172.16.20.0/28 via 10.0.8.17 dev eth1 #l3-vpc (l3-apache subnet)
Para voltar ao Cloud Shell, saia do pod na instância.
exit
13. Atualizações do firewall
Para permitir a conectividade do GKE multicnic-pool com o netdevice-vpc, são necessárias regras de firewall de entrada l3-vpc. Você vai criar regras de firewall especificando o intervalo de origem como a sub-rede da rede de pods, por exemplo, netdevice-subnet, sec-range-l3-subnet.
Por exemplo, o contêiner criado recentemente, l3-pod, interface eth2 10.0.8.22 (alocado da sec-range-l3-subnet) é o endereço IP de origem ao se conectar à instância l3-apache na l3-vpc.
netdevice-vpc: Allow from netdevice-subnet to netdevice-apache
No Cloud Shell, crie a regra de firewall na netdevice-vpc, permitindo que a netdevice-subnet acesse a instância netdevice-apache.
gcloud compute --project=$projectid firewall-rules create allow-ingress-from-netdevice-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=netdevice-vpc --action=ALLOW --rules=all --source-ranges=192.168.10.0/24 --enable-logging
l3-vpc: permitir de sec-range-l3-subnet para l3-apache
No Cloud Shell, crie a regra de firewall na l3-vpc, permitindo que sec-range-l3-subnet acesse a instância l3-apache.
gcloud compute --project=$projectid firewall-rules create allow-ingress-from-l3-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=l3-vpc --action=ALLOW --rules=all --source-ranges=10.0.8.0/21 --enable-logging
14. Validar a conectividade do pod
Na seção a seguir, você vai verificar a conectividade com as instâncias do Apache nos pods netdevice-l3-pod e l3-pod fazendo login nos pods e executando um wget -S que valida o download da página inicial dos servidores Apache. Como o netdevice-l3-pod está configurado com interfaces do netdevice-network e do l3-network, é possível se conectar aos servidores Apache em netdevice-vpc e l3-vpc.
Por outro lado, ao executar um wget -S do l3-pod, não é possível se conectar ao servidor Apache em netdevice-vpc, já que o l3-pod só está configurado com uma interface da l3-network.
Obter o endereço IP do servidor Apache
No console do Cloud, acesse Compute Engine → Instâncias de VM para conferir o endereço IP dos servidores Apache.

Teste de conectividade de netdevice-l3-pod para netdevice-apache
No Cloud Shell, faça login em netdevice-l3-pod:
kubectl exec --stdin --tty netdevice-l3-pod -- /bin/sh
No contêiner, faça um ping na instância netdevice-apache com base no endereço IP obtido na etapa anterior.
ping <insert-your-ip> -c 4
Exemplo:
/ # ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes
64 bytes from 172.16.10.2: seq=0 ttl=64 time=1.952 ms
64 bytes from 172.16.10.2: seq=1 ttl=64 time=0.471 ms
64 bytes from 172.16.10.2: seq=2 ttl=64 time=0.446 ms
64 bytes from 172.16.10.2: seq=3 ttl=64 time=0.505 ms
--- 172.16.10.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.446/0.843/1.952 ms
/ #
No Cloud Shell, execute um wget -S na instância netdevice-apache com base no endereço IP obtido na etapa anterior. "200 OK" indica que o download da página da Web foi concluído.
wget -S <insert-your-ip>
Exemplo:
/ # wget -S 172.16.10.2
Connecting to 172.16.10.2 (172.16.10.2:80)
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 03:12:58 GMT
Server: Apache/2.4.56 (Debian)
Last-Modified: Sat, 29 Jul 2023 00:32:44 GMT
ETag: "2c-6019555f54266"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
saving to 'index.html'
index.html 100% |********************************| 44 0:00:00 ETA
'index.html' saved
/ #
Teste de conectividade netdevice-l3-pod para l3-apache
No Cloud Shell, faça um ping na instância l3-apache com base no endereço IP obtido na etapa anterior.
ping <insert-your-ip> -c 4
Exemplo:
/ # ping 172.16.20.3 -c 4
PING 172.16.20.3 (172.16.20.3): 56 data bytes
64 bytes from 172.16.20.3: seq=0 ttl=63 time=2.059 ms
64 bytes from 172.16.20.3: seq=1 ttl=63 time=0.533 ms
64 bytes from 172.16.20.3: seq=2 ttl=63 time=0.485 ms
64 bytes from 172.16.20.3: seq=3 ttl=63 time=0.462 ms
--- 172.16.20.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.462/0.884/2.059 ms
/ #
No Cloud Shell, exclua o arquivo index.html anterior e execute um wget -S na instância l3-apache com base no endereço IP obtido na etapa anterior. "200 OK" indica que o download da página da Web foi concluído.
rm index.html
wget -S <insert-your-ip>
Exemplo:
/ # rm index.html
/ # wget -S 172.16.20.3
Connecting to 172.16.20.3 (172.16.20.3:80)
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 03:41:32 GMT
Server: Apache/2.4.56 (Debian)
Last-Modified: Mon, 31 Jul 2023 03:24:21 GMT
ETag: "25-601bff76f04b7"
Accept-Ranges: bytes
Content-Length: 37
Connection: close
Content-Type: text/html
saving to 'index.html'
index.html 100% |*******************************************************************************************************| 37 0:00:00 ETA
'index.html' saved
Para voltar ao Cloud Shell, saia do pod na instância.
exit
Teste de conectividade de l3-pod para netdevice-apache
No Cloud Shell, faça login em l3-pod:
kubectl exec --stdin --tty l3-pod -- /bin/sh
No contêiner, faça um ping na instância netdevice-apache com base no endereço IP obtido na etapa anterior. Como o l3-pod não tem uma interface associada à netdevice-network, o ping vai falhar.
ping <insert-your-ip> -c 4
Exemplo:
/ # ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes
--- 172.16.10.2 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
Opcional:no Cloud Shell, execute um wget -S na instância netdevice-apache com base no endereço IP obtido na etapa anterior, que vai atingir o tempo limite.
wget -S <insert-your-ip>
Exemplo:
/ # wget -S 172.16.10.2
Connecting to 172.16.10.2 (172.16.10.2:80)
wget: can't connect to remote host (172.16.10.2): Connection timed out
Teste de conectividade de l3-pod para l3-apache
No Cloud Shell, faça um ping na instância l3-apache com base no endereço IP obtido na etapa anterior.
ping <insert-your-ip> -c 4
Exemplo:
/ # ping 172.16.20.3 -c 4
PING 172.16.20.3 (172.16.20.3): 56 data bytes
64 bytes from 172.16.20.3: seq=0 ttl=63 time=1.824 ms
64 bytes from 172.16.20.3: seq=1 ttl=63 time=0.513 ms
64 bytes from 172.16.20.3: seq=2 ttl=63 time=0.482 ms
64 bytes from 172.16.20.3: seq=3 ttl=63 time=0.532 ms
--- 172.16.20.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.482/0.837/1.824 ms
/ #
No Cloud Shell, execute um wget -S na instância l3-apache com base no endereço IP obtido na etapa anterior. "200 OK" indica que o download da página da Web foi concluído.
wget -S <insert-your-ip>
Exemplo:
/ # wget -S 172.16.20.3
Connecting to 172.16.20.3 (172.16.20.3:80)
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2023 03:52:08 GMT
Server: Apache/2.4.56 (Debian)
Last-Modified: Mon, 31 Jul 2023 03:24:21 GMT
ETag: "25-601bff76f04b7"
Accept-Ranges: bytes
Content-Length: 37
Connection: close
Content-Type: text/html
saving to 'index.html'
index.html 100% |*******************************************************************************************************| 37 0:00:00 ETA
'index.html' saved
/ #
15. Registros do firewall
O recurso de geração de registros de regras de firewall permite auditar, verificar e analisar os efeitos das suas regras de firewall. Por exemplo, é possível determinar se uma regra de firewall criada para negar tráfego está funcionando conforme o esperado. A geração de registros de regras de firewall também é útil quando é preciso determinar quantas conexões são afetadas por uma determinada regra de firewall.
No tutorial, você ativou a geração de registros de firewall ao criar as regras de firewall de entrada. Vamos analisar as informações obtidas dos registros.
No console do Cloud, navegue até Geração de registros → Análise de registros.
Insira a consulta abaixo de acordo com a captura de tela e selecione "Executar consulta jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")"

Analisar uma captura fornece elementos de informação para administradores de segurança, que vão desde o endereço IP de origem e destino, porta, protocolo e nome do pool de nós.

Para analisar mais registros de firewall, navegue até "Rede VPC" → "Firewall" → "allow-ingress-from-netdevice-network-to-all-vpc-instances" e selecione "Ver na Análise de registros".
16. Limpar
No Cloud Shell, exclua os componentes do tutorial.
gcloud compute instances delete l3-apache netdevice-apache --zone=us-central1-a --quiet
gcloud compute routers delete l3-cr netdevice-cr --region=us-central1 --quiet
gcloud container clusters delete multinic-gke --zone=us-central1-a --quiet
gcloud compute firewall-rules delete allow-ingress-from-l3-network-to-all-vpc-instances allow-ingress-from-netdevice-network-to-all-vpc-instances --quiet
gcloud compute networks subnets delete l3-apache l3-subnet netdevice-apache netdevice-subnet primary-node-subnet --region=us-central1 --quiet
gcloud compute networks delete l3-vpc netdevice-vpc primary-vpc --quiet
17. Parabéns
Parabéns! Você configurou e validou com sucesso a criação de um pool de nós multinic e de pods executando o busybox para validar a conectividade da camada 3 e do tipo de dispositivo com servidores Apache usando PING e wget.
Você também aprendeu a usar os registros de firewall para inspecionar pacotes de origem e destino entre os contêineres de pod e os servidores Apache.
A Cosmopup acha que os tutoriais são incríveis!

Leituras e vídeos complementares
- Criando um cluster do GKE (demonstração)
- GKE: conceitos de rede
- Blogs sobre contêineres e Kubernetes