Introdução às diretivas de rede Kubernetes para profissionais de segurança



Nota perev. : O autor do artigo - Reuven Harrison - tem mais de 20 anos de experiência em desenvolvimento de software e hoje é o diretor técnico e co-fundador da Tufin, uma empresa que cria soluções de gerenciamento de políticas de segurança. Considerando as políticas de rede do Kubernetes como uma ferramenta poderosa o suficiente para a segmentação de rede em um cluster, ele acredita que elas não são tão fáceis de aplicar na prática. Este material (bastante volumoso) foi projetado para melhorar o conhecimento dos especialistas nesta matéria e ajudá-los a criar as configurações necessárias.

Hoje, muitas empresas estão cada vez mais escolhendo o Kubernetes para executar seus aplicativos. O interesse neste software é tão alto que alguns chamam o Kubernetes de "o novo sistema operacional do data center". Gradualmente, o Kubernetes (ou k8s) começa a ser percebido como uma parte crítica dos negócios, o que requer a organização de processos de negócios maduros, incluindo a segurança da rede.

Para profissionais de segurança que estão intrigados ao trabalhar com o Kubernetes, a política padrão dessa plataforma pode ser uma descoberta real: permita tudo.

Este guia o ajudará a entender a estrutura interna das políticas de rede; Entenda como eles diferem das regras para firewalls comuns. Algumas armadilhas também serão descritas e serão dadas recomendações que ajudarão a proteger aplicativos no Kubernetes.

Diretivas de rede Kubernetes


O mecanismo de diretiva de rede Kubernetes permite controlar a interação dos aplicativos implantados na plataforma no nível da rede (a terceira no modelo OSI). As políticas de rede carecem de alguns dos recursos avançados dos firewalls modernos, como o monitoramento OSI nível 7 e a detecção de ameaças, mas fornecem um nível básico de segurança de rede, que é um bom ponto de partida.

As políticas de rede controlam as comunicações entre os pods


As cargas de trabalho do Kubernetes são distribuídas entre os pods que consistem em um ou mais contêineres implantados juntos. O Kubernetes atribui a cada pod um endereço IP acessível a partir de outros pods. As políticas de rede do Kubernetes definem permissões para grupos de pods da mesma maneira que os grupos de segurança na nuvem são usados ​​para controlar o acesso às instâncias da máquina virtual.

Definindo diretivas de rede


Como outros recursos do Kubernetes, as diretivas de rede são definidas no YAML. No exemplo abaixo, o balance é concedido acesso ao postgres :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: podSelector: matchLabels: app: postgres ingress: - from: - podSelector: matchLabels: app: balance policyTypes: - Ingress 



( Nota : esta captura de tela, como todas as similares subsequentes, não foi criada usando as ferramentas nativas do Kubernetes, mas usando a ferramenta Tufin Orca, desenvolvida pela empresa do autor do artigo original e mencionada no final do artigo.)

Definir sua própria política de rede exigirá conhecimento básico de YAML. Esse idioma é baseado no recuo (especificado por espaços, não por tabulações). Um elemento recuado pertence ao elemento recuado mais próximo acima dele. Um novo item da lista começa com um hífen, todos os outros itens têm valor-chave .

Depois de descrever a política no YAML, use o kubectl para criá-la no cluster:

 kubectl create -f policy.yaml 

Especificação de Diretiva de Rede


A especificação de diretiva de rede Kubernetes inclui quatro elementos:

  1. podSelector : define os pods afetados por esta política (metas) - obrigatórios;
  2. policyTypes : indica que tipos de política estão incluídos: entrada e / ou saída - opcional, no entanto, recomendo que você a registre explicitamente em todos os casos;
  3. ingress : define o tráfego de entrada permitido para os pods de destino - opcional;
  4. egress : define o tráfego de saída permitido dos pods de destino - opcional.

Um exemplo emprestado do site Kubernetes (substituí a role pelo app ) mostra como todos os quatro elementos são usados:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: # <<< matchLabels: app: db policyTypes: # <<< - Ingress - Egress ingress: # <<< - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: # <<< - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978 




Observe que todos os quatro elementos são opcionais. Somente o podSelector é podSelector , outros parâmetros podem ser usados ​​conforme desejado.

Se você omitir policyTypes , a política será interpretada da seguinte maneira:

  • Por padrão, assume-se que define o lado da entrada. Se a política não indicar isso explicitamente, o sistema considerará que todo o tráfego é proibido.
  • O comportamento no lado da saída será determinado pela presença ou ausência do parâmetro de saída correspondente.

Para evitar erros, recomendo sempre especificar explicitamente policyTypes .

De acordo com a lógica acima, se os egress ingress e / ou egress forem omitidos, a política proibirá todo o tráfego (consulte "Regra de remoção" abaixo).

A política padrão é permitir


Se nenhuma política for definida, o Kubernetes por padrão permitirá todo o tráfego. Todos os pods são livres para trocar informações entre si. Do ponto de vista da segurança, isso pode parecer contra-intuitivo, mas lembre-se de que o Kubernetes foi originalmente criado por desenvolvedores para garantir a interoperabilidade do aplicativo. Políticas de rede foram adicionadas mais tarde.

Namespaces


Os espaços para nome são um mecanismo colaborativo do Kubernetes. Eles são projetados para isolar ambientes lógicos um do outro, enquanto a troca de dados entre espaços é permitida por padrão.

Como a maioria dos componentes do Kubernetes, as políticas de rede residem em um espaço para nome específico. No bloco de metadata , você pode especificar a qual espaço a política pertence:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: my-namespace # <<< spec: ... 

Se o espaço para nome não estiver escrito explicitamente nos metadados, o sistema usará o espaço para nome especificado no kubectl (por padrão, namespace=default ):

 kubectl apply -n my-namespace -f namespace.yaml 

Eu recomendo especificar explicitamente um espaço para nome, a menos que você esteja escrevendo uma política destinada a vários espaços para nome ao mesmo tempo.

O elemento podSelector principal em uma política selecionará pods do espaço de nomes ao qual a política pertence (é negado o acesso aos pods de outro espaço de nome).

Da mesma forma, os podSelectors nos blocos de entrada e saída podem selecionar os pods apenas no namespace, a menos que, é claro, você os combine com o namespaceSelector (isso será discutido na seção “Filtrando por namespace e pods”) .

Regras de nomeação de políticas


Os nomes das políticas são exclusivos em um único espaço para nome. Não pode haver duas políticas com o mesmo nome em um espaço, mas pode haver políticas com o mesmo nome em espaços diferentes. Isso é útil quando você deseja aplicar novamente a mesma política em vários espaços.

Eu gosto especialmente de uma maneira de nomear. Consiste em combinar o nome do espaço para nome com os pods de destino. Por exemplo:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres # <<< namespace: default spec: podSelector: matchLabels: app: postgres ingress: - from: - podSelector: matchLabels: app: admin policyTypes: - Ingress 



Etiquetas


Rótulos personalizados podem ser anexados aos objetos do Kubernetes, como pods e espaços para nome. Os rótulos são equivalentes às tags na nuvem. As políticas de rede do Kubernetes usam rótulos para selecionar os pods aos quais se aplicam:

 podSelector: matchLabels: role: db 

... ou os namespaces aos quais eles se aplicam. Neste exemplo, todos os pods nos espaços para nome com os rótulos correspondentes são selecionados:

 namespaceSelector: matchLabels: project: myproject 

Uma ressalva: ao usar o namespaceSelector verifique se os namespaceSelector para namespaceSelector selecionados contêm o rótulo desejado . Lembre-se de que os namespaces kube-system , como default e kube-system , não contêm rótulos por padrão.

Você pode adicionar um rótulo ao espaço da seguinte maneira:

 kubectl label namespace default namespace=default 

Nesse caso, o espaço para nome na seção de metadata deve se referir ao nome real do espaço, e não ao rótulo:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default # <<< spec: ... 

Origem e Destino


As políticas para firewalls consistem em regras com fontes e destinos. As diretivas de rede do Kubernetes são definidas para essa finalidade - um conjunto de pods aos quais são aplicadas e, em seguida, estabelecem regras para o tráfego de entrada (entrada) e / ou saída (saída). Em nosso exemplo, o destino da política será todos os pods no espaço para nome default com um rótulo com a chave do app e o valor db :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: app: db # <<< policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978 




A subseção de ingress nesta política abre o tráfego de entrada para os pods de destino. Em outras palavras, a entrada é a fonte e o destino é o destinatário apropriado. Da mesma forma, a saída é o alvo, e o alvo é sua fonte.



Isso é equivalente a duas regras para o firewall: Ingress → Target; Objetivo → Saída.

Saída e DNS (importante!)


Ao limitar o tráfego de saída, preste atenção especial ao DNS - o Kubernetes usa esse serviço para mapear serviços para endereços IP. Por exemplo, a política a seguir não funcionará porque você não permitiu que o aplicativo de balance acesse o DNS:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres policyTypes: - Egress 



Você pode corrigi-lo, abrindo o acesso ao serviço DNS:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres - to: # <<< ports: # <<< - protocol: UDP # <<< port: 53 # <<< policyTypes: - Egress 



O elemento last to está vazio e, portanto, seleciona indiretamente todos os pods em todos os espaços de nomes , permitindo que o balance envie consultas DNS ao serviço Kubernetes correspondente (geralmente funciona no espaço do kube-system ).

Essa abordagem funciona, mas é excessivamente permissiva e insegura , porque permite direcionar consultas DNS fora do cluster.

Você pode aprimorá-lo em três etapas consecutivas.

1. Permita consultas DNS apenas dentro do cluster adicionando namespaceSelector :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres - to: - namespaceSelector: {} # <<< ports: - protocol: UDP port: 53 policyTypes: - Egress 



2. Permita consultas DNS apenas no kube-system nome do kube-system .

Para fazer isso, adicione um rótulo ao kubectl label namespace kube-system namespace=kube-system kube-system kubectl label namespace kube-system namespace=kube-system : kubectl label namespace kube-system namespace=kube-system - e registre-o na política usando namespaceSelector :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.balance namespace: default spec: podSelector: matchLabels: app: balance egress: - to: - podSelector: matchLabels: app: postgres - to: - namespaceSelector: # <<< matchLabels: # <<< namespace: kube-system # <<< ports: - protocol: UDP port: 53 policyTypes: - Egress 



3. Os paranóicos podem ir ainda mais longe e limitar as consultas DNS a um serviço DNS específico no kube-system . Na seção "Filtrar por namespaces e pods", explicaremos como conseguir isso.

Outra opção é resolver o DNS no nível do espaço para nome. Nesse caso, ele não precisará ser aberto para cada serviço:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.dns namespace: default spec: podSelector: {} # <<< egress: - to: - namespaceSelector: {} ports: - protocol: UDP port: 53 policyTypes: - Egress 

Um podSelector vazio seleciona todos os pods no espaço para nome.



Primeira partida e ordem das regras


Nos firewalls comuns, a ação ("Permitir" ou "Negar") para um pacote é determinada pela primeira regra a ser cumprida. Em Kubernetes, a ordem das políticas é irrelevante.

Por padrão, quando as políticas não são definidas, as comunicações entre os pods são permitidas e elas podem trocar informações livremente. Assim que você começa a formular políticas, cada pod afetado por pelo menos um deles fica isolado de acordo com a disjunção (OR lógica) de todas as políticas que o escolheram. Os pods não afetados por nenhuma política permanecem abertos.

Você pode alterar esse comportamento usando a regra de remoção.

Regra de remoção (Negar)


As políticas de firewall geralmente proíbem qualquer tráfego explicitamente não autorizado.

O Kubernetes não tem uma ação de negação , no entanto, um efeito semelhante pode ser alcançado com uma política regular (de permissão) selecionando um grupo vazio de pods de origem (entrada):

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all namespace: default spec: podSelector: {} policyTypes: - Ingress 



Essa política seleciona todos os pods no espaço para nome e deixa a entrada indefinida, bloqueando todo o tráfego recebido.

Da mesma forma, você pode limitar todo o tráfego de saída do namespace:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-egress namespace: default spec: podSelector: {} policyTypes: - Egress 



Observe que qualquer política adicional que permita o tráfego de pods no espaço para nome terá precedência sobre essa regra (semelhante à adição de uma regra de permissão a uma regra de negação na configuração do firewall).

Permitir tudo (Qualquer-Qualquer-Qualquer-Permitir)


Para criar uma política Permitir Tudo, você deve adicionar a política proibitiva acima com um elemento de ingress vazio:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all namespace: default spec: podSelector: {} ingress: # <<< - {} # <<< policyTypes: - Ingress 



Ele permite o acesso de todos os pods em todos os namespaces (e todos os IPs) a quaisquer pods no namespace default . Esse comportamento é ativado por padrão, portanto, geralmente não precisa ser definido adicionalmente. No entanto, às vezes pode ser necessário desativar temporariamente algumas permissões específicas para diagnosticar o problema.

A regra pode ser restrita e permitida o acesso apenas a um conjunto específico de pods ( app:balance ) no espaço de nome default :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-to-balance namespace: default spec: podSelector: matchLabels: app: balance ingress: - {} policyTypes: - Ingress 



A política a seguir permite todo o tráfego de entrada e saída, incluindo o acesso a qualquer IP fora do cluster:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all spec: podSelector: {} ingress: - {} egress: - {} policyTypes: - Ingress - Egress 




Combinando várias políticas


As políticas são combinadas usando OR lógico em três níveis; as permissões de cada pod são definidas de acordo com a disjunção de todas as políticas que o afetam:

1. Nos campos from e to , você pode definir três tipos de elementos (todos eles são combinados usando OR):

  • namespaceSelector - seleciona o espaço para nome inteiro;
  • podSelector - seleciona pods;
  • ipBlock - seleciona uma sub-rede.

Ao mesmo tempo, o número de elementos (mesmo o mesmo) nas subseções from / to não é limitado. Todos eles serão combinados por OR lógico.

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer - podSelector: matchLabels: app: admin podSelector: matchLabels: app: postgres policyTypes: - Ingress 



2. Dentro da política, a seção de ingress pode ter muitos elementos (combinados por OR lógico). Da mesma forma, a seção de egress pode incluir muitos elementos (também unidos por uma cláusula):

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer - from: - podSelector: matchLabels: app: admin podSelector: matchLabels: app: postgres policyTypes: - Ingress 



3. Várias políticas também são combinadas por OR lógico

Mas, ao combiná-los, há uma limitação que Chris Cooney apontou : o Kubernetes só pode combinar políticas com diferentes policyTypes políticas ( Ingress ou Egress ). As políticas que definem entrada (ou saída) serão substituídas uma pela outra.

O relacionamento entre namespaces


Por padrão, a troca de informações entre espaços para nome é permitida. Isso pode ser alterado usando uma política proibitiva que restrinja o tráfego de saída e / ou entrada para o espaço para nome (consulte "Regra de remoção" acima).

Ao bloquear o acesso ao espaço para nome (consulte "Regra de remoção" acima), você pode fazer exceções à política restritiva, permitindo conexões de um espaço para nome específico usando o namespaceSelector :

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database.postgres namespace: database spec: podSelector: matchLabels: app: postgres ingress: - from: - namespaceSelector: # <<< matchLabels: namespace: default policyTypes: - Ingress 



Como resultado, todos os pods no namespace default terão acesso aos pods do postgres no namespace do database . Mas e se você deseja abrir o acesso ao postgres apenas para pods específicos no espaço para nome default ?

Filtrar por namespaces e pods


O Kubernetes versão 1.11 e superior permite combinar os operadores namespaceSelector e podSelector usando o lógico I. É assim:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database.postgres namespace: database spec: podSelector: matchLabels: app: postgres ingress: - from: - namespaceSelector: matchLabels: namespace: default podSelector: # <<< matchLabels: app: admin policyTypes: - Ingress 



Por que é interpretado como AND em vez do OR usual?

Observe que o podSelector não inicia com um hífen. No YAML, isso significa que podSelector e o namespaceSelector em frente a ele se referem ao mesmo item da lista. Portanto, eles são combinados pelo lógico I.

Adicionar um hífen na frente do podSelector resultará em um novo item da lista que será combinado com o namespaceSelector anterior usando um OR lógico.

Para selecionar pods com um rótulo específico em todos os espaços para nome , insira um namespaceSelector vazio

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: database.postgres namespace: database spec: podSelector: matchLabels: app: postgres ingress: - from: - namespaceSelector: {} podSelector: matchLabels: app: admin policyTypes: - Ingress 



Vários rótulos combinam com AND


As regras para um firewall com muitos objetos (hosts, redes, grupos) são combinadas usando um OR lógico. A regra a seguir funcionará se a origem do pacote corresponder ao Host_1 OU Host_2 :

 | Source | Destination | Service | Action | | ----------------------------------------| | Host_1 | Subnet_A | HTTPS | Allow | | Host_2 | | | | | ----------------------------------------| 

Por outro lado, no Kubernetes, vários rótulos no podSelector ou namespaceSelector são combinados pelo lógico I. Por exemplo, a regra a seguir seleciona os pods que possuem os dois rótulos, role=db AND version=v2 :

 podSelector: matchLabels: role: db version: v2 

A mesma lógica se aplica a todos os tipos de operadores: seletores de objetivos de política, seletores de pod e seletores de namespace.

Sub-redes e endereços IP (IPBlocks)


Os firewalls usam VLANs, endereços IP e sub-redes para segmentar uma rede.

No Kubernetes, os endereços IP são atribuídos aos pods automaticamente e podem ser alterados com frequência; portanto, os rótulos são usados ​​para selecionar pods e namespaces nas políticas de rede.

ipBlocks ( ipBlocks ) são usadas para controlar as conexões externas de entrada (entrada) ou saída (saída) (norte-sul). Por exemplo, esta política concede a todos os pods do espaço de nomes default acesso ao serviço DNS do Google:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-dns namespace: default spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 8.8.8.8/32 ports: - protocol: UDP port: 53 



O seletor de pod vazio neste exemplo significa "selecionar todos os pods no espaço para nome".

Esta política fornece acesso apenas ao 8.8.8.8; o acesso a qualquer outro IP é negado. Portanto, em essência, você bloqueou o acesso ao serviço DNS interno do Kubernetes. Se você ainda deseja abri-lo, especifique-o explicitamente.

Normalmente, os ipBlocks e podSelectors são mutuamente exclusivos, pois os endereços IP internos dos pods não são usados ​​nos ipBlocks . Ao especificar os pods IP internos , você realmente permitirá conexões de / para pods com esses endereços. Na prática, você não saberá qual endereço IP usar, e é por isso que eles não devem ser usados ​​para selecionar pods.

Como um contra-exemplo, a política a seguir inclui todos os IPs e, portanto, permite o acesso a todos os outros pods:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-any namespace: default spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 



Você pode abrir o acesso apenas a IPs externos excluindo os endereços IP internos dos pods. Por exemplo, se a sub-rede do seu pod for 10.16.0.0/14:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: egress-any namespace: default spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 except: - 10.16.0.0/14 



Portas e protocolos


Geralmente, os pods escutam em uma porta. Isso significa que você pode simplesmente omitir números de porta nas políticas e deixar tudo como padrão. No entanto, é recomendável que as políticas sejam feitas o mais restritivo possível, portanto, em alguns casos, você ainda pode especificar portas:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer - podSelector: matchLabels: app: admin ports: # <<< - port: 443 # <<< protocol: TCP # <<< - port: 80 # <<< protocol: TCP # <<< podSelector: matchLabels: app: postgres policyTypes: - Ingress 



Observe que o seletor de ports se aplica a todos os elementos no bloco from ou from ele contém. Para especificar portas diferentes para diferentes conjuntos de elementos, divida a ingress ou egress em várias subseções com ou from e liste suas portas em cada:

 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default.postgres namespace: default spec: ingress: - from: - podSelector: matchLabels: app: indexer ports: # <<< - port: 443 # <<< protocol: TCP # <<< - from: - podSelector: matchLabels: app: admin ports: # <<< - port: 80 # <<< protocol: TCP # <<< podSelector: matchLabels: app: postgres policyTypes: - Ingress 



As portas padrão funcionam:

  • Se você omitir completamente a definição de portas, isso significa todos os protocolos e todas as portas;
  • Se você omitir a definição de protocolo, isso significa TCP;
  • Se você omitir a definição de uma porta, isso significa todas as portas.

Prática recomendada: não confie nos valores padrão, especifique o que você precisa explicitamente.

Observe que é necessário usar portas de pod, não serviços (mais sobre isso no próximo parágrafo).

As políticas são definidas para pods ou serviços?


Geralmente, os pods no Kubernetes se comunicam por meio de um serviço - um balanceador de carga virtual que redireciona o tráfego para os pods que implementam o serviço. Você pode pensar que as políticas de rede controlam o acesso aos serviços, mas não é assim. As políticas de rede do Kubernetes funcionam com portas de pod, não com serviços.

, 80- , 8080 pod', 8080.

: ( pod') .

Service Mesh (, . Istio — . .) .

Ingress, Egress?


— , pod pod' , ( egress-), pod ( , , ingress-).

, .

pod- egress -, . pod'- . pod - , (egress) .

pod'- , ingress -, . pod'-. pod - , (ingress) .

. «Stateful Stateless» .


Kubernetes . , , .


Kubernetes (DNS) egress. , IP- ( aws.com).


. Kubernetes . kubectl Kubernetes , , . Kubernetes . :

 kubernetes get networkpolicy <policy-name> -o yaml 

, Kubernetes .


Kubernetes , API-, , Container Networking Interface (CNI). Kubernetes CNI . CNI , Kubernetes, ( — . .) , , CNI .

, Kubernetes , CNI.

Stateful Stateless?


CNI Kubernetes, , (, Calico Linux conntrack). pod' TCP- . Kubernetes, (statefulness).


Kubernetes:

  1. Service Mesh sidecar- . Istio .
  2. CNI , Kubernetes.
  3. Tufin Orca Kubernetes.

Tufin Orca Kubernetes ( , ).

Informações Adicionais



Conclusão


Kubernetes , . , - . .

, , .

PS do tradutor


Leia também em nosso blog:

Source: https://habr.com/ru/post/pt443190/


All Articles