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 pods nativos da VCN: Usa o plug-in da CNI da Rede de Pods Nativa da VCN do OCI para conectar nós de trabalho a sub-redes de pods em uma VCN do Oracle Cloud Infrastructure. Como resultado, os endereços IP do pod dentro de uma VCN são roteáveis diretamente de outras VCNs conectadas (pareadas) a essa VCN, de redes locais e da internet. Consulte Usando o plug-in da 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 ao lado do plug-in CNI usado 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.

  • No caso do flannel, se você instalar o Calico em um cluster que tenha pools de nós existentes, nos quais os pods já estejam em execução, será necessário reiniciar os pods quando a instalação do Calico for concluída. Por exemplo, executando o comando kubectl rollout restart. Se você instalar o Calico em um cluster antes de criar qualquer pool de nós no cluster (recomendado), poderá ter certeza de que não haverá pods a serem reiniciados.

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.28? Testado (e suportado) em clusters que executam o Kubernetes 1.29? Testado (e suportado) em clusters que executam o Kubernetes 1.30?
3.25 (não testado) (não testado) (não testado)
3.26 (não testado) (não testado) (não testado)
3.26 Sim (não testado) (não testado)
3.27 (não testado) Sim (não testado)
3.28 (não testado) (não testado) Sim

Instalando o Calico ao lado do plug-in flannel CNI

Depois de ter criado um cluster usando o Kubernetes Engine (usando a Console ou a API) e selecionado sobreposição de canal como o tipo de rede, é possível instalar o Calico no cluster ao lado do plug-in CNI de canal 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.25.1/manifests/calico-policy-only.yaml -o calico.yaml

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

  3. É necessário definir uma ou mais variáveis de ambiente adicionais no arquivo calico-policy-only.yaml.
    1. Abra o arquivo calico-policy-only.yaml em um editor de texto de sua escolha.
    2. Adicione as seguintes variáveis de ambiente para o contêiner calico-node no manifesto do calico-node DaemonSet:
      • CALICO_MANAGE_CNI="true"
      • 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.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # 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"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"

      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.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # 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"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  - name: CALICO_MANAGE_CNI
                    value: "true"
                  - name: FELIX_IPTABLESBACKEND
                    value: "NFT"
                  ...
    3. Salve e feche o arquivo calico-policy-only.yaml modificado.
  4. 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.25.1/manifests/calico-policy-only.yaml -o calico.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 de Rede de Pod Nativo da VCN do OCI; 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: sysfs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              # 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: sysfs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              # 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.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # 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"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"

      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.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # 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"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  # Configuration for Native Pod Networking
                  - 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.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.