Este tutorial demonstra como usar políticas de rede de clusters para controlar que pods recebem tráfego de rede de entrada e que pods podem enviar tráfego de saída. Para mais informações, consulte o artigo Criar uma política de rede de clusters.
As políticas de rede permitem-lhe limitar as ligações entre agrupamentos. Por conseguinte, a utilização de políticas de rede oferece uma melhor segurança, reduzindo o raio de comprometimento.
Tenha em atenção que as políticas de rede determinam se uma ligação é permitida e não oferecem funcionalidades de nível superior, como autorização ou transporte seguro (como SSL/TLS).
Criar um cluster do GKE com a aplicação da política de rede
Para criar um cluster de contentores com a aplicação da política de rede, execute o seguinte comando:
gcloud container clusters create test --enable-network-policy
Restringir o tráfego de entrada para agrupamentos
Os recursos do Kubernetes NetworkPolicy permitem-lhe configurar políticas de acesso à rede
para os pods. Os objetos NetworkPolicy contêm as seguintes informações:
Pods aos quais as políticas de rede se aplicam, normalmente designados por um seletor de etiquetas
Tipo de tráfego afetado pela política de rede: entrada para tráfego de entrada, saída para tráfego de saída ou ambos
Para políticas de entrada, que pods podem estabelecer ligação aos pods especificados
Para políticas de saída, os pods aos quais os pods especificados se podem ligar
Primeiro, execute uma aplicação de servidor Web com a etiqueta app=hello e exponha-a internamente no cluster:
kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
Em seguida, configure um NetworkPolicy para permitir o tráfego para os hello-web
Pods apenas a partir dos app=foo Pods. O outro tráfego recebido de agrupamentos que não têm esta etiqueta, o tráfego externo e o tráfego de agrupamentos noutros espaços de nomes são bloqueados.
O seguinte manifesto seleciona pods com a etiqueta app=hello e especifica uma política de entrada para permitir tráfego apenas de pods com a etiqueta app=foo:
Para aplicar esta política ao cluster, execute o seguinte comando:
kubectl apply -f hello-allow-from-foo.yaml
Valide a política de entrada
Primeiro, execute um pod temporário com a etiqueta app=foo e obtenha um shell no pod:
kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t test-1
Faça um pedido ao ponto final hello-web:8080 para verificar se o tráfego
recebido é permitido:
/ # wget -qO- --timeout=2 http://hello-web:8080Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z / # exit
O tráfego do Pod app=foo para os Pods app=hello está ativado.
Em seguida, execute um pod temporário com uma etiqueta diferente (app=other) e obtenha um shell
no pod:
kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1
Faça o mesmo pedido para observar que o tráfego não é permitido e, por isso, o pedido excede o limite de tempo. Em seguida, saia da shell do pod:
/ # wget -qO- --timeout=2 http://hello-web:8080wget: download timed out / # exit
Restringir o tráfego de saída dos pods
Pode restringir o tráfego de saída da mesma forma que o tráfego de entrada.
No entanto, para poder consultar nomes de anfitriões internos, como hello-web, ou nomes de anfitriões externos, como www.example.com, tem de permitir a resolução de DNS (Sistema de Nomes de Domínio) nas suas políticas de rede de saída. O tráfego DNS ocorre na porta 53 através dos protocolos TCP e UDP.
Para ativar as políticas de rede de saída, implemente um NetworkPolicy que controle o tráfego de saída dos pods com a etiqueta app=foo, ao mesmo tempo que permite o tráfego apenas para os pods com a etiqueta app=hello, bem como o tráfego DNS.
O seguinte manifesto especifica uma política de rede que controla o tráfego de saída
de pods com a etiqueta app=foo com dois destinos permitidos:
- Pods no mesmo espaço de nomes com a etiqueta
app=hello. - Pods de cluster ou pontos finais externos na porta 53 (UDP e TCP).
Para aplicar esta política ao cluster, execute o seguinte comando:
kubectl apply -f foo-allow-to-hello.yaml
Valide a política de saída
Primeiro, implemente uma nova aplicação Web denominada hello-web-2 e exponha-a
internamente no cluster:
kubectl run hello-web-2 --labels app=hello-2 \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
Em seguida, execute um pod temporário com a etiqueta app=foo e abra uma shell no contentor:
kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never test-3
Valide se o pod consegue estabelecer ligações a hello-web:8080:
/ # wget -qO- --timeout=2 http://hello-web:8080Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6zValide se o pod não consegue estabelecer ligações a hello-web-2:8080:
/ # wget -qO- --timeout=2 http://hello-web-2:8080wget: download timed outValide que o pod não consegue estabelecer ligações a Websites externos, como www.example.com, e saia da shell do pod.
/ # wget -qO- --timeout=2 http://www.example.comwget: download timed out
/ # exit