Сетевая политика в Kubernetes
По умолчанию модули принимают трафик из любого источника. Сетевая политика помогает указать, как группа модулей может взаимодействовать друг с другом и с другими сетевыми конечными точками. NetworkPolicy использует метки для выбора модулей и определяет правила, определяющие, какой трафик разрешен для выбранных модулей. После применения NetworkPolicy к определенному модулю этот модуль будет отклонять подключения, которые не разрешены NetworkPolicy. Поды, которые не выбраны какой-либо NetworkPolicy, продолжат принимать весь трафик.
Чтобы узнать больше о NetworkPolicy, посетите официальную страницу Kubernetes здесь.
В этой статье мы увидим использование Ingress и Egress NetworkPolicy, где входящий трафик — это входящий трафик в модуль, а исходящий — исходящий трафик из модуля.
Предпосылки
- Кластер Kubernetes по крайней мере с 1 рабочим узлом.
Если вы хотите научиться создавать кластер Kubernetes, нажмите здесь. Это руководство поможет вам создать кластер Kubernetes с 1 мастером и 2 узлами на экземплярах AWS Ubuntu 18.04 EC2.
Что мы будем делать?
- Создание сетевых политик
Создание сетевых политик
Политика входящей сети
Создайте модуль hello-web с меткой \app-destination-pod\ и сервисом, на котором мы разрешим входящий трафик через порт 8080.
kubectl run hello-web --labels app=destination-pod --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --
kubectl get pod | grep hello-web
kubectl get service | grep hello-web
Создайте файл определения входа, используя следующий контент, который разрешает трафик в модуле \hello-web\ с меткой \app=destination-pod\ через порт 8080 из модуля, соответствующего метке \app=source-pod\. .
vim ingress.yml
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: destination-pod-allow-from-source-pod spec: policyTypes: - Ingress podSelector: matchLabels: app: destination-pod ingress: - from: - podSelector: matchLabels: app: source-pod
Прежде чем мы создадим политику входящего трафика, создайте модуль с ярлыком \app=unknown\, не соответствующим правилу политики.
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
Теперь, когда мы пытаемся получить доступ к нашему поду \hello-web через порт 8080 из этого пода, он будет доступен.
wget -qO- --timeout=2 http://hello-web:8080
Теперь создайте политику, которая разрешает подключение модуля с меткой \app=destination-pod\ к модулю с меткой \app=source-pod\ и получите подробные сведения о нем.
kubectl apply -f ingress.yml
kubectl get networkpolicy destination-pod-allow-from-source-pod
Теперь снова создайте пакет с ярлыком, не соответствующим правилу, определенному в политике.
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
Если мы снова попытаемся получить доступ к модулю «hello-web» из этого модуля, модуль «hello-web» будет недоступен.
wget -qO- --timeout=2 http://hello-web:8080
На этот раз давайте создадим модуль, соответствующий правилу сетевой политики, т. е. пакет с меткой \app=source-app\.
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-1
Теперь, если мы попытаемся получить доступ к модулю \hello-web\ из модуля с меткой \app=source-pod\, можно получить доступ к \hello-web\.
wget -qO- --timeout=2 http://hello-web:8080
На приведенном выше снимке экрана видно, что модуль \hello-web\ был доступен из модуля с меткой \app=source-pod\. Это означает, что мы ограничили подключения к нашему \hello-web\, и к нему могут подключаться только модули с ярлыком \app=source-pod\.
Политика исходящей сети
Создайте новый файл для Egress Network Policy со следующим содержимым.
vim egress.yml
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: source-pod-allow-to-destination-pod spec: policyTypes: - Egress podSelector: matchLabels: app: source-pod egress: - to: - podSelector: matchLabels: app: destination-pod - ports: - port: 53 protocol: TCP - port: 53 protocol: UDP
Приведенная выше политика разрешает исходящие подключения от модуля с ярлыком \app=source-pod\ к модулю с ярлыком \app=destination-pod\, а также к порту 53 для разрешения DNS.
Прежде чем мы применим политику исходящего трафика в кластере, создайте модуль «hello-web-2» и службу, которая не соответствует нашей политике.
kubectl run hello-web-2 --labels app=hello-2 --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
kubectl get pod | grep hello-web-2
kubectl get service | grep hello-web-2
Теперь создайте модуль с ярлыком \app=source-pod\.
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-2
Прежде чем применить политику исходящего трафика, доступ к приложениям \hello-web\ и \hello-web-2\ можно получить из модуля с меткой \app=source-pod\.
wget -qO- --timeout=2 http://hello-web:8080
wget -qO- --timeout=2 http://hello-web-2:8080
Теперь создайте сетевую политику с правилом выхода.
kubectl create -f egress.yml
kubectl get networkpolicy | grep source-pod-allow-to-destination-pod
Давайте создадим модуль с меткой \app=source-pod\ и попробуем получить доступ к обоим модулям \app=source-pod\
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-3
wget -qO- --timeout=2 http://hello-web:8080
wget -qO- --timeout=2 http://hello-web-2:8080
На приведенном выше снимке экрана вы можете заметить, что на этот раз модуль «hello-web-2» был недоступен, поскольку он не соответствует политике выхода, которая разрешает подключение из модуля с меткой «app=source-pod». в модуль с меткой \app=destination-pod\.
Заключение
В этой статье мы рассмотрели шаги по созданию входящей и исходящей сетевой политики. Мы также увидели, как входящее и исходящее соединение можно ограничить с помощью входящего и исходящего трафика соответственно, и чтобы лучше понять это, мы увидели его реализацию с помощью простого веб-приложения.