Мне нужно изолировать сеть модулей k8s между пространствами имен.
pod-1
работающий в пространстве имен ns-1
не может получить доступ к сети из pod-2
в пространстве имен ns-2
.
Целью этого является создание песочницы между пространствами имен и предотвращение сетевого взаимодействия между конкретными модулями на основе их меток.
Я пытался сделать это с помощью сетевая политика, но мои знания о k8s немного "сыры".
Это возможно? Может ли кто-нибудь привести пример?
Я пытаюсь заблокировать все коммуникации внутри сети и разрешить доступ в Интернет, используя это:
spec:
egress:
- ports:
- port: 53
protocol: UDP
to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.0.0.0/8
- 192.168.0.0/16
- 172.16.0.0/12
- 172.40.0.0/16
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
podSelector:
matchExpressions:
- key: camel.apache.org/integration
operator: Exists
policyTypes:
- Egress
Но когда я получаю доступ к чему-то вроде google.com, он правильно разрешает DNS, но не подключается, что приводит к тайм-ауту.
Намерение политики состоит в том, чтобы:
Что я делаю не так?
Я использую minikube для локального тестирования, а prod env — это AWS EKS.
Настройки Сетевые политики очень гибкие, и вы можете настроить их по-разному. Если мы посмотрим на ваш случай, то вы должны создать 2 политики для своего кластера. Во-первых, это сетевая политика пространства имен для вашего производства, а во-вторых, для вашей песочницы. Конечно, прежде чем приступить к изменению вашей сети, убедитесь, что вы выбрали, установили и настроили сеть провайдер.. Это пример файла NetworkPolicy .yaml для изоляции вашего имени NameSpace:
# You can create a "default" policy for a namespace which prevents all ingress
# AND egress traffic by creating the following NetworkPolicy in that namespace.
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: YourSandbox
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
И после этого вы можете создать свой pod в этом NameSpace и он будет изолирован. Просто добавьте в файл конфигурации строку с именем NameSpace:
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-c
namespace: YourSandbox
И в этом примере мы добавляем доступ для подключения снаружи и внутри к определенному NameSpace и сервису:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: access-service-c
namespace: YourSandbox
spec:
podSelector:
matchLabels:
app: YourSandboxService
ingress:
- from:
- namespaceSelector:
matchLabels:
env: YourProdactionNameSpase
- podSelector:
matchLabels:
app: NameOfYourService
egress:
- to:
- namespaceSelector:
matchLabels:
name: YourProdactionNameSpase
- podSelector:
matchLabels:
app: NameOfYourService
Используйте эту сетевую политику ip Block, чтобы настроить выход, блокирующий IP-адреса локальной частной сети по умолчанию, и разрешить остальную часть доступа в Интернет.
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except: 192.168.40.0/24 #Your pul of local private network IPs
Если вы используете длину префикса подсети /32, это означает, что вы ограничиваете область действия правила только этим одним IP-адресом.
Можете ли вы привести пример, как использовать ipBlock
для настройки egress
блокировки IP-адресов локальной частной сети по умолчанию и разрешить остальным доступ в Интернет?
Не могли бы вы мне ответить, помогло ли вам мое решение? Если да, вы можете следовать рекомендациям Переполнение стека по оценке ответов.
Извините за задержку... Я пытаюсь изолировать свои модули в своей интрасети и освободить Интернет с помощью этого pastebin.com/TU8GTC40, но это не работает. Вы можете помочь?
Какую версию Kubernetes вы использовали и как настроили кластер (ваш файл конфигурации)? Вы использовали установку на «голое железо» или какого-то облачного провайдера? Важно воспроизвести вашу проблему.