Сетевая политика
Используя ресурс NetworkPolicy, вы можете управлять потоком трафика для ваших приложений в кластере, на уровне IP-адреса или уровне порта (слой 3 или 4 OSI).
Модель соединения с открытым системами (модель OSI) — это концептуальная модель, которая характеризует и стандартизирует функции связи независимо от основной технологии. Для получения дополнительной информации см. OCI Модель Отказ
С помощью NetworkPolicy вы можете определить, как ваш POD может общаться с различными сетевыми объектами в кластере. Есть три части для определения сетевогоPolicy:
- Выберите стручки, к которым применяется политика. Вы можете сделать это, используя этикетки. Например, используя
приложение = привет
Применяет политику ко всем стручкам с помощью этой этикетки. - Решите, применяется ли политика для входящего (входного) трафика, исходящего (выход) трафика или обоих.
- Определите вход или выходные правила, указав 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»