Ejemplo: instalación de Calico y configuración de políticas de red

Descubra cómo instalar Calico y configurar políticas de red en un cluster creado mediante Container Engine for Kubernetes (OKE).

El modelo de red de Kubernetes asume que los contenedores (pods) tienen direcciones IP únicas y enrutables dentro de un cluster. En el modelo de red de Kubernetes, los contenedores se comunican entre sí utilizando esas direcciones IP, independientemente de si los contenedores se despliegan en el mismo nodo de un cluster o en un nodo diferente. Kubernetes ha adoptado la especificación de la interfaz de red de contenedor (CNI) para la gestión de recursos de red. El CNI consta de una especificación y bibliotecas para escribir plugins para configurar interfaces de red en contenedores Linux, junto con una serie de plugins admitidos.

Por defecto, los pods aceptan tráfico de cualquier origen. Para mejorar la seguridad del cluster, los pods se pueden "aislar" seleccionándolos en una política de red (el recurso NetworkPolicy de Kubernetes). Una política de red es una especificación de cómo se permite a los grupos de pods comunicarse entre sí y con otros puntos finales de red. Los recursos NetworkPolicy utilizan etiquetas para seleccionar pods y definir reglas que especifiquen el tráfico permitido para los pods seleccionados. Si un NetworkPolicy en un espacio de nombre de cluster selecciona un pod concreto, ese pod rechazará las conexiones que no estén permitidas por ningún NetworkPolicy. Otros pods del espacio de nombre que no estén seleccionados en NetworkPolicy seguirán aceptando todo el tráfico. Para obtener más información sobre las políticas de red, consulte la documentación de Kubernetes.

Las políticas de red se implementan mediante el proveedor de red CNI. Simplemente crear el recurso NetworkPolicy sin un proveedor de red CNI para implementarlo no tendrá ningún efecto. Tenga en cuenta que no todos los proveedores de red CNI implementan el recurso NetworkPolicy.

Al crear clusters con Container Engine for Kubernetes, seleccione un tipo de red. El tipo de red que seleccione determina el proveedor de red CNI y el plugin CNI asociado que se utiliza para redes de pod, de la siguiente manera:

  • Red de pods nativos de VCN: utiliza el plugin CNI de red de pods nativos de OCI para conectar nodos de trabajador a subredes de pod en una VCN de Oracle Cloud Infrastructure. Como resultado, las direcciones IP de los pods de una VCN pueden enrutarse directamente desde otras VCN conectadas (conexión por intercambio de tráfico) a esa VCN, desde redes locales e Internet. Consulte Using the OCI VCN-Native Pod Networking CNI plugin for pod network.
  • Superposición de franela: utiliza el plugin CNI de franela para encapsular la comunicación entre pods en la red de superposición de franela, una red virtual de superposición privada simple que asocia direcciones IP a contenedores. Solo se puede acceder a los pods de la red de superposición privada desde otros pods del mismo cluster. Consulte Uso del plugin de canal CNI para redes de pod.

Aunque tanto el plugin CNI de red de pod nativo de VCN de OCI como el plugin CNI de canal satisfacen los requisitos del modelo de red de Kubernetes, ninguno de ellos soporta los recursos NetworkPolicy de Kubernetes. Si desea mejorar la seguridad de los clusters creados con Container Engine for Kubernetes implementando políticas de red, debe instalar y configurar un proveedor de red que soporte recursos NetworkPolicy junto con el plugin de CNI utilizado en el cluster. Uno de estos proveedores es Calico (consulte la documentación de Kubernetes para obtener una lista de otros proveedores de red).

Calico es una solución de seguridad de red y red de código abierto para contenedores, máquinas virtuales y cargas de trabajo nativas basadas en host. Para obtener más información sobre Calico, consulte la documentación de Calico.

Nota

  • Puede utilizar Calico con pools de nodos gestionados, pero no con pools de nodos virtuales.
  • Solo está soportado el uso de Calico de código abierto. El uso de Calico Enterprise no está soportado.

  • En el caso del canal, si instala Calico en un cluster que tiene pools de nodos existentes en los que los pods ya se están ejecutando, tendrá que reiniciar los pods cuando finalice la instalación de Calico. Por ejemplo, ejecutando el comando kubectl rollout restart. Si instala Calico en un cluster antes de crear pools de nodos en el cluster (recomendado), se asegurará de que no tendrá que reiniciar.

Compatibilidad con Calico

En la tabla se muestran las versiones del plugin de red de Calico que Oracle ha probado correctamente en clusters creados mediante Container Engine for Kubernetes. Oracle solo admite versiones de Calico que se hayan probado correctamente. Para cada versión de Calico, la tabla muestra la versión de Kubernetes que se estaba ejecutando en clusters en pruebas correctas.

Tenga en cuenta que solo está soportado el uso de Calico de código abierto. El uso de Calico Enterprise no está soportado.

Para obtener más información, consulte Ejemplo: instalación de Calico y configuración de políticas de red.

Versión de Calico ¿Está probado (y soportado) en clusters que ejecutan Kubernetes 1.27? ¿Está probado (y soportado) en clusters que ejecutan Kubernetes 1.28? ¿Está probado (y soportado) en clusters que ejecutan Kubernetes 1.29? ¿Está probado (y soportado) en clusters que ejecutan Kubernetes 1.30?
3,25 (no se ha probado) (no se ha probado) (no se ha probado) (no se ha probado)
3,26 (no se ha probado) (no se ha probado) (no se ha probado)
3,26 (no se ha probado) (no se ha probado) (no se ha probado)
3,27 (no se ha probado) (no se ha probado) (no se ha probado)
3,28 (no se ha probado) (no se ha probado) (no se ha probado)

Instalación de Calico junto con el plugin CNI de franela

Una vez que haya creado un cluster mediante Container Engine for Kubernetes (con la Consola o la API) y haya seleccionado flannel overlay como Network type, puede instalar posteriormente Calico en el cluster junto con el plugin de CNI de flannel para soportar políticas de red.

Para su comodidad, las instrucciones de instalación de Calico se incluyen a continuación. Tenga en cuenta que las instrucciones de instalación de Calico varían según la versión de Calico. Para obtener información sobre la instalación de diferentes versiones de Calico, consulte siempre la documentación de instalación de Calico.

  1. Si todavía no lo ha hecho, siga los pasos para configurar el archivo de configuración kubeconfig del cluster y (si es necesario) defina la variable de entorno KUBECONFIG para que apunte al archivo. Tenga en cuenta que debe configurar su propio archivo kubeconfig. No puede acceder a un cluster utilizando un archivo kubeconfig que haya configurado un usuario diferente. Consulte Configuración del acceso a los clusters.
  2. En una ventana de terminal, descargue el manifiesto solo de políticas de Calico para el almacén de datos de API de Kubernetes introduciendo:

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

    Tenga en cuenta que la URL difiere según la versión de Calico que desee instalar.

  3. Debe definir una o más variables de entorno adicionales en el archivo calico-policy-only.yaml.
    1. Abra el archivo calico-policy-only.yaml en un editor de texto de su elección.
    2. Agregue las siguientes variables de entorno para el contenedor calico-node en el manifiesto de calico-node DaemonSet:
      • CALICO_MANAGE_CNI="true"
      • FELIX_IPTABLESBACKEND="NFT" Nota: solo agregue esta variable de entorno si ha seleccionado una imagen de Oracle Linux 8 para nodos de trabajador en el cluster.

      Antes de realizar el cambio, la sección de variables de entorno de contenedor calico-node (env:) del manifiesto calico-node DaemonSet tiene el siguiente aspecto:

            ...
            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"

      Después de realizar el cambio, compruebe que la sección de variables de entorno de contenedor calico-node (env:) del manifiesto calico-node DaemonSet tenga el siguiente aspecto:

            ...
            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. Guarde y cierre el archivo calico-policy-only.yaml modificado.
  4. Instale y configure Calico introduciendo el siguiente comando:

    kubectl apply -f calico.yaml

Instalación de Calico junto con el plugin de CNI de red de pod nativos de VCN de OCI

Después de crear un cluster mediante Container Engine for Kubernetes (mediante la consola o la API) y seleccionar redes de pods nativas de VCN como tipo de red, puede instalar posteriormente Calico en el cluster junto con el plugin CNI de red de pod nativo de VCN de OCI para soportar políticas de red.

Para su comodidad, las instrucciones de instalación de Calico se incluyen a continuación. Tenga en cuenta que las instrucciones de instalación de Calico varían según la versión de Calico. Para obtener información sobre la instalación de diferentes versiones de Calico, consulte siempre la documentación de instalación de Calico.

  1. Si todavía no lo ha hecho, siga los pasos para configurar el archivo de configuración kubeconfig del cluster y (si es necesario) defina la variable de entorno KUBECONFIG para que apunte al archivo. Tenga en cuenta que debe configurar su propio archivo kubeconfig. No puede acceder a un cluster utilizando un archivo kubeconfig que haya configurado un usuario diferente. Consulte Configuración del acceso a los clusters.
  2. En una ventana de terminal, descargue el manifiesto solo de políticas de Calico para el almacén de datos de API de Kubernetes introduciendo:

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

    Tenga en cuenta que la URL difiere según la versión de Calico que desee instalar.

  3. El archivo calico-policy-only.yaml incluye componentes de Calico que no son necesarios al utilizar Calico junto con el plugin CNI de redes de pod nativo de VCN de OCI, por lo que debe eliminar estos componentes. También debe definir algunas variables de entorno adicionales.
    1. Abra el archivo calico-policy-only.yaml en un editor de texto de su elección.
    2. Elimine la sección initContainers del manifiesto de calico-node DaemonSet.
    3. Elimine lo siguiente de la sección env para el contenedor calico-node del manifiesto de calico-node DaemonSet:
                # Typha support: controlled by the ConfigMap.
                - name: FELIX_TYPHAK8SSERVICENAME
                    valueFrom:
                        configMapKeyRef:
                            name: calico-config
                            key: typha_service_name
    4. Elimine la siguiente sección envFrom para el contenedor calico-node del manifiesto de 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. Elimine los siguientes volúmenes de la sección volumes del manifiesto de calico-node DaemonSet:
      • cni-bin-dir
      • cni-net-dir
      • cni-log-dir

      Antes de realizar el cambio, la sección volumes del manifiesto calico-node DaemonSet tiene el siguiente aspecto:

            ...
            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
                ...

      Después de realizar el cambio, compruebe que la sección volumes del manifiesto calico-node DaemonSet tenga el siguiente aspecto:

            ...
            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. Elimine los siguientes montajes de volumen de la sección volumeMounts para el contenedor calico-node en el manifiesto de calico-node DaemonSet:
      • cni-net-dir, incluido el comentario asociado # For maintaining CNI plugin API credentials.
      • cni-log-dir

      Antes de realizar el cambio, la sección volumeMounts tiene el siguiente aspecto:

                ...
                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
                    ...

      Después de realizar el cambio, compruebe que la sección volumeMounts tiene el siguiente aspecto:

                ...
                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. Agregue las siguientes variables de entorno para el contenedor calico-node en el manifiesto de calico-node DaemonSet:
      • FELIX_INTERFACEPREFIX="oci"
      • NO_DEFAULT_POOLS="true"
      • FELIX_CHAININSERTMODE="Append"
      • FELIX_IPTABLESMANGLEALLOWACTION="Return"
      • FELIX_IPTABLESBACKEND="NFT" Nota: solo agregue esta variable de entorno si ha seleccionado una imagen de Oracle Linux 8 para nodos de trabajador en el cluster.

      Antes de realizar el cambio, la sección de variables de entorno de contenedor calico-node (env:) del manifiesto calico-node DaemonSet tiene el siguiente aspecto:

            ...
            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"

      Después de realizar el cambio, compruebe que la sección de variables de entorno de contenedor calico-node (env:) del manifiesto calico-node DaemonSet tenga el siguiente aspecto:

            ...
            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. Guarde y cierre el archivo calico-policy-only.yaml modificado.
  4. Instale y configure Calico introduciendo el siguiente comando:

    kubectl apply -f calico.yaml

Configuración de políticas de red

Una vez haya instalado Calico en un cluster creado con Container Engine for Kubernetes, puede crear recursos NetworkPolicy de Kubernetes para aislar pods según sea necesario.

Para ver ejemplos de NetworkPolicy y cómo usarlos, consulte la documentación de Calico y concretamente:

Tenga en cuenta que los ejemplos varían según la versión de Calico que haya instalado.