Criar políticas de rede do Kubernetes para clusters padrão

Nesta página, fornecemos instruções para configurar o tráfego intracluster em um cluster padrão usando políticas de rede do Kubernetes no Google Distributed Cloud (GDC) com isolamento físico.

Uma NetworkPolicy do Kubernetes é uma especificação de como grupos de pods podem se comunicar uns com os outros e com outros endpoints da rede. Os recursos NetworkPolicy usam rótulos para selecionar pods e definir regras que especificam qual tráfego é permitido para os pods selecionados. Essas políticas têm escopo local e se aplicam apenas ao tráfego no cluster em que são definidas, a menos que uma política de permissão total seja criada, o que também permite a comunicação com endpoints de outros clusters padrão e compartilhados.

Antes de começar

Para configurar políticas de rede do Kubernetes, você precisa ter as permissões necessárias no cluster para criar, modificar e excluir recursos NetworkPolicy nos namespaces relevantes.

Criar uma política de pod para pod intracluster

Essas políticas controlam o tráfego entre pods no mesmo cluster padrão.

Criar uma política de entrada de pod para pod intracluster

  • Para permitir o tráfego de entrada de pod para pod no cluster, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.
    • PEER_NAMESPACE: o namespace do peer no cluster padrão.
    • SUBJECT_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho em questão. Por exemplo, app, tier ou role.
    • SUBJECT_LABEL_VALUE: o valor associado ao SUBJECT_LABEL_KEY. Por exemplo, se SUBJECT_LABEL_KEY for app e SUBJECT_LABEL_VALUE for backend, as cargas de trabalho com o rótulo app: backend vão receber o tráfego.
    • PEER_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho do mesmo nível.
    • PEER_LABEL_VALUE: o valor associado ao PEER_LABEL_KEY.
    • PORT: a porta na carga de trabalho em questão em que o tráfego é permitido.

Criar uma política de saída de pod para pod intracluster

  • Para permitir o tráfego de saída de pod para pod no cluster, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-intra-cluster-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.
    • PEER_NAMESPACE: o namespace do peer no cluster padrão.
    • SUBJECT_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho em questão. Por exemplo, app, tier ou role.
    • SUBJECT_LABEL_VALUE: o valor associado ao SUBJECT_LABEL_KEY. Por exemplo, se SUBJECT_LABEL_KEY for app e SUBJECT_LABEL_VALUE for backend, as cargas de trabalho com o rótulo app: backend estarão enviando o tráfego.
    • PEER_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho do mesmo nível.
    • PEER_LABEL_VALUE: o valor associado ao PEER_LABEL_KEY.
    • PORT: a porta na carga de trabalho do mesmo nível em que o tráfego é permitido.

Criar uma política de pod para pod intracluster usando um balanceador de carga

Essas políticas controlam o tráfego entre pods no mesmo cluster quando ele é encaminhado por um balanceador de carga externo.

Criar uma política de entrada de pod para pod intracluster usando um balanceador de carga

  • Para permitir o tráfego de entrada de pod para pod intracluster usando um balanceador de carga, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EGRESS_NAT_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.
    • SUBJECT_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho em questão. Por exemplo, app, tier ou role.
    • SUBJECT_LABEL_VALUE: o valor associado ao SUBJECT_LABEL_KEY. Por exemplo, se SUBJECT_LABEL_KEY for app e SUBJECT_LABEL_VALUE for backend, as cargas de trabalho com o rótulo app: backend vão receber o tráfego.
    • EGRESS_NAT_IP: o IP NAT de saída do pod de origem.
    • PORT: a porta na carga de trabalho em questão em que o tráfego é permitido.

Criar uma política de saída de pod para pod intracluster usando um balanceador de carga

  • Para permitir o tráfego de saída de pod para pod intracluster usando um balanceador de carga, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-egress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: ELB_EXTERNAL_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.
    • SUBJECT_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho em questão. Por exemplo, app, tier ou role.
    • SUBJECT_LABEL_VALUE: o valor associado ao SUBJECT_LABEL_KEY. Por exemplo, se SUBJECT_LABEL_KEY for app e SUBJECT_LABEL_VALUE for backend, as cargas de trabalho com o rótulo app: backend estarão enviando o tráfego.
    • ELB_EXTERNAL_IP: o endereço IP externo do balanceador de carga.
    • PORT: a porta no endpoint externo para a qual o tráfego é permitido.

Criar uma política externa à organização

Essas políticas controlam o tráfego entre um pod em um cluster padrão e um endpoint externo (qualquer endereço IP fora do cluster).

Criar uma política de entrada para tráfego externo à organização

  • Para permitir o tráfego de entrada de um endpoint externo à organização, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-ingress-from-organization-external-to-standard-cluster-pod
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.
    • SUBJECT_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho em questão. Por exemplo, app, tier ou role.
    • SUBJECT_LABEL_VALUE: o valor associado ao SUBJECT_LABEL_KEY. Por exemplo, se SUBJECT_LABEL_KEY for app e SUBJECT_LABEL_VALUE for backend, as cargas de trabalho com o rótulo app: backend vão receber o tráfego.
    • EXTERNAL_CIDR: o CIDR externo. Por exemplo: 20.0.0.0/16.
    • PORT: a porta na carga de trabalho em questão em que o tráfego é permitido.

Criar uma política de saída para tráfego externo à organização

  • Para permitir o tráfego de saída para um endpoint externo à organização, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-from-standard-cluster-pod-to-organization-external
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.
    • SUBJECT_LABEL_KEY: a chave do rótulo usado para selecionar as cargas de trabalho em questão. Por exemplo, app, tier ou role.
    • SUBJECT_LABEL_VALUE: o valor associado ao SUBJECT_LABEL_KEY. Por exemplo, se SUBJECT_LABEL_KEY for app e SUBJECT_LABEL_VALUE for backend, as cargas de trabalho com o rótulo app: backend estarão enviando o tráfego.
    • EXTERNAL_CIDR: o CIDR externo. Por exemplo: 20.0.0.0/16.
    • PORT: a porta no endpoint externo para a qual o tráfego é permitido.

Criar uma política de permissão total

As políticas a seguir podem ser usadas para permitir explicitamente todo o tráfego. Isso permite a comunicação com endpoints de outros clusters padrão e compartilhados.

Criar uma política de entrada que permite tudo

  • Para permitir todo o tráfego de entrada, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - {}
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.

Criar uma política de saída que permite tudo

  • Para permitir todo o tráfego de saída, crie e aplique o seguinte recurso:

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-egress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Egress
      egress:
      - {}
    EOF
    

    Substitua:

    • CLUSTER_API_SERVER: o caminho kubeconfig do servidor da API do cluster. Se você ainda não gerou um arquivo kubeconfig para o servidor da API, consulte Fazer login para mais detalhes.
    • SUBJECT_NAMESPACE: o namespace do assunto no cluster padrão.