kamaok

Network Policy

Nov 25th, 2021 (edited)
508
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Вопрос:
  2. Как предоставить/получить доступ к поду при обращении снаружи через Ingres-ресурс при использовании сетевой политики, которая ограничивает доступ к поду
  3. client-loadbalancer->ingress-nginx-controller pod->целевой под
  4.  
  5. Описание окружения:
  6. K8s развернут на своих виртуалках
  7. K8s-version: 1.21.2
  8. CRI: containerd
  9. CNI: calico
  10.  
  11. Master: 3 ноды
  12. Worker: 3 ноды
  13.  
  14. Pod network: 10.33.0.0/16
  15. Host network: 10.31.69.0/24
  16.  
  17. Ingres-nginx в режиме
  18. HostNetwork: true
  19. установлен на всех трех Worker-нодах
  20. Впереди стоящий Loadbalancer раскидывает round-robin-ом запросы на рабочие ноды на порт 80, который слушает под с ingress-nginx-controller
  21.  
  22. Для дебага запускаю целевой под (под с меткой app: myappA) в количестве одной реплики
  23.  
  24. Описание задачи:
  25. При настройке сетевой политики, которая разрешает подключение к целевому поду (поду с меткой app: myappA) только c пода c меткой app: myappB из того же namespace
  26. блокируется доступ к поду с меткой app: myappA  через обращение через ingress-ресурс по цепочке
  27. client->loadbalancer->ingress->pod с меткой app: myappA
  28.  
  29. Доступ разрешен только в том случае, когда loadbalancer кидает запрос клиента на ingress-nginx-contorller pod, который запущен на той же самой ноде, на которой запущен под с меткой app: myappA
  30. т.е. при таком запросе
  31. client-loadbalancer->ingress-nginx-controller pod (например, на хосте node02)-> pod c меткой app: myappA(на хосте node02)
  32. пакет не попадает под фильтрацию сетевых политик и успешно достигает целевого пода
  33.  
  34. Если же loadbalancer кидает запрос на ingress-nginx-contorller pod, который запущен на отличной/другой ноде, чем целевой под, то пакет ожидаемо отбрасывает сетевой политикой и недостигает целевого хоста
  35.  
  36. # cat network-policy.yaml
  37.  
  38. apiVersion: networking.k8s.io/v1
  39. kind: NetworkPolicy
  40. metadata:
  41.   name: allow-myappA-ingress-mynamespace
  42.   namespace: mynamespace
  43. spec:
  44.   policyTypes:
  45.  - Ingress
  46.   podSelector:
  47.     matchLabels:
  48.       app: myappA
  49.   ingress:
  50.   - ports:
  51.      - port: 9000
  52.        protocol: TCP
  53.     from:
  54.       - podSelector:
  55.           matchLabels:
  56.             app: myappB
  57.  
  58.  
  59. Вопрос, как предоставить/получить доступ к поду при обращении снаружи через Ingres-ресурс
  60. client-loadbalancer->ingress-nginx-controller pod->целевой под
  61.  
  62.  
  63. Указанные ниже два варианта(через ipBlock) реализуют желаемое поведение, но тем самым делают использование сетевой политики бесполезной совсем                          
  64. Если разрешить подсеть подов, тогда любой под с любого namespace будет иметь доступ к целевому поду, что нивелирует сетевую политику
  65. Например
  66.       - ipBlock:
  67.           cidr: 10.33.0.0/16
  68.  
  69. Аналогично поведение(доступ к поду будет разрешен со всех подов со всех namespace-ов) будет, если разрешить только с ip-адресов из подсети подов, которые(ip-адреса) назначены на рабочие ноды
  70. Например
  71.       - ipBlock:
  72.           cidr: 10.33.241.192/32  # (ip-адрес из подсети подов worker1-ноды)
  73.       - ipBlock:
  74.           cidr: 10.33.116.192/32 # (ip-адрес из подсети подов worker2-ноды)
  75.       - ipBlock:
  76.           cidr: 10.33.69.113/32 # # (ip-адрес из подсети подов worker3-ноды)
  77.  
  78. Указание всех подов из namespace по метке namespace, в котором раздеплоены ingress-nginx-controller поды, тоже ожидаемо не приносит желаемого результата - доступ через ingress запрещен
  79. т.к. ingress-nginx-controller запущен в режиме HostNetwork: true и соответственно запросы обрабатываются в корневом/хостовом namespace-e
  80.       - namespaceSelector:
  81.           matchLabels:
  82.             app.kubernetes.io/name: ingress-nginx
  83.  
  84.  
  85. # kubectl get ns --show-labels  |grep ingress-nginx
  86. ingress-nginx          Active    app.kubernetes.io/instance=ingress-nginx,
  87.                                  app.kubernetes.io/name=ingress-nginx,
  88.                                  kubernetes.io/metadata.name=ingress-nginx
  89.  
  90.  
RAW Paste Data