Habilite Network Policy en los clústeres ACK Serverless para controlar el tráfico a nivel de pod con el complemento Poseidon.
Requisitos previos
-
Se creó un clúster administrado de ACK o un clúster dedicado de ACK. Consulte Create an ACK managed cluster o Create an ACK dedicated cluster (Discontinued).
ImportanteEn los clústeres ACK managed cluster Pro y ACK Serverless Pro, distintos complementos implementan Network Policy.
En un ACK managed cluster Pro (para nodos que no son elastic container instances), el plugin de red Terway implementa Network Policy. Consulte Enable Network Policy in ACK clusters.
En las elastic container instances (ECI) de los clústeres ACK Serverless y los clústeres ACK managed Pro, el complemento Poseidon implementa Network Policy.
El complemento ACK Virtual Node se actualizó a la versión v2.10.0 o posterior. Consulte Manage components.
Limitaciones
Network Policy solo es compatible con los clústeres ACK Serverless Pro y ACK managed cluster Pro.
Network Policy no admite direcciones IPv6.
El campo
endPortde una NetworkPolicy no es compatible.Las reglas de NetworkPolicy usan selectores de etiquetas para coincidir con namespaces o pods. Un exceso de recursos NetworkPolicy ralentiza la propagación de reglas y complica la gestión y solución de problemas. Limite los recursos NetworkPolicy a menos de 40 por clúster.
Paso 1: Habilitar Network Policy
Instale el complemento Poseidon para habilitar Network Policy en un clúster ACK Serverless Pro.
-
Instale el complemento Poseidon.
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Components and Add-ons .
En la página Components and Add-ons, haga clic en Install. En la pestaña Networking, busque la tarjeta Poseidon y haga clic en Next.
-
En el cuadro de diálogo Install Component, seleccione Enable NetworkPolicy for ACS/ECI Instances, haga clic en Next y luego en OK.
Una vez finalizada la instalación, aparece Installed en la tarjeta.
Paso 2: Crear y probar una aplicación nginx
Usar la consola
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, haga clic en el nombre del clúster de destino. En el panel de navegación izquierdo, elija .
-
En la página Deployments, haga clic en Create from Image. En el asistente Create, cree una aplicación llamada nginx y expóngala mediante un Service. Después de configurar la aplicación, haga clic en Create.
Para este ejemplo, configure únicamente los siguientes elementos de la aplicación Nginx y conserve la configuración predeterminada en los demás parámetros. Para obtener más información sobre las configuraciones, consulte Create a stateless workload (Deployment).
Elemento de configuración
Descripción
Valor de ejemplo
Basic Information
Name
Un nombre personalizado.
nginx
Replicas
Seleccione según sus necesidades.
1
Container
Image Name
El nombre de la imagen utilizada para iniciar el contenedor.
nginx:latest
Advanced
Services
A la derecha de Services, haga clic en Create para establecer los elementos de configuración del servicio.
Name: nginx
Service Type:
Cluster IP
SLB
Node Port
Port Mapping:
Name: nginx
Service Port: 80
Container Port: 80
Protocol: TCP
-
En la página Deployments, haga clic en Create from Image. En el asistente Create resultante, cree una aplicación cliente llamada busybox para probar el acceso al Service nginx que creó en el paso anterior.
Para este ejemplo, configure únicamente los siguientes elementos de la aplicación cliente busybox y conserve la configuración predeterminada en los demás parámetros. Para obtener más información sobre las configuraciones, consulte Create a stateless workload (Deployment).
Elemento de configuración
Descripción
Valor de ejemplo
Basic Information
Name
Un nombre personalizado.
busybox
Replicas
Establezca un valor según sus necesidades.
1
Container
Image Name
El nombre de la imagen utilizada para iniciar el contenedor.
busybox:latest
Container Start Parameter
Ninguna
Seleccione stdin y tty
-
Compruebe que la aplicación cliente busybox pueda acceder al Service Nginx.
En la página Deployments, haga clic en el nombre de la aplicación busybox.
-
En la pestaña Pods, ubique el pod busybox-{valor de hash} y haga clic en Terminal dentro de la columna Actions.

-
En la terminal de línea de comandos de busybox, ejecute el comando
wget nginxpara probar el acceso a Nginx.
La salida indica que busybox puede acceder al Service Nginx.
Usar la CLI
-
Ejecute los siguientes comandos para crear una aplicación Nginx y exponerla mediante un Service llamado nginx.
Cree una aplicación Nginx:
kubectl run nginx --image=nginxSalida esperada:
pod/nginx createdCompruebe si el pod se inició:
kubectl get podSalida esperada:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 45sCree un Service llamado nginx:
kubectl expose pod nginx --port=80Salida esperada:
service/nginx exposedConsulte el Service:
kubectl get serviceSalida esperada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 172.XX.XX.1 <none> 443/TCP 30m nginx ClusterIP 172.XX.XX.48 <none> 80/TCP 12s -
Ejecute el siguiente comando para crear un pod llamado busybox y acceder al Service nginx.
kubectl run busybox --rm -ti --image=busybox /bin/shSalida esperada:
If you don't see a command prompt, try pressing enter. / # / #Acceda a nginx:
If you don't see a command prompt, try pressing enter. / # / # wget nginx # Enter wget nginx here.Salida esperada:
Connecting to nginx (172.XX.XX.48:80) saving to 'index.html' index.html 100% |****************************************************************************************************************************************************| 612 0:00:00 ETA 'index.html' saved
Paso 3: Usar una network policy
Aplique recursos NetworkPolicy para restringir el tráfico de los pods por etiqueta, bloque CIDR, destino de egreso o acceso a la red pública.
Escenario 1: Restringir el acceso al servicio a aplicaciones con etiquetas específicas mediante una network policy
-
Ejecute el comando
vim policy.yamlpara crear un archivo llamado policy.yaml y llénelo con la siguiente plantilla YAML.vim policy.yamlA continuación se muestra el contenido del archivo YAML.
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true" -
Ejecute el siguiente comando para crear una network policy a partir del archivo policy.yaml.
kubectl apply -f policy.yamlSalida esperada:
networkpolicy.networking.k8s.io/access-nginx created -
Ejecute los siguientes comandos para probar el acceso al Service nginx. Como no se definió ninguna etiqueta de acceso, la solicitud agota el tiempo de espera.
kubectl run busybox --rm -ti --image=busybox /bin/shPruebe el acceso al Service nginx:
wget nginxSalida esperada:
Connecting to nginx (172.19.XX.XX:80) wget: can't connect to remote host (172.19.XX.XX): Connection timed out -
Ejecute los siguientes comandos para definir la etiqueta de acceso.
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shPruebe el acceso al Service Nginx:
wget nginxSalida esperada:
Connecting to nginx (172.21.XX.XX:80) saving to 'index.html' index.html 100% |****************************************************************************************************************************************************| 612 0:00:00 ETA 'index.html' savedLa salida indica que el progreso de la conexión es del 100 %. Esto significa que la solicitud se completó correctamente y se puede acceder al servicio Nginx.
Escenario 2: Restringir los bloques CIDR de origen que pueden acceder a un servicio expuesto a Internet mediante una network policy
-
Ejecute el siguiente comando para crear una instancia SLB de Alibaba Cloud para la aplicación nginx. Especifique
type=LoadBalancerpara exponer el servicio nginx a Internet.vim nginx-service.yamlA continuación se muestra la plantilla del archivo nginx-service.yaml.
# Paste the following YAML content into nginx-service.yaml. apiVersion: v1 kind: Service metadata: labels: run: nginx name: nginx-slb spec: externalTrafficPolicy: Local ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx type: LoadBalancerEjecute el siguiente comando para crear una network policy a partir del archivo nginx-service.yaml.
kubectl apply -f nginx-service.yamlSalida esperada:
service/nginx-slb createdCompruebe si la aplicación expone el servicio Nginx:
kubectl get service nginx-slbSalida esperada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-slb LoadBalancer 172.19.xx.xxx 47.110.xxx.xxx 80:32240/TCP 8m -
Ejecute el siguiente comando para acceder a la dirección IP de la instancia SLB recién creada, 47.110.xxx.xxx. El acceso falla.
wget 47.110.xxx.xxxSalida esperada:
--2018-11-21 11:46:05-- http://47.110.xx.xxx/ Connecting to 47.110.XX.XX:80... failed: Connection refused.NotaEl acceso falla por las siguientes razones:
Solo las aplicaciones con la etiqueta específica
access=truepueden acceder al Service nginx configurado.Acceder a la dirección IP de la instancia SLB se considera un acceso externo a Kubernetes. Este caso difiere del escenario donde se restringe el acceso al servicio a aplicaciones con etiquetas específicas.
Solución: modifique la network policy para agregar el bloque CIDR de origen permitido.
-
Ejecute el siguiente comando para consultar su dirección IP local.
curl myip.ipip.netSalida esperada:
Current IP: 10.0.x.x From: China Beijing Beijing # This is an example. Use the actual device information. -
Ejecute el siguiente comando para modificar el archivo policy.yaml.
vim policy.yamlModifique el archivo policy.yaml para incluir el siguiente contenido:
# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true" - ipBlock: cidr: 100.64.0.0/10 - ipBlock: cidr: 10.0.0.1/24 # Local IP address. This is an example. Use the actual device information.Ejecute el siguiente comando para crear una network policy a partir del archivo policy.yaml.
kubectl apply -f policy.yamlSalida esperada:
networkpolicy.networking.k8s.io/access-nginx unchangedNotaAlgunas redes tienen varias direcciones IP de egreso. Se recomienda usar un rango de direcciones /24.
Las direcciones de comprobación de estado de SLB pertenecen al bloque CIDR
100.64.0.0/10. Por lo tanto, debe agregar100.64.0.0/10a la lista de permitidos.
-
Ejecute el siguiente comando para acceder al servicio Nginx.
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shAcceda al servicio nginx:
wget 47.110.XX.XXSalida esperada:
Connecting to 47.110.XX.XX (47.110.XX.XX:80) index.html 100% |***********************************************************| 612 0:00:00 ETALa salida indica que el progreso de la conexión es del 100 %. Esto significa que accedió correctamente al servicio Nginx.
Escenario 3: Restringir un pod para que acceda únicamente a una dirección específica mediante una network policy
-
Ejecute el siguiente comando para obtener la lista de direcciones IP a las que resuelve el nombre de dominio www.aliyun.com.
dig +short www.aliyun.comSalida esperada:
www-jp-de-intl-adns.aliyun.com. www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com. v6wagbridge.aliyun.com. v6wagbridge.aliyun.com.gds.alibabadns.com. 106.XX.XX.21 140.XX.XX.4 140.XX.XX.13 140.XX.XX.3 -
Cree un archivo llamado busybox-policy.yaml.
vim busybox-policy.yamlUtilice la siguiente plantilla para el archivo busybox-policy.yaml:
# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: busybox-policy spec: podSelector: matchLabels: run: busybox egress: - to: - ipBlock: cidr: 106.XX.XX.21/32 - ipBlock: cidr: 140.XX.XX.4/32 - ipBlock: cidr: 140.XX.XX.13/32 - ipBlock: cidr: 140.XX.XX.3/32 - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: {} ports: - protocol: UDP port: 53NotaEn el archivo busybox-policy.yaml, las reglas de egreso se configuran para restringir el acceso saliente de la aplicación. Debe configurar las reglas para permitir solicitudes UDP; de lo contrario, la resolución DNS fallará.
-
Ejecute el siguiente comando para crear una network policy a partir del archivo busybox-policy.yaml.
kubectl apply -f busybox-policy.yamlSalida esperada:
networkpolicy.networking.k8s.io/busybox-policy created -
Ejecute el siguiente comando para crear un pod busybox y probar el acceso.
kubectl run busybox --rm -ti --image=busybox /bin/shAcceda a un sitio web distinto de www.aliyun.com, como www.taobao.com:
wget www.taobao.comSalida esperada:
Connecting to www.taobao.com (64.13.XX.XX:80) wget: can't connect to remote host (64.13.XX.XX): Connection timed outEl mensaje can't connect to remote host indica que el acceso falló.
-
Ejecute el siguiente comando para acceder a www.aliyun.com.
wget www.aliyun.comSalida esperada:
Connecting to www.aliyun.com (140.205.XX.XX:80) Connecting to www.aliyun.com (140.205.XX.XX:443) wget: note: TLS certificate validation not implemented index.html 100% |***********************************************************| 462k 0:00:00 ETALa salida indica que el progreso de la conexión es del 100 %. Esto significa que se accedió correctamente al servicio.
Escenario 4: Controlar el acceso a la red pública de los pods en un namespace mediante una network policy
Esta operación puede afectar los servicios en producción que acceden a la red pública. Se recomienda ejecutar las siguientes operaciones en un namespace vacío.
-
Ejecute el siguiente comando para crear un namespace de prueba.
Cree un namespace llamado test-np.
kubectl create ns test-npSalida esperada:
namespace/test-np created -
Ejecute el siguiente comando para crear una network policy predeterminada en el namespace que permita únicamente el acceso saliente a redes privadas.
vim default-deny.yamlA continuación se muestra una plantilla de ejemplo para el archivo default-deny.yaml:
# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: test-np name: deny-public-net spec: podSelector: {} ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 192.168.0.0/16 - ipBlock: cidr: 172.16.0.0/12 - ipBlock: cidr: 10.0.0.0/8Compruebe que se haya creado el archivo default-deny.yaml.
kubectl apply -f default-deny.yamlSalida esperada:
networkpolicy.networking.k8s.io/deny-public-net createdConsulte la network policy:
kubectl get networkpolicy -n test-npSalida esperada:
NAME POD-SELECTOR AGE deny-public-net <none> 1m -
Ejecute el siguiente comando para crear una network policy que permita a los pods con una etiqueta específica acceder a la red pública.
vim allow-specify-label.yamlEn este ejemplo, la etiqueta es
public-network=true.# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-public-network-for-labels namespace: test-np spec: podSelector: matchLabels: public-network: "true" ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: matchLabels: ns: kube-system # Allows pods to access key services in kube-system (such as CoreDNS). This is an example. Configure as needed.Ejecute el siguiente comando para crear la network policy:
kubectl apply -f allow-specify-label.yamlSalida esperada:
networkpolicy.networking.k8s.io/allow-public-network-for-labels createdConsulte la network policy:
kubectl get networkpolicy -n test-npSalida esperada:
NAME POD-SELECTOR AGE allow-public-network-for-labels public-network=true 1m deny-public-net <none> 3m -
Ejecute los siguientes comandos para comprobar que un pod sin la etiqueta especial no puede acceder a la red pública.
kubectl run -it --namespace test-np --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 busybox-intranetping aliyun.comSalida esperada:
PING aliyun.com (106.11.2xx.xxx): 56 data bytes ^C --- aliyun.com ping statistics --- 9 packets transmitted, 0 packets received, 100% packet lossEl mensaje 0 packets received indica que el acceso falló.
NotaEl acceso falló porque la network policy deny-public-net restringe de forma predeterminada el acceso a la red pública para los pods del namespace test-np. Por lo tanto, los pods iniciados en este namespace con etiquetas predeterminadas no pueden acceder a la red pública.
-
Ejecute el siguiente comando para comprobar que un pod con la etiqueta public-network=true puede acceder a la red pública.
kubectl run -it --namespace test-np --labels public-network=true --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 busybox-internetping aliyun.comSalida esperada:
PING aliyun.com (106.11.1xx.xx): 56 data bytes 64 bytes from 106.11.1xx.xx: seq=0 ttl=47 time=4.235 ms 64 bytes from 106.11.1xx.xx: seq=1 ttl=47 time=4.200 ms 64 bytes from 106.11.1xx.xx: seq=2 ttl=47 time=4.182 ms ^C --- aliyun.com ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 4.182/4.205/4.235 msEl mensaje 0% packet loss indica que se accedió correctamente al servicio.
NotaEl acceso se completó correctamente porque la network policy allow-public-network-for-labels permite el acceso a la red pública para los pods con la etiqueta public-network=true. Por lo tanto, el pod busybox-internet, que tiene esta etiqueta, puede acceder a la red pública.