Рубрики
Uncategorized

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

Сетевая политика с использованием ресурса NetworkPolicy, вы можете управлять потоком трафика для вашего … Тег с Куберанетами, дежоптом.

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

Используя ресурс NetworkPolicy, вы можете управлять потоком трафика для ваших приложений в кластере, на уровне IP-адреса или уровне порта (слой 3 или 4 OSI).

Модель соединения с открытым системами (модель OSI) — это концептуальная модель, которая характеризует и стандартизирует функции связи независимо от основной технологии. Для получения дополнительной информации см. OCI Модель Отказ

С помощью NetworkPolicy вы можете определить, как ваш POD может общаться с различными сетевыми объектами в кластере. Есть три части для определения сетевогоPolicy:

  1. Выберите стручки, к которым применяется политика. Вы можете сделать это, используя этикетки. Например, используя приложение = привет Применяет политику ко всем стручкам с помощью этой этикетки.
  2. Решите, применяется ли политика для входящего (входного) трафика, исходящего (выход) трафика или обоих.
  3. Определите вход или выходные правила, указав IP-блоки, порты, селекторы POD или селекторов пространства имен.

Вот образец сетиPolicy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: hello
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          owner: ricky 
    - podSelector:
        matchLabels:
          version: v2
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 500

Давайте сломаем вышеуказанный ямл. Подселектор говорит нам, что политика применяется ко всем стручкам в по умолчанию пространство имен, которые имеют Приложение: Здравствуйте Набор этикетки. Мы определяем политику как для входа, так и для выхода.

Вызывы политики PODS применяются, чтобы можно было сделать из любого IP в блоке CIDR 172.17.0.0/16 (Это 65536 IP-адреса, от 172.17.0.0.0 до 172.17.255.255), за исключением стручек, чьи ИС падает в блоке CIDR 172.17.1.0/24 (256 IP-адресов, от 172.17.1.0 до 172.17.1.255) в порт 8080 Отказ Кроме того, вызовы политики PODS применяются к тому, чтобы прийти с любых POD в пространстве имен с этикеткой Владелец: Рики И любой стручок из по умолчанию пространство имен, помеченные Версия: v2 Отказ

Политика выхода указывает, что стручки с этикеткой приложение: Привет в по умолчанию пространство имен может совершать звонки на любой IP в течение 10.0.0.0/24 (256 IP-адресов, от 10.0.0.0, 10.0.0.255), но только в порт 5000 Отказ

Подставка селекторов POD и пространства имен и и или семантика. Давайте рассмотрим следующий фрагмент:

  ...
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: ricky
      podSelector:
        matchLabels:
          app: website
  ...

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

Если вы измените Подселектор быть отдельным элементом в от Массив, добавив - Вы используете или оператор.

  ...
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: ricky
    - podSelector:
        matchLabels:
          app: website
  ...

Вышеуказанный фрагмент включает в себя все стручки, помеченные Приложение: сайт Или все стручки из пространства имен с этикеткой Пользователь: Ricky Отказ

Установите Cilium

Сетевые политики реализованы (и применяются правила) через плагины сети. Если вы не устанавливаете сетевой плагин, политики не будут иметь никакого эффекта.

Я буду использовать Cilium Plugin И установите его поверх Minikube. Вы также можете использовать другой плагин, такой как Calico Отказ

Если у вас уже есть Minikube работает, вам придется остановить и удалить кластер (или создать новый). Вам придется начать Minikube с CNI Флаг для Cilium, чтобы правильно работать:

$ minikube start --network-plugin=cni

Как только Minikube начинается, вы можете установить Cilium.

$ kubectl create -f https://raw.githubusercontent.com/cilium/cilium/1.8.3/install/kubernetes/quick-install.yaml
all/kubernetes/quick-install.yaml
serviceaccount/cilium created
serviceaccount/cilium-operator created
configmap/cilium-config created
clusterrole.rbac.authorization.k8s.io/cilium created
clusterrole.rbac.authorization.k8s.io/cilium-operator created
clusterrolebinding.rbac.authorization.k8s.io/cilium created
clusterrolebinding.rbac.authorization.k8s.io/cilium-operator created
daemonset.apps/cilium created
deployment.apps/cilium-operator created

Cilium установлен в Kube-System пространство имен, так что вы можете запустить Kubectl Получить Po -n Kube-System И дождитесь, пока стручки Cilium не работают.

Пример

Давайте посмотрим на пример, который демонстрирует, как отключить выходной трафик от стручков.

apiVersion: v1
kind: Pod
metadata:
  name: no-egress-pod
  labels:
    app.kubernetes.io/name: hello
spec:
  containers:
    - name: container
      image: radial/busyboxplus:curl
      command: ["sh", "-c", "sleep 3600"]

Сохранить вышеуказанный YAML к No-Egess-Pod.yaml и создать стручок, используя Kubectl Apply Printe -F NO-EGRESS-POD.YAML Отказ

Как только POD работает, давайте попробуем позвонить Google.com Использование скручивание :

$ kubectl exec -it no-egress-pod -- curl -I -L google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Thu, 24 Sep 2020 16:30:59 GMT
Expires: Sat, 24 Oct 2020 16:30:59 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

HTTP/1.1 200 OK
...

Вызов завершается успешно. Давайте определим сетевую политику, которая предотвратит выход для стручек с этикеткой app.kubernetes.io/name: Hello :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-egress
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/name: hello
  policyTypes:
    - Egress

Если вы запускаете одну и ту же команду на этот раз, Curl не сможет разрешить хост:

$ kubectl exec -it no-egress-pod -- curl -I -L google.com
curl: (6) Couldn't resolve host 'google.com'

Попробуйте работает KUBECTL EDIT POD NO-EGRES-POD и изменить значение этикетки на HELLO123 Отказ Сохраните изменения, а затем повторно запустите команду curl. На этот раз команда работает нормально, потому что мы поменяли метку POD, и сетевая политика больше не относится к ней.

Общие сетевые политики

Давайте посмотрим на пару сценариев и соответствующих сетевых политик.

Запретить весь выход

Отничает весь выходной трафик от стручков в пространстве имен, поэтому PODS не может внести какие-либо исходящие запросы.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-egress
spec:
  podSelector: {}
  policyTypes:
    - Egress

Отрицать все проникновение трафика

Отказывает на все проникновение трафика, и стручки не могут получить какие-либо запросы.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
spec:
  podSelector: {}
  policyTypes:
    - Ingress

Разрешить вход на трафик к определенным стручкам

Разрешить вход к определенным стручкам, идентифицированным на этикетке Приложение: My-App Отказ

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: pods-allow-all
spec:
  podSelector:
    matchLabels:
      app: my-app
  ingress:
    - {}

Отрицать вход в определенные стручки

Отрицает вход в определенные стручки, идентифицированные на этикетке Приложение: My-App Отказ

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: pods-deny-all
spec:
  podSelector:
    matchLabels:
      app: my-app
  ingress: []

Ограничить движение к определенным стругам

Позволяет трафику только от определенных стручков. Разрешить трафик от Приложение: клиенты Для любых предпринимателей Frontend ( Роль: Frontend ), которые являются частью того же приложения ( приложение: клиенты ).

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: frontend-allow
spec:
  podSelector:
    matchLabels:
      app: customers
      role: frontend
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: customers

Отрицать все трафик в и внутри пространства имен

Отказывает на все входящие трафик (не определено никаких правил входа) ко всем стручкам (пустой подселектор ) в прод пространство имен. Любые звонки из-за пределов по умолчанию пространство имен будет заблокировано и любые звонки между стручками в том же пространстве имен.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: prod-deny-all
  namespace: prod
spec:
  podSelector: {}
  ingress: []

Отрицать все трафик с других пространств имен

Отказывает на все трафики из других пространств имен, приходя к стручкам в прод пространство имен. Это соответствует всем стручкам (пустой Подселектор Несомненно в прод пространство имен и позволяет вступить от всех стручек в продлицо пространство имен, как вход Подселектор тоже пусто.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-other-namespaces
  namespace: prod
spec:
  podSelector: {}
  ingress:
    - from:
        - podSelector: {}

Запретить все выходные трафик для определенных стручков

Отрицает стручки, помеченные Приложение: API от выполнения любых внешних вызовов.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-deny-egress
spec:
  podSelector:
    matchLabels:
      app: api
  policyTypes:
    - Egress
  egress: []

Оригинал: «https://dev.to/peterj/kubernetes-network-policy-11di»