Mantenha a Aplicação Funcionando com Saída Restrita

KubernetesBeginner
Pratique Agora

Introdução

A Meadow Supply deve mostrar disponibilidade em tempo real e calcular orçamentos de treinamento de cesta por sua API. Neste cenário independente, as aplicações originais estão em execução, mas uma antiga regra de migração de saída da API permite conexões TCP amplas e esqueceu o DNS. Por isso, o catálogo mostra um erro de disponibilidade. Conserte as dependências necessárias e depois retire as permissões desnecessárias da regra antiga sem quebrar a loja nem o serviço separado de expedição.

Use os métodos de namespaces, papéis, políticas, terminal e requisições reais ensinados no laboratório guiado anterior. Este laboratório explica saída de tráfego, requisitos de protocolo/porta do DNS, uma variável de terminal e uniões de políticas antes de usá-los. O cluster real preparado de um único nó contém, de forma independente, a aplicação completa e o ingresso de estoque aprovado; nenhum arquivo ou processo da sua VM anterior é necessário. Não é necessário instalar o cluster nem programar a aplicação. A duração é uma estimativa do autor, não um tempo medido com iniciantes. Todos os produtos e notas de expedição são sintéticos, e os orçamentos de treinamento não reservam, pedem nem cobram nada.

Restaure as Dependências Necessárias da API

Nesta etapa, você restaurará conexões reais de DNS e estoque para a Shop API sem abrir todos os destinos.

Abra Shop. O resultado completo esperado é o mesmo catálogo de três produtos da Meadow Supply de antes: Glass water bottle custa $18.00 com 6 unidades, Everyday notebook $14.00 com 4 e Canvas market bag $24.00 com 0. No cenário inicial, a página diz Live availability unavailable. em vez disso. Os preços permanecem visíveis, mas a aplicação não tem uma alternativa para os dados de estoque e não consegue produzir um orçamento válido. Essa é a falha de dependência intencional a consertar; não a confunda com uma coleção de estoque vazia. Reference ainda deve mostrar as duas notas originais de expedição. Mude para Workspace.

O espaço de trabalho independente é /home/labex/project/stock-policy. Use a mesma recuperação de caminho de antes: pwd, ls e o cd absoluto se necessário. Leia o escopo fornecido:

cd /home/labex/project/stock-policy
cat scope.json

O limite de ingresso do estoque já foi preparado nesta VM. Ele permite o papel de API em meadow-shop; mantenha essa política inalterada. As conexões de saída da API são controladas separadamente. Saída, ou egress, significa tráfego que deixa os Pods selecionados. Uma política Egress que seleciona esses Pods os isola nessa direção, e a união de todas as regras de saída aplicáveis determina o que pode sair. O tráfego de resposta de uma conexão permitida é implicitamente permitido.

Leia a política de migração existente no namespace da API:

kubectl --context=labex-v135 -n meadow-shop get networkpolicies
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress

legacy-egress seleciona role=shop-api e permite a porta TCP 8080 para qualquer destino. Ela não incluiu DNS. CoreDNS é o serviço de nomes do cluster preparado. Um nome de Service precisa de uma consulta DNS antes que uma conexão HTTP possa usar seu endereço. DNS (Domain Name System, sistema de nomes de domínio) traduz nomes em endereços. UDP (User Datagram Protocol, protocolo de datagramas do usuário) envia datagramas individuais; TCP (Transmission Control Protocol, protocolo de controle de transmissão) estabelece conexões. O serviço DNS deste cluster aceita ambos na porta 53, portanto os dois caminhos até os Pods DNS em kube-system são necessários.

O modo dns da ferramenta de diagnóstico fornecida envia uma nova consulta DNS UDP ao resolvedor nesse Pod; dns-tcp envia uma nova consulta TCP. Nenhum deles depende de um resultado em cache da aplicação. Teste a identidade real da API:

./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local

Ambos devem informar NETWORK_TIMEOUT e um código de saída diferente de zero. Essas falhas esperadas dizem respeito à conexão DNS. Para distingui-las de um processo de estoque parado, faça uma requisição explícita de diagnóstico ao endereço original do Service de estoque.

A atribuição a seguir captura a saída de um comando com $(...) na variável de shell stock_ip. -o jsonpath='{.spec.clusterIP}' seleciona somente o campo spec.clusterIP do Service; as aspas mantêm a expressão junta. Essa variável pertence à sessão atual do terminal Workspace. Ela é um valor de diagnóstico, não um destino de política nem um endereço permanente de Pod. Se você se reconectar a um novo shell, repita a atribuição antes de usá-la.

stock_ip=$(kubectl --context=labex-v135 -n meadow-stock get service stock -o jsonpath='{.spec.clusterIP}')

printf exibe a string capturada; %s significa uma string e \n encerra a linha. Aspas duplas preservam o valor expandido como um único argumento:

printf '%s\n' "$stock_ip"

${stock_ip} expande essa variável dentro da URL da requisição. A regra TCP ampla existente permite essa conexão sem precisar de DNS:

./tools/network-test api http "http://${stock_ip}:8080/stock.json"

Espere HTTP_REPLY 200 e os registros originais de estoque. O acesso TCP existe; resolver o nome é uma dependência separada. Nunca coloque esse endereço na política concluída: use as relações estáveis de namespace e papel.

Inspecione as labels reais do DNS antes de selecioná-las. -l k8s-app=kube-dns seleciona os Pods DNS preparados:

kubectl --context=labex-v135 get namespace kube-system --show-labels
kubectl --context=labex-v135 -n kube-system get pods -l k8s-app=kube-dns --show-labels

Crie sua própria política api-egress. Ela seleciona o papel de API. Suas duas regras to são alternativas: DNS em kube-system em UDP/TCP 53, ou inventário em meadow-stock em TCP 8080. Dentro de cada peer individual, os seletores de namespace e de Pod são combinados com AND (E). As portas de cada regra aplicam-se somente aos destinos dessa regra.

mkdir -p mantém um diretório de versão existente. Como ensinado antes, o here-document entre aspas e > gravam somente seu arquivo editável de versão:

mkdir -p release
cat > release/api-egress.yaml <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-egress
  namespace: meadow-shop
spec:
  podSelector:
    matchLabels:
      role: shop-api
  policyTypes:
    - Egress
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: meadow-stock
          podSelector:
            matchLabels:
              role: inventory
      ports:
        - protocol: TCP
          port: 8080
YAML

Leia, aplique e inspecione o manifesto salvo:

cat release/api-egress.yaml
kubectl --context=labex-v135 apply -f release/api-egress.yaml
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy api-egress

Confirme ambos os transportes reais de DNS e a conexão ao estoque pelo nome. A aplicação efetiva pode levar alguns segundos após um apply; repita uma requisição depois de uma breve espera se o limite anterior ainda estiver visível.

./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local
./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json

Espere DNS_REPLY UDP, DNS_REPLY TCP e depois HTTP_REPLY 200 com todos os dados originais de estoque. Mude para Shop e recarregue. A disponibilidade em tempo real deve retornar. Abra Glass water bottle, selecione Quantity 2 e use Try a basket quote. Espere Ready for collection, total de $36.00 e 6 unidades disponíveis, com o aviso de treinamento de que não há reserva. Retorne por Back to product e Back to collection.

Compare o catálogo em tempo real restaurado com este resultado real em execução:

Meadow Supply com suas dependências necessárias restauradas

Isso conclui o conserto das conexões necessárias, mas ainda não comprova que destinos não relacionados sejam negados. Outra política ainda pode acrescentar permissões. Continue para a próxima etapa antes de tratar isso como o limite final.

Para um erro de digitação, retorne com pwd, ls e o cd absoluto. Para um manifesto malformado ou uma requisição de dependência que falhou, leia seu arquivo salvo, a saída de describe e as labels/portas reais ensinadas, corrija o arquivo e reaplique-o. DNS_REPLY é um resultado do serviço de nomes; HTTP_REPLY é uma resposta da aplicação; NETWORK_TIMEOUT significa ausência de resposta dentro do timeout de rede preparado; CONNECTION_REFUSED indica um destino que recusou a conexão. O REQUEST_TIMEOUT limitado da ferramenta inclui toda a requisição e o DNS. Uma falha genérica não comprova uma política correta. Não altere o código da aplicação, labels, arquivos de origem, Pods originais, ingresso do estoque, Services, rede do host nem infraestrutura DNS.

Retire a Permissão Ampla Antiga

Nesta etapa, você removerá a permissão desnecessária da antiga política de migração enquanto preserva o fluxo reparado do cliente e o serviço separado de expedição.

Comece em Workspace, em /home/labex/project/stock-policy. Sua nova política permite somente DNS e estoque. Teste o serviço de expedição não relacionado a partir da API:

./tools/network-test api http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json

Atualmente, ele retorna HTTP_REPLY 200 e as duas notas de expedição. Esse sucesso revela uma permissão indevida; a Shop API não precisa acessar a expedição. A nova política restrita não anula a ampla existente. NetworkPolicies somam as conexões permitidas, independentemente da ordem de aplicação. Para uma conexão funcionar, tanto a saída da origem quanto o ingresso do destino devem permiti-la.

Liste ambas as políticas novamente e depois leia a política de migração gerenciada e seu arquivo de origem original:

kubectl --context=labex-v135 -n meadow-shop get networkpolicies
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress
cat starter/legacy-egress.yaml

A regra legada permite a porta TCP 8080 sem uma restrição de destino to. Essa permissão ainda se aplica aos Pods da API selecionados. Nesta versão, mantenha o objeto original gerenciado legacy-egress e retire suas permissões sem substituí-lo. Salve-o sem entradas de permissão de saída, representadas pela lista vazia egress: []. Sua política separada api-egress continua fornecendo as duas conexões necessárias. Mantenha o arquivo inicial somente para leitura inalterado.

cat > release/legacy-egress.yaml <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: legacy-egress
  namespace: meadow-shop
spec:
  podSelector:
    matchLabels:
      role: shop-api
  policyTypes:
    - Egress
  egress: []
YAML

Leia e aplique a política gerenciada salva. Não a exclua e recrie:

cat release/legacy-egress.yaml
kubectl --context=labex-v135 apply -f release/legacy-egress.yaml
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress

Ela ainda deve selecionar o papel de API, mas não contribuir com nenhuma permissão de saída. Seu diretório final de versão contém ambas as políticas salvas. A política de ingresso de estoque preparada permanece inalterada.

Agora a requisição da API à expedição não relacionada deve terminar por timeout, enquanto a requisição de controle do cliente a esse mesmo serviço ainda tem sucesso:

./tools/network-test api http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json
./tools/network-test customer http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json

Espere NETWORK_TIMEOUT com um código de saída diferente de zero para API e depois HTTP_REPLY 200 com ambas as notas inalteradas para Customer. Esse par impede que um serviço parado se faça passar por isolamento correto. Se a requisição da API ainda tiver sucesso imediatamente após aplicar, espere alguns segundos e repita até observar o novo limite real.

Confirme novamente o caminho aprovado ao estoque e ambos os protocolos DNS:

./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local

Mude para Shop, recarregue e repita o orçamento de Glass water bottle para Quantity 2: Ready for collection, $36.00, 6 unidades. Depois faça um orçamento de Canvas market bag, Quantity 1: Not enough stock, $24.00, 0 unidades. Retorne à coleção e abra Our approach para confirmar o escopo do treinamento. Mude para Reference e recarregue; ambas as notas originais de retirada permanecem. Use Download notes e inspecione o download real com dois registros. Esse download do navegador é separado do espaço de trabalho do terminal e não precisa ser copiado para lá.

Sua entrega é release/api-egress.yaml mais release/legacy-egress.yaml, aplicados às identidades originais das políticas. Tanto as permissões em execução quanto as salvas devem corresponder aos limites ensinados de namespace/papel e protocolo/porta: DNS UDP/TCP 53 e estoque TCP 8080, com a política legada sem contribuir com permissão alguma. Mantenha todos os recursos originais da aplicação, Pods, labels de namespace, dados e fontes fornecidas. Se uma correção quebrar a loja, inspecione os caminhos de DNS e estoque ensinados, corrija somente os arquivos editáveis de política e aplique-os novamente. Não acrescente outra regra que permita tudo nem altere a aplicação para contornar o DNS. Essas observações TCP/UDP finitas não comprovam um limite de segurança de rede em produção contra nós ou administradores.

Resumo

Você separou a resolução de nomes de uma conexão da aplicação, restaurou as dependências reais de DNS e estoque da API e manteve os orçamentos reais dos clientes funcionando. Também descobriu por que uma política restrita não removia uma permissão fornecida por outra política e depois retirou essa permissão legada sem parar o serviço não relacionado.

A versão final salva e a união das políticas em execução permitem os caminhos necessários de DNS e estoque enquanto negam o acesso da API à expedição. A ordem das políticas não define precedência; avalie as permissões combinadas e preserve controles positivos ao interpretar falhas.