Mantén la aplicación funcionando con salida restringida

KubernetesBeginner
Practicar Ahora

Introducción

Meadow Supply debe mostrar disponibilidad en vivo y calcular presupuestos de cesta de práctica mediante su API. En este entorno independiente, las aplicaciones originales se están ejecutando, pero una antigua regla de migración de salida de la API permite conexiones TCP amplias y olvidó DNS. Por tanto, el catálogo muestra un error de disponibilidad. Repara las dependencias necesarias y después retira los permisos innecesarios de la regla antigua sin romper la tienda ni el servicio independiente de expedición.

Usa los métodos de espacios de nombres, roles, políticas, terminal y solicitudes reales enseñados en el laboratorio guiado anterior. Este laboratorio explica la salida, los requisitos de protocolo y puerto de DNS, una variable de terminal y las uniones de políticas antes de que los uses. El clúster real preparado de un solo nodo contiene de forma independiente la aplicación completa y la entrada aprobada a existencias; no se necesitan archivos ni procesos de tu VM anterior. No se requiere instalar el clúster ni programar la aplicación. La duración es una estimación del autor, no una medición del tiempo de principiantes. Todos los productos y notas de expedición son sintéticos, y los presupuestos de práctica no reservan, piden ni cobran nada.

Restaura las dependencias necesarias de la API

En este paso, restaurarás las conexiones reales de DNS y existencias para la Shop API sin abrir todos los destinos.

Abre Shop. El resultado completo esperado es el mismo catálogo de tres productos de Meadow Supply: Glass water bottle cuesta $18.00 con 6 unidades, Everyday notebook $14.00 con 4 y Canvas market bag $24.00 con 0. En el entorno inicial, en cambio, la página dice Live availability unavailable. Los precios siguen visibles, pero la aplicación no tiene una alternativa para las existencias y no puede producir un presupuesto válido. Este es el fallo de dependencia previsto que debes reparar; no lo confundas con una colección de existencias vacía. Reference debe seguir mostrando las dos notas originales de expedición. Cambia a Workspace.

El espacio de trabajo independiente es /home/labex/project/stock-policy. Usa la misma recuperación de rutas que antes: pwd, ls y el cd absoluto si es necesario. Lee el alcance proporcionado:

cd /home/labex/project/stock-policy
cat scope.json

El límite de entrada a existencias ya está preparado en esta VM. Permite el rol de API en meadow-shop; mantén esa política sin cambios. Las conexiones salientes de la API se controlan por separado. Egress significa tráfico que sale de los Pods seleccionados. Una política Egress que selecciona esos Pods los aísla en esa dirección, y la unión de todas las reglas de salida aplicables determina qué puede salir. El tráfico de respuesta de una conexión permitida queda permitido implícitamente.

Lee la política de migración existente en el espacio de nombres de la API:

kubectl --context=labex-v135 -n meadow-shop get networkpolicies
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress

legacy-egress selecciona role=shop-api y permite el puerto TCP 8080 hacia cualquier destino. No incluyó DNS. CoreDNS es el servicio de nombres preparado del clúster. Un nombre de Service necesita una consulta DNS antes de que una conexión HTTP pueda usar su dirección. DNS (Domain Name System) traduce nombres a direcciones. UDP (User Datagram Protocol) envía datagramas individuales; TCP (Transmission Control Protocol) establece conexiones. El servicio DNS de este clúster acepta ambos en el puerto 53, por lo que se requieren ambas rutas hacia los Pods DNS de kube-system.

El modo dns de la herramienta de diagnóstico proporcionada envía una consulta DNS UDP nueva al resolvedor de ese Pod; dns-tcp envía una consulta TCP nueva. Ninguno depende de un resultado de aplicación en caché. Prueba la identidad real de la API:

./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local

Ambos deben informar NETWORK_TIMEOUT y una salida con código distinto de cero. Estos fallos esperados afectan a la conexión DNS. Para distinguirlos de un proceso de existencias detenido, realiza una solicitud de diagnóstico explícita a la dirección original del Service de existencias.

La siguiente asignación captura la salida de un comando con $(...) en la variable de shell stock_ip. -o jsonpath='{.spec.clusterIP}' selecciona solo el campo spec.clusterIP del Service; las comillas mantienen unida la expresión. Esta variable pertenece a la sesión actual del terminal Workspace. Es un valor de diagnóstico, no un destino de política ni una dirección permanente de Pod. Si vuelves a conectarte a un shell nuevo, repite la asignación antes de usarla.

stock_ip=$(kubectl --context=labex-v135 -n meadow-stock get service stock -o jsonpath='{.spec.clusterIP}')

printf muestra la cadena capturada; %s significa una cadena y \n termina la línea. Las comillas dobles conservan el valor expandido como un solo argumento:

printf '%s\n' "$stock_ip"

${stock_ip} expande esa variable dentro de la URL de la solicitud. La regla TCP amplia existente permite esta conexión sin necesitar DNS:

./tools/network-test api http "http://${stock_ip}:8080/stock.json"

Espera ver HTTP_REPLY 200 y los registros originales de existencias. El acceso TCP existe; resolver el nombre es una dependencia separada. Nunca pongas esa dirección en la política terminada: usa las relaciones estables de espacio de nombres y rol.

Inspecciona las etiquetas reales de DNS antes de seleccionarlas. -l k8s-app=kube-dns selecciona los Pods DNS preparados:

kubectl --context=labex-v135 get namespace kube-system --show-labels
kubectl --context=labex-v135 -n kube-system get pods -l k8s-app=kube-dns --show-labels

Crea tu propia política api-egress. Selecciona el rol de API. Sus dos reglas to son alternativas: DNS en kube-system en UDP/TCP 53, o inventario en meadow-stock en TCP 8080. Dentro de cada par individual de selectores de destino, los selectores de espacio de nombres y Pod se combinan con AND. Los puertos de cada regla solo se aplican a los destinos de esa regla.

mkdir -p conserva un directorio de versión existente. Como se enseñó antes, el here-document entre comillas y > escriben solo tu archivo de versión editable:

mkdir -p release
cat > release/api-egress.yaml <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-egress
  namespace: meadow-shop
spec:
  podSelector:
    matchLabels:
      role: shop-api
  policyTypes:
    - Egress
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: meadow-stock
          podSelector:
            matchLabels:
              role: inventory
      ports:
        - protocol: TCP
          port: 8080
YAML

Lee, aplica e inspecciona el manifiesto guardado:

cat release/api-egress.yaml
kubectl --context=labex-v135 apply -f release/api-egress.yaml
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy api-egress

Confirma ambos transportes DNS reales y la conexión a existencias por nombre. La aplicación efectiva puede tardar unos segundos después de aplicar; repite una solicitud tras una breve espera si todavía se observa el límite anterior.

./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local
./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json

Espera ver DNS_REPLY UDP, DNS_REPLY TCP y después HTTP_REPLY 200 con todos los datos originales de existencias. Cambia a Shop y recarga. La disponibilidad en vivo debe volver. Abre Glass water bottle, selecciona Quantity 2 y usa Try a basket quote. Espera ver Ready for collection, un total de $36.00 y 6 unidades disponibles, con el aviso de práctica sin reserva. Vuelve mediante Back to product y Back to collection.

Compara el catálogo en vivo restaurado con este resultado real en ejecución:

Meadow Supply con sus dependencias necesarias restauradas

Esto completa la reparación de las conexiones necesarias, pero todavía no demuestra que se denieguen los destinos ajenos a la API. Otra política aún puede añadir permisos. Continúa al siguiente paso antes de tratar esto como el límite final.

Ante un error de escritura, vuelve con pwd, ls y el cd absoluto. Ante un manifiesto mal formado o una solicitud de dependencia fallida, lee tu archivo guardado, la salida de describe y las etiquetas y puertos reales enseñados, corrige el archivo y vuelve a aplicarlo. DNS_REPLY es un resultado del servicio de nombres; HTTP_REPLY es una respuesta de aplicación; NETWORK_TIMEOUT significa que no hubo respuesta dentro del tiempo de espera de red preparado; CONNECTION_REFUSED indica un destino que rechazó la conexión. El REQUEST_TIMEOUT acotado de la herramienta incluye la solicitud completa y DNS. Un fallo genérico no demuestra una política correcta. No cambies el código de la aplicación, etiquetas, archivos fuente, Pods originales, entrada a existencias, Services, red del host ni infraestructura DNS.

Retira el permiso amplio antiguo

En este paso, eliminarás el permiso innecesario de la política de migración antigua y conservarás el recorrido del cliente reparado y el servicio independiente de expedición.

Empieza en Workspace, en /home/labex/project/stock-policy. Tu nueva política solo permite DNS y existencias. Prueba el servicio de expedición ajeno a la API desde la API:

./tools/network-test api http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json

Actualmente devuelve HTTP_REPLY 200 y las dos notas de expedición. Este éxito revela un permiso excesivo; la Shop API no necesita acceder a expedición. La nueva política restringida no anula la amplia existente. Las NetworkPolicies suman las conexiones permitidas, independientemente del orden de aplicación. Para que una conexión funcione, tanto la salida del origen como la entrada del destino deben permitirla.

Enumera ambas políticas de nuevo y después lee la política de migración administrada y su fuente original:

kubectl --context=labex-v135 -n meadow-shop get networkpolicies
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress
cat starter/legacy-egress.yaml

La regla heredada permite el puerto TCP 8080 sin una restricción de destino to. Ese permiso sigue aplicándose a los Pods de API seleccionados. En esta versión, conserva el objeto administrado original legacy-egress y retira sus permisos actualizándolo directamente. Guárdalo sin entradas de permiso de salida, representadas por la lista vacía egress: []. Tu política independiente api-egress continúa proporcionando las dos conexiones necesarias. Mantén sin cambios el archivo inicial de solo lectura.

cat > release/legacy-egress.yaml <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: legacy-egress
  namespace: meadow-shop
spec:
  podSelector:
    matchLabels:
      role: shop-api
  policyTypes:
    - Egress
  egress: []
YAML

Lee y aplica la política administrada guardada. No la elimines y recrees:

cat release/legacy-egress.yaml
kubectl --context=labex-v135 apply -f release/legacy-egress.yaml
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress

Debe seguir seleccionando el rol de API, pero no aportar ningún permiso de salida. Tu directorio final de versión contiene ambas políticas guardadas. La política preparada de entrada a existencias permanece sin cambios.

Ahora la solicitud de la API a expedición, que no necesita, debe agotar el tiempo de espera, mientras la solicitud de control del cliente a ese mismo servicio sigue teniendo éxito:

./tools/network-test api http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json
./tools/network-test customer http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json

Espera ver NETWORK_TIMEOUT con una salida de código distinto de cero para API, seguido de HTTP_REPLY 200 con ambas notas sin cambios para Customer. Este par impide que un servicio detenido se haga pasar por un aislamiento correcto. Si la solicitud de la API sigue teniendo éxito inmediatamente después de aplicar, espera unos segundos y repite hasta observar el nuevo límite real.

Confirma de nuevo la ruta aprobada a existencias y ambos protocolos DNS:

./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local

Cambia a Shop, recarga y repite el presupuesto de Glass water bottle para Quantity 2: Ready for collection, $36.00, 6 unidades. Después calcula un presupuesto de Canvas market bag, Quantity 1: Not enough stock, $24.00, 0 unidades. Vuelve a la colección y abre Our approach para confirmar el alcance de práctica. Cambia a Reference y recarga; ambas notas originales de recogida permanecen. Usa Download notes e inspecciona la descarga real de dos registros. Esta descarga del navegador está separada del espacio de trabajo del terminal y no es necesario copiarla allí.

Tu entrega es release/api-egress.yaml junto con release/legacy-egress.yaml, aplicadas a las identidades originales de las políticas. Tanto los permisos en servicio como los guardados deben coincidir con los límites enseñados de espacio de nombres y rol, protocolo y puerto: DNS UDP/TCP 53 y existencias TCP 8080, sin que la política heredada aporte permisos. Conserva todos los recursos originales de aplicación, Pods, etiquetas de espacios de nombres, datos y fuentes proporcionadas. Si una corrección rompe la tienda, inspecciona las rutas enseñadas de DNS y existencias, corrige solo los archivos de políticas editables y aplícalos de nuevo. No añadas otra regla que permita todo ni cambies la aplicación para evitar DNS. Estas observaciones finitas de TCP/UDP no demuestran un límite de seguridad de red de producción frente a nodos o administradores.

Resumen

Separaste la resolución de nombres de una conexión de aplicación, restauraste las dependencias reales de DNS y existencias de la API y mantuviste en funcionamiento los presupuestos del cliente en vivo. También descubriste por qué una política restringida no eliminaba un permiso aportado por otra política y después retiraste ese permiso heredado sin detener el servicio ajeno a la API.

La versión final guardada y la unión de políticas en servicio permiten las rutas necesarias de DNS y existencias y deniegan el acceso de la API a expedición. El orden de las políticas no establece precedencia; evalúa los permisos combinados y conserva controles positivos al interpretar los fallos.