Exemplo: Instalando o Calico e Configurando Políticas de Rede

Descubra como instalar o Calico e configurar políticas de rede em um cluster que você criou usando o Kubernetes Engine (OKE).

O modelo de rede do Kubernetes pressupõe que os contêineres (pods) têm endereços IP exclusivos e roteáveis em um cluster. No modelo de rede do Kubernetes, os contêineres se comunicam entre si usando esses endereços IP, independentemente de os contêineres estarem implantados no mesmo nó em um cluster ou em outro nó. O Kubernetes adotou a especificação CNI (Contêiner Network Interface) para gerenciamento de recursos de rede. A CNI consiste em uma especificação e bibliotecas para gravar plug-ins para configurar interfaces de rede em contêineres Linux, juntamente com vários plug-ins suportados.

Por padrão, os pods aceitam o tráfego de qualquer origem. Para aprimorar a segurança do cluster, os pods podem ser "isolados" selecionando-os em uma política de rede (o recurso NetworkPolicy do Kubernetes). Uma política de rede é uma especificação de como grupos de pods podem se comunicar entre si e com outros pontos finais de rede. Os recursos NetworkPolicy usam labels para selecionar pods e definir regras que especificam qual tráfego é permitido para os pods selecionados. Se um NetworkPolicy em um namespace de cluster selecionar um pod específico, este pod rejeitará qualquer conexão que não seja permitida por nenhum NetworkPolicy. Outros pods no namespace que não são selecionados por um NetworkPolicy continuarão a aceitar todo o tráfego. Para obter mais informações sobre políticas de rede, consulte a documentação do Kubernetes.

As políticas de rede são implementadas pelo provedor de rede CNI. Simplesmente criar o recurso NetworkPolicy sem um provedor de rede CNI para implementá-lo não terá efeito. Observe que nem todos os provedores de rede CNI implementam o recurso NetworkPolicy.

Ao criar clusters com o Kubernetes Engine, você seleciona um Tipo de rede. O Tipo de rede selecionado determina o provedor de rede CNI e o plug-in CNI associado que é usado para rede de pod, da seguinte forma:

  • Rede de pod nativo da VCN: Usa o plug-in CNI do OCI VCN-Native Pod Networking para conectar nós de trabalho a sub-redes de pod em uma VCN do Oracle Cloud Infrastructure. Como resultado, os endereços IP do pod em uma VCN são roteáveis diretamente de outras VCNs conectadas (pareadas) a essa VCN e de redes locais. Consulte Usando o plug-in CNI da Rede de Pods Nativa da VCN do OCI para a rede de pods.
  • Sobreposição de flanela: Usa o plug-in flannel CNI para encapsular a comunicação entre pods na rede de sobreposição de flanela, uma rede virtual de sobreposição privada simples que anexa endereços IP a contêineres. Os pods na rede de sobreposição privada só podem ser acessados de outros pods no mesmo cluster. Consulte Usando o plug-in CNI flannel para a rede de pods.

Embora o plug-in CNI de Rede de Pod Nativa da VCN do OCI e o plug-in CNI de flanela atendam aos requisitos do modelo de rede do Kubernetes, nenhum deles suporta recursos NetworkPolicy do Kubernetes. Se você quiser melhorar a segurança dos clusters criados com o Kubernetes Engine implementando políticas de rede, deverá instalar e configurar um provedor de rede que suporte recursos NetworkPolicy no cluster. Um desses provedores é o Calico (consulte a documentação do Kubernetes para obter uma lista de outros provedores de rede).

O Calico é uma solução de rede de código-fonte aberto e segurança de rede para contêineres, máquinas virtuais e cargas de trabalho nativas baseadas em host. Para obter mais informações sobre o Calico, consulte a documentação do Calico.

Observação

  • Você pode usar o Calico com pools de nós gerenciados, mas não com pools de nós virtuais.
  • Somente o uso do Calico open-source é suportado. O uso do Calico Enterprise não é suportado.

  • Se você tiver criado um cluster e selecionado sobreposição de canal como o Tipo de rede, poderá instalar o Calico no lugar do plug-in de CNI de flanela (consulte Instalando o Calico no lugar do plug-in de CNI de flanela). No entanto, observe que a alteração do plug-in CNI do flannel para o Calico só se aplica a novos nós que são criados posteriormente no cluster. Portanto, recomendamos que você não substitua a flanela pelo Calico em clusters que já tenham nós de trabalho existentes.

Compatibilidade com Calico

A tabela lista as versões do plug-in de rede do Calico que a Oracle testou com sucesso em clusters criados usando o Kubernetes Engine. A Oracle só suporta versões do Calico que foram testadas com sucesso. Para cada versão do Calico, a tabela mostra a versão do Kubernetes que estava em execução em clusters em testes bem-sucedidos.

Observe que somente o uso do Calico open source é suportado. O uso do Calico Enterprise não é suportado.

Para obter mais informações, consulte Exemplo: Instalando o Calico e Configurando Políticas de Rede.

Versão do Calico Testado (e suportado) em clusters que executam o Kubernetes 1.30? Testado (e suportado) em clusters que executam o Kubernetes 1.31? Testado (e suportado) em clusters que executam o Kubernetes 1.32? Testado (e suportado) em clusters que executam o Kubernetes 1.33?
3.25.1 (não testado) (não testado) (não testado) (não testado)
3.26.1 (não testado) (não testado) (não testado) (não testado)
3.26.4 (não testado) (não testado) (não testado) (não testado)
3.27.2 (não testado) (não testado) (não testado) (não testado)
3.28.0 Sim (não testado) (não testado) (não testado)
3.28.2 (não testado) Sim (não testado) (não testado)
3.29.2 (não testado) (não testado) Sim (não testado)
3.30.0 (não testado) (não testado) (não testado) Sim

Instalando o Calico no lugar do plug-in CNI de flanela

Depois de criar um cluster aprimorado usando o Kubernetes Engine (usando a Console ou a API) e selecionar sobreposição de canal como o tipo de rede, você poderá instalar posteriormente o Calico no cluster para oferecer suporte a políticas de rede.

Antes de instalar o Calico no lugar do plug-in flannel CNI, você deve primeiro desativar o plug-in flannel CNI. Observe que a alteração do plug-in CNI do flannel para o Calico só se aplica a novos nós criados posteriormente no cluster. Portanto, recomendamos que você não substitua a flanela pelo Calico em clusters que já tenham nós de trabalho existentes.

Por conveniência, as instruções de instalação do Calico estão incluídas a seguir. Observe que as instruções de instalação do Calico variam entre as versões do Calico. Para obter informações sobre como instalar outras versões do Calico, sempre consulte a documentação de instalação do Calico.

  1. Desative o complemento do cluster de plug-in flannel CNI. Consulte Desativando (e Removendo) um Complemento de Cluster.

  2. Se você ainda não tiver feito isso, siga as etapas para configurar o arquivo de configuração kubeconfig do cluster e (se necessário) defina a variável de ambiente KUBECONFIG para apontar para o arquivo. Observe que você deve configurar seu próprio arquivo kubeconfig. Não é possível acessar um cluster usando um arquivo kubeconfig que outro usuário tenha configurado. Consulte Configurando o Acesso ao Cluster.
  3. Remova o conjunto de daemons de flanela do namespace kube-system digitando:
    kubectl delete -n kube-system daemonset kube-flannel-ds
  4. Em uma janela de terminal, faça download do manifesto do Calico para o armazenamento de dados da API do Kubernetes informando:

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml -o calico.yaml

    Observe que o url é diferente, de acordo com a versão do Calico que você deseja instalar.

  5. Se você tiver selecionado uma imagem do Oracle Linux 8 para nós de trabalho no cluster, defina uma variável de ambiente adicional no arquivo calico.yaml da seguinte forma:
    1. Abra o arquivo calico.yaml em um editor de texto de sua escolha.
    2. Adicione a seguinte variável de ambiente à seção env do contêiner calico-node no manifesto do manifesto calico-node DaemonSet:

                  - name: FELIX_IPTABLESBACKEND
                    value: "NFT"
    3. Salve e feche o arquivo calico.yaml modificado.
  6. Instale e configure o Calico especificando o seguinte comando:

    kubectl apply -f calico.yaml

Instalando o Calico junto com o plug-in da CNI de Rede do Pod Nativo da VCN do OCI

Depois de criar um cluster usando o Kubernetes Engine (usando a Console ou a API) e selecionar a rede de pod nativo da VCN como o tipo de rede, você poderá instalar subsequentemente o Calico no cluster ao lado do plug-in CNI do OCI VCN-Native Pod Networking para suportar políticas de rede.

Por conveniência, as instruções de instalação do Calico estão incluídas a seguir. Observe que as instruções de instalação do Calico variam entre as versões do Calico. Para obter informações sobre como instalar outras versões do Calico, sempre consulte a documentação de instalação do Calico.

  1. Se você ainda não tiver feito isso, siga as etapas para configurar o arquivo de configuração kubeconfig do cluster e (se necessário) defina a variável de ambiente KUBECONFIG para apontar para o arquivo. Observe que você deve configurar seu próprio arquivo kubeconfig. Não é possível acessar um cluster usando um arquivo kubeconfig que outro usuário tenha configurado. Consulte Configurando o Acesso ao Cluster.
  2. Em uma janela de terminal, faça download do manifesto somente de política do Calico para o armazenamento de dados da API do Kubernetes informando:

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico-policy-only.yaml -o calico-policy-only.yaml

    Observe que o url é diferente, de acordo com a versão do Calico que você deseja instalar.

  3. O arquivo calico-policy-only.yaml inclui componentes do Calico que não são necessários ao usar o Calico juntamente com o plug-in CNI do OCI VCN-Native Pod Networking; portanto, você precisa remover esses componentes. Você também precisa definir algumas variáveis de ambiente adicionais.
    1. Abra o arquivo calico-policy-only.yaml em um editor de texto de sua escolha.
    2. Remova a seção initContainers do manifesto do calico-node DaemonSet.
    3. Remova o seguinte da seção env do contêiner calico-node do manifesto do calico-node DaemonSet:
                # Typha support: controlled by the ConfigMap.
                - name: FELIX_TYPHAK8SSERVICENAME
                    valueFrom:
                        configMapKeyRef:
                            name: calico-config
                            key: typha_service_name
    4. Remova a seguinte seção envFrom do contêiner calico-node do manifesto do calico-node DaemonSet:
                envFrom:
                - configMapRef:
                    # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.
                    name: kubernetes-services-endpoint
                    optional: true
    5. Remova os seguintes volumes da seção volumes do manifesto do calico-node DaemonSet:
      • cni-bin-dir
      • cni-net-dir
      • cni-log-dir

      Antes de fazer a alteração, a seção volumes do manifesto calico-node DaemonSet tem a seguinte aparência:

            ...
            volumes:
              # Used by calico-node.
              - name: lib-modules
                hostPath:
                  path: /lib/modules
              - name: var-run-calico
                hostPath:
                  path: /var/run/calico
              - name: var-lib-calico
                hostPath:
                  path: /var/lib/calico
              - name: xtables-lock
                hostPath:
                  path: /run/xtables.lock
                  type: FileOrCreate
              - name: sys-fs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              - name: bpffs
                hostPath:
                  path: /sys/fs/bpf
                  type: Directory
              # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs.
              - name: nodeproc
                hostPath:
                  path: /proc
              # Used to install CNI.
              - name: cni-bin-dir
                hostPath:
                  path: /opt/cni/bin
              - name: cni-net-dir
                hostPath:
                  path: /etc/cni/net.d
              # Used to access CNI logs.
              - name: cni-log-dir
                hostPath:
                  path: /var/log/calico/cni
              # Used to create per-pod Unix Domain Sockets
              - name: policysync
                hostPath:
                  type: DirectoryOrCreate
                  path: /var/run/nodeagent
                ...

      Depois de fazer a alteração, verifique se a seção volumes do manifesto calico-node DaemonSet tem esta aparência:

            ...
            volumes:
              # Used by calico-node.
              - name: lib-modules
                hostPath:
                  path: /lib/modules
              - name: var-run-calico
                hostPath:
                  path: /var/run/calico
              - name: var-lib-calico
                hostPath:
                  path: /var/lib/calico
              - name: xtables-lock
                hostPath:
                  path: /run/xtables.lock
                  type: FileOrCreate
              - name: sys-fs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              - name: bpffs
                hostPath:
                  path: /sys/fs/bpf
                  type: Directory
              # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs.
              - name: nodeproc
                hostPath:
                  path: /proc
              # Used to create per-pod Unix Domain Sockets
              - name: policysync
                hostPath:
                  type: DirectoryOrCreate
                  path: /var/run/nodeagent
                ...
    6. Remova as seguintes montagens de volume da seção volumeMounts do contêiner calico-node no manifesto de calico-node DaemonSet:
      • cni-net-dir, incluindo o comentário associado # For maintaining CNI plugin API credentials.
      • cni-log-dir

      Antes de fazer a alteração, a seção volumeMounts tem esta aparência:

                ...
                volumeMounts:
                  # For maintaining CNI plugin API credentials.
                  - mountPath: /host/etc/cni/net.d
                    name: cni-net-dir
                    readOnly: false
                  - mountPath: /lib/modules
                    name: lib-modules
                    readOnly: true
                  - mountPath: /run/xtables.lock
                    name: xtables-lock
                    readOnly: false
                  - mountPath: /var/run/calico
                    name: var-run-calico
                    readOnly: false
                  - mountPath: /var/lib/calico
                    name: var-lib-calico
                    readOnly: false
                  - name: policysync
                    mountPath: /var/run/nodeagent
                  # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the
                  # parent directory.
                  - name: bpffs
                    mountPath: /sys/fs/bpf
                  - name: cni-log-dir
                    mountPath: /var/log/calico/cni
                    readOnly: true
                    ...

      Depois de fazer a alteração, verifique se a seção volumeMounts tem esta aparência:

                ...
                volumeMounts:
                  - mountPath: /lib/modules
                    name: lib-modules
                    readOnly: true
                  - mountPath: /run/xtables.lock
                    name: xtables-lock
                    readOnly: false
                  - mountPath: /var/run/calico
                    name: var-run-calico
                    readOnly: false
                  - mountPath: /var/lib/calico
                    name: var-lib-calico
                    readOnly: false
                  - name: policysync
                    mountPath: /var/run/nodeagent
                  # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the
                  # parent directory.
                  - name: bpffs
                    mountPath: /sys/fs/bpf
                    ...
    7. Adicione as seguintes variáveis de ambiente para o contêiner calico-node no manifesto do calico-node DaemonSet:
      • FELIX_INTERFACEPREFIX="oci"
      • NO_DEFAULT_POOLS="true"
      • FELIX_CHAININSERTMODE="Append"
      • FELIX_IPTABLESMANGLEALLOWACTION="Return"
      • FELIX_IPTABLESBACKEND="NFT" Observação: Só adicione essa variável de ambiente se tiver selecionado uma imagem do Oracle Linux 8 para nós de trabalho no cluster.

      Antes de fazer a alteração, a seção calico-node de variáveis de ambiente do contêiner (env:) do manifesto calico-node DaemonSet tem a seguinte aparência:

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.28.0
                imagePullPolicy: IfNotPresent
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Configure route aggregation based on pod CIDR.
                  - name: USE_POD_CIDR
                    value: "true"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  # Cluster type to identify the deployment type
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  # Non-calico CNI, disable credential management.
                  - name: CALICO_MANAGE_CNI
                    value: "false"
                  # The default IPv4 pool to create on startup if none exists. Pod IPs will be
                  # chosen from this range. Changing this value after installation will have
                  # no effect. This should fall within `--cluster-cidr`.
                  # - name: CALICO_IPV4POOL_CIDR
                  #   value: "192.168.0.0/16"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Set Felix endpoint to host default action to ACCEPT.
                  - name: FELIX_DEFAULTENDPOINTTOHOSTACTION
                    value: "ACCEPT"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  - name: FELIX_HEALTHENABLED
                    value: "true"         
                  ...

      Depois de fazer a alteração, verifique se a seção calico-node de variáveis de ambiente do contêiner (env:) do manifesto calico-node DaemonSet tem esta aparência:

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.28.0
                imagePullPolicy: IfNotPresent
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Configure route aggregation based on pod CIDR.
                  - name: USE_POD_CIDR
                    value: "true"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  # Cluster type to identify the deployment type
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  # Non-calico CNI, disable credential management.
                  - name: CALICO_MANAGE_CNI
                    value: "false"
                  # The default IPv4 pool to create on startup if none exists. Pod IPs will be
                  # chosen from this range. Changing this value after installation will have
                  # no effect. This should fall within `--cluster-cidr`.
                  # - name: CALICO_IPV4POOL_CIDR
                  #   value: "192.168.0.0/16"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Set Felix endpoint to host default action to ACCEPT.
                  - name: FELIX_DEFAULTENDPOINTTOHOSTACTION
                    value: "ACCEPT"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_INTERFACEPREFIX
                    value: "oci"
                  - name: NO_DEFAULT_POOLS
                    value: "true"
                  - name: FELIX_CHAININSERTMODE
                    value: "Append"
                  - name: FELIX_IPTABLESMANGLEALLOWACTION
                    value: "Return"   
                  - name: FELIX_IPTABLESBACKEND
                    value: "NFT"         
                  ...
    8. Salve e feche o arquivo calico-policy-only.yaml modificado.
  4. Instale e configure o Calico especificando o seguinte comando:

    kubectl apply -f calico-policy-only.yaml

Configurando Políticas de Rede

Depois de instalar o Calico em um cluster criado com o Kubernetes Engine, você pode criar recursos do Kubernetes NetworkPolicy para isolar pods conforme necessário.

Para obter exemplos de NetworkPolicy e como usá-los, consulte a documentação do Calico e especificamente:

Observe que os exemplos variam, de acordo com a versão instalada do Calico.