25 estrategias de red
Requisitos previos
NetworkPolicy se implementa a través de un complemento de red, por lo que el usuario debe usar una solución de red que admita políticas de red; simplemente cree un objeto de recurso sin un controlador para habilitarlo. No sirve de nada que haga efecto.
Complemento de red:
es.io/docs/concepts/services-networking/network-policies/
Por defecto los pods no están aislados, acepta Tráfico de cualquier fuente. Los pods se pueden aislar mediante políticas de red relevantes. Una vez que la configuración de la política de red en el espacio de nombres selecciona un Pod específico, ese Pod negará las conexiones que no estén permitidas por la política de red. (Otros pods en el espacio de nombres que no estén seleccionados por la política de red continuarán recibiendo todo el tráfico).
Campos obligatorios: como todas las demás configuraciones de Kubernetes, NetworkPolicy requiere apiVersion, kind y metadatos.
Especificación: La especificación NetworkPolicy contiene toda la información necesaria para definir una política de red específica en el espacio de nombres.
PodSelector: Cada política de red contiene un podSelector, que selecciona un conjunto de pods a los que se aplica la política. Debido a que NetworkPolicy actualmente solo admite la definición de reglas de ingreso, aquí podSelector esencialmente define el "pod de destino" de la política. La política del ejemplo selecciona el pod con la etiqueta "role=db". Un podSelector vacío seleccionará todos los pods en el espacio de nombres.
Tipos de políticas: cada política de red contiene una lista de tipos de políticas, que contienen entrada y/o salida. El campo PolicyTypes indica si la política dada se aplica al tráfico entrante en el Pod seleccionado, al tráfico saliente del Pod seleccionado o a ambos. Si NetworkPolicy no especifica un tipo de política, la entrada siempre se establece de forma predeterminada; si la política de red tiene reglas de salida, se establece la salida.
Ingreso: Cada política de red contiene una lista blanca de reglas de ingreso. Esta regla permite hacer coincidir el tráfico desde y los puertos simultáneamente. La política de ejemplo contiene una regla simple: coincide con un único puerto de una de dos fuentes, la primera especificada por namespaceSelector y la segunda especificada por podSelector.
Salida: cada política de red contiene una lista blanca de reglas de salida. Cada regla permite el tráfico que coincide con las partes de destino y puerto. La política de ejemplo contiene una regla que hace coincidir el tráfico en un único puerto con cualquier destino en 10.0.0.0/24.
Entonces, una política de red de ejemplo:
1. Aísle los pods etiquetados como "role=db" bajo el espacio de nombres "predeterminado" (si aún no están en cuarentena).
2. (Regla de entrada) Permita que los siguientes pods se conecten al puerto TCP 6379 de todos los pods con la etiqueta "role=db" en el espacio de nombres "predeterminado":
Nota el alcance
p>
"-" significa el mismo nivel o relación.
Preste atención a la traducción NAT de la dirección de destino o de origen en ipBlock.
Comportamiento de los selectores hacia y desde
Puedes especificar cuatro selectores en la sección "Entrar desde" o en la sección "Salir a":
PodSelector: Esto Seleccione un Pod específico en el mismo espacio de nombres que NetworkPolicy y debería permitirse como origen de entrada o destino de salida.
NamespaceSelector: esto seleccionará un espacio de nombres específico para el cual todos los pods deben usarse como fuentes de entrada o destinos de salida.
NamespaceSelector y podSelector: especifique las entradas hacia/desde de namespaceSelector y podSelector para seleccionar pods específicos en un espacio de nombres específico. Tenga en cuenta la sintaxis YAML correcta;
La siguiente política contiene solo un elemento en la matriz from y solo permite conexiones desde Pods marcados como rol=cliente, y el espacio de nombres en el que se encuentra el Pod está marcado como usuario=alice. .
Esta política contiene dos elementos en la matriz from, lo que permite conexiones desde POD etiquetados role=client en el espacio de nombres local, o desde POD etiquetados user=alice en cualquier espacio de nombres.
IpBlock: Esto seleccionará un rango CIDR de IP específico como origen de entrada o destino de salida. Estas deben ser IP fuera del clúster, ya que las IP de pod son de corta duración y se generan aleatoriamente.
Los mecanismos de entrada y salida del clúster generalmente requieren reescribir la IP de origen o la IP de destino del paquete. En este caso, no está seguro si sucede antes o después del manejo de NetworkPolicy, y el comportamiento puede ser diferente para diferentes combinaciones de complementos de red, proveedores de nube, implementaciones de servicios, etc.
En el caso de los entrantes, esto significa que en algunos casos puede filtrar los paquetes entrantes según la IP de origen original real y, en otros casos, la fuente sobre la que actúa NetworkPolicy. La IP puede ser el LoadBalancer o el nodo del Pod.
Para la salida, esto significa que las conexiones desde Pods a IP de servicio que se reescriben en IP fuera del clúster pueden o no estar sujetas a políticas basadas en bloqueo de IP.
Política predeterminada
De forma predeterminada, si no hay una política en el espacio de nombres, se permite todo el tráfico hacia y desde los Pods en el espacio de nombres. El siguiente ejemplo le permite cambiar el comportamiento predeterminado en este espacio de nombres.
De forma predeterminada, se deniega todo el tráfico entrante.
Cree una política de aislamiento "predeterminada" para el espacio de nombres mediante la creación de una política de red que seleccione todos los contenedores pero no permita que ningún tráfico ingrese a los contenedores.
Esto garantiza que los contenedores aún puedan ponerse en cuarentena incluso si no se selecciona ninguna otra política de red. Esta política no cambia el comportamiento predeterminado de salida de la cuarentena.
De forma predeterminada, se permite todo el tráfico entrante.
Si desea permitir todo el tráfico a todos los pods en un espacio de nombres (incluso si la política que agregó hace que algunos pods se consideren "aislados"), puede crear una política que permita explícitamente todo el tráfico en ese espacio de nombres. en el espacio.
Todo el tráfico de exportación está denegado de forma predeterminada.
Se puede crear una política de aislamiento de salida "predeterminada" para un espacio de nombres creando una política de red que seleccione todos los contenedores pero no permita ningún tráfico de salida desde ellos.
Esto garantiza que ni siquiera los pods que no estén seleccionados por ninguna otra política de red podrán salir. Esta política no cambia el comportamiento de aislamiento de ingreso predeterminado.
De forma predeterminada, se permiten todos los flujos de exportación.
Si desea permitir todo el tráfico de todos los pods en un espacio de nombres (incluso si la política que agregó hace que algunos pods se consideren "aislados"), puede crear una política que permita explícitamente todas las salidas de ese espacio de nombres. tráfico en el espacio.
De forma predeterminada, se deniega todo el tráfico entrante y saliente.
Al crear la siguiente NetworkPolicy en un espacio de nombres, puede crear una política "predeterminada" para ese espacio de nombres que bloquee todo el tráfico entrante y saliente.
Esto garantiza que incluso los pods que no estén seleccionados por ninguna otra política de red podrán entrar o salir del tráfico.
Compatibilidad con SCTP
Kubernetes admite SCTP como valor de protocolo en las definiciones de políticas de red y lo proporciona como una función alfa. Para habilitar esta función, el administrador del clúster debe habilitar las puertas de funciones SCTPSupport en el apiserver, por ejemplo, "-feature-gates=SCTPsupport=true,...". Después de habilitar la puerta de función, los usuarios pueden configurar el campo de protocolo de la política de red en SCTP.
Kubernetes establece redes correspondientes para asociaciones SCTP, al igual que las conexiones TCP.
Los complementos CNI deben admitir SCTP como valor de protocolo en las políticas de red.
Primero, necesita un clúster de Kubernetes que admita políticas de red. Hay muchos proveedores de red que admiten políticas de red, entre ellos:
Algodón blanco
Romana
Red tejida
Nota: la lista anterior Está ordenado alfabéticamente por nombre de producto, no por recomendación o preferencia. Los siguientes ejemplos son válidos para clústeres de Kubernetes que utilizan cualquiera de los proveedores anteriores.
Cree una implementación de nginx y expóngala a través de un servicio.
Para comprender cómo funcionan las políticas de red de Kubernetes, puede comenzar creando una implementación de nginx y exponiéndola a través de un servicio.
Dos pods de nginx se ejecutan bajo el espacio de nombres predeterminado y están expuestos por un servicio llamado nginx.
Otros pods pueden acceder al servicio de prueba.
Accede a este nuevo servicio nginx desde otros POD. Para verificar, acceda al servicio desde un pod diferente en el espacio de nombres predeterminado. Asegúrese de que no se realicen operaciones huérfanas en este espacio de nombres.
Inicie un contenedor de Busybox y luego use el comando wget para acceder al servicio nginx en el contenedor:
Restringir el acceso al servicio nginx
Si lo desea para usar solo el servicio nginx Limitado a aquellos pods etiquetados como acceso: verdadero, puede crear una política de red que solo permita conexiones desde estos pods:
Especifique la política para el servicio
Según Para nginx-policy arriba. archivo yaml, use la herramienta kubectl para crear una política de red:
Pruebe el servicio de acceso cuando la etiqueta de acceso no esté definida.
Si intenta acceder al servicio nginx desde un pod que no está etiquetado correctamente, la solicitud expirará:
Pruebe nuevamente después de definir la etiqueta de acceso.
Crea un pod con la etiqueta correcta y verás que la solicitud está permitida: