Поиск по сайту:

Сетевая политика в Kubernetes


По умолчанию модули принимают трафик из любого источника. Сетевая политика помогает указать, как группа модулей может взаимодействовать друг с другом и с другими сетевыми конечными точками. NetworkPolicy использует метки для выбора модулей и определяет правила, определяющие, какой трафик разрешен для выбранных модулей. После применения NetworkPolicy к определенному модулю этот модуль будет отклонять подключения, которые не разрешены NetworkPolicy. Поды, которые не выбраны какой-либо NetworkPolicy, продолжат принимать весь трафик.

Чтобы узнать больше о NetworkPolicy, посетите официальную страницу Kubernetes здесь.

В этой статье мы увидим использование Ingress и Egress NetworkPolicy, где входящий трафик — это входящий трафик в модуль, а исходящий — исходящий трафик из модуля.

Предпосылки

  1. Кластер Kubernetes по крайней мере с 1 рабочим узлом.
    Если вы хотите научиться создавать кластер Kubernetes, нажмите здесь. Это руководство поможет вам создать кластер Kubernetes с 1 мастером и 2 узлами на экземплярах AWS Ubuntu 18.04 EC2.

Что мы будем делать?

  1. Создание сетевых политик

Создание сетевых политик

Политика входящей сети

Создайте модуль 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\.

Заключение

В этой статье мы рассмотрели шаги по созданию входящей и исходящей сетевой политики. Мы также увидели, как входящее и исходящее соединение можно ограничить с помощью входящего и исходящего трафика соответственно, и чтобы лучше понять это, мы увидели его реализацию с помощью простого веб-приложения.