Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Вопрос:
- Как предоставить/получить доступ к поду при обращении снаружи через Ingres-ресурс при использовании сетевой политики, которая ограничивает доступ к поду
- client-loadbalancer->ingress-nginx-controller pod->целевой под
- Описание окружения:
- K8s развернут на своих виртуалках
- K8s-version: 1.21.2
- CRI: containerd
- CNI: calico
- Master: 3 ноды
- Worker: 3 ноды
- Pod network: 10.33.0.0/16
- Host network: 10.31.69.0/24
- Ingres-nginx в режиме
- HostNetwork: true
- установлен на всех трех Worker-нодах
- Впереди стоящий Loadbalancer раскидывает round-robin-ом запросы на рабочие ноды на порт 80, который слушает под с ingress-nginx-controller
- Для дебага запускаю целевой под (под с меткой app: myappA) в количестве одной реплики
- Описание задачи:
- При настройке сетевой политики, которая разрешает подключение к целевому поду (поду с меткой app: myappA) только c пода c меткой app: myappB из того же namespace
- блокируется доступ к поду с меткой app: myappA через обращение через ingress-ресурс по цепочке
- client->loadbalancer->ingress->pod с меткой app: myappA
- Доступ разрешен только в том случае, когда loadbalancer кидает запрос клиента на ingress-nginx-contorller pod, который запущен на той же самой ноде, на которой запущен под с меткой app: myappA
- т.е. при таком запросе
- client-loadbalancer->ingress-nginx-controller pod (например, на хосте node02)-> pod c меткой app: myappA(на хосте node02)
- пакет не попадает под фильтрацию сетевых политик и успешно достигает целевого пода
- Если же loadbalancer кидает запрос на ingress-nginx-contorller pod, который запущен на отличной/другой ноде, чем целевой под, то пакет ожидаемо отбрасывает сетевой политикой и недостигает целевого хоста
- # cat network-policy.yaml
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: allow-myappA-ingress-mynamespace
- namespace: mynamespace
- spec:
- policyTypes:
- - Ingress
- podSelector:
- matchLabels:
- app: myappA
- ingress:
- - ports:
- - port: 9000
- protocol: TCP
- from:
- - podSelector:
- matchLabels:
- app: myappB
- Вопрос, как предоставить/получить доступ к поду при обращении снаружи через Ingres-ресурс
- client-loadbalancer->ingress-nginx-controller pod->целевой под
- Указанные ниже два варианта(через ipBlock) реализуют желаемое поведение, но тем самым делают использование сетевой политики бесполезной совсем
- Если разрешить подсеть подов, тогда любой под с любого namespace будет иметь доступ к целевому поду, что нивелирует сетевую политику
- Например
- - ipBlock:
- cidr: 10.33.0.0/16
- Аналогично поведение(доступ к поду будет разрешен со всех подов со всех namespace-ов) будет, если разрешить только с ip-адресов из подсети подов, которые(ip-адреса) назначены на рабочие ноды
- Например
- - ipBlock:
- cidr: 10.33.241.192/32 # (ip-адрес из подсети подов worker1-ноды)
- - ipBlock:
- cidr: 10.33.116.192/32 # (ip-адрес из подсети подов worker2-ноды)
- - ipBlock:
- cidr: 10.33.69.113/32 # # (ip-адрес из подсети подов worker3-ноды)
- Указание всех подов из namespace по метке namespace, в котором раздеплоены ingress-nginx-controller поды, тоже ожидаемо не приносит желаемого результата - доступ через ingress запрещен
- т.к. ingress-nginx-controller запущен в режиме HostNetwork: true и соответственно запросы обрабатываются в корневом/хостовом namespace-e
- - namespaceSelector:
- matchLabels:
- app.kubernetes.io/name: ingress-nginx
- # kubectl get ns --show-labels |grep ingress-nginx
- ingress-nginx Active app.kubernetes.io/instance=ingress-nginx,
- app.kubernetes.io/name=ingress-nginx,
- kubernetes.io/metadata.name=ingress-nginx
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement