Сетевые политики
По умолчанию все приложения внутри различных неймспейсов кластера могут взаимодействовать друг с другом. Чтобы обеспечить разделение сети, необходимо настроить сетевую политику. Сетевая политика опеределяет, будет ли разрешен входящий и исходящий трафик из одного, нескольких или всех подов неймспейса.
Для управления сетями в составе платформы Штурвал поставляется Cilium. Для настройки сетевого разделения между неймспейсами перейдите в раздел Администрирование кластера/Сетевые политики. В релизе 2.5.1+ доступно создание CiliumNetworkPolicy. В будущем планируется добавление графического управления ClusterWideCiliumNetworkPolicy. Создать политику можно в графическом интерфейсе или с помощью импорта манифеста.
Изменение ранее созданной политики доступно в графическом интерфейсе и с помощью правки YAML файла, расположенного на вкладке просмотра сетевой политики.
Для создания политик реализован графический интерфейс. Он представлен в виде блоков, обозначающий компоненты, между которыми конфигурируется доступ, и линии, которые отображают связи между компонентами.
Есть 3 уровня компонентов:
- вне кластера;
- внутри кластера;
- внутри неймспейса.
Центральным компонентом схемы является неймспейс, в рамках которого происходит настройка (далее - конфигурируемый неймспейс).
Правила сетевых политик
Для каждого компонента можно настроить правило взаимодействия с неймспейсом. Входящие потоки в конфигурируемый неймспейс регламентируются правилами Ingress, исходящие - правилами Egress. Для создания правила нажмите на + в блоке компонента и выберите параметры. Добавленные правила будут отображаться в нижней части блока компонента. Для удаления правила нажмите на правило, затем на значок корзины в открывшемся окне. От каждого созданного правила отображается связь до конфигурируемого неймспейса.
Правила могут быть:
- Запрещающим (запрещает обращение одного объекта к другому по указанному порту)
- Разрешающим (разрешает обращение одного объекта к другому по указанному порту)
- Отключенным (правило неактивно, не выполняет разрешения или запрета).
Когда весь трафик по умолчанию разрешен и добавляется правило, накладывающее ограничение, то трафик вне этого правила запрещается.
Ingress правила (Входящий трафик)
Вне кластера
На этом уровне можно определить правила входящего в неймспейс кластера трафика:
- Из любого эндпоинта. При установлении запрещающего правила трафик из любых эндпоинтов вне кластера к указанным портам объектов в конфигурируемом неймспейсе будет отбрасываться.
- Из CIDR.
Если необходимо, чтобы поды конфигурируемого неймспейса получали входящий трафик, рассмотрите один из следующих вариантов:
- разрешить входящий трафик только с любых эндпоинтов;
- разрешить входящий трафик любым подам, но только к определенному порту(ам) (например, к порту 80);
- разрешить входящий трафик только к любому поду конфигурируемого неймспейса с любых эндпоинтов.
Внутри кластера
Трафик из любого пода или неймспейса в кластере будет отброшен, если не разрешен другими правилами.
Если подам конфигурируемого неймспейса требуется получать входящий трафик от других подов в кластере, рассмотрите один из следующих вариантов:
- разрешить входящий трафик только из выбранных неймспейсов;
- разрешить входящий трафик только от подов, соответствующих выбранным лейблам;
- разрешить весь входящий трафик от любого пода в кластере.
Типы правил:
- Из всех ресурсов кластера;
- Из некоторых неймспейсов;
- Из некоторых подов;
- Из хостов (выбирает локальный хост и все контейнеры, запущенные на этом хосте);
- Из удаленных узлов (Любой узел в любом из подключенных кластеров, кроме локального хоста, все контейнеры, работающие в режиме сети хоста на удаленных узлах).
Внутри неймспейса
Весь входящий трафик к любому поду конфигурируемого неймспейса будет отброшен, если он не разрешен другими правилами.
Типы правил:
- Из любого пода;
- Из некоторых подов;
Egress правила (Исходящий трафик)
Вне кластера
Исходящий трафик к любому эндпоинту вне кластера будет запрещен, если его не разрешают другие правила.
Если поды в конфигурируемом неймспейсе должны иметь возможность передавать трафик в эндпоинты за пределами кластера, рассмотрите одну из следующих опций:
- Разрешить трафик к конкретным CIDR;
- Разрешить трафик к конкретным FQDN;
- Разрешить трафик к любому эндпоинту вне кластера.
Типы правил:
- К любому эндпоинту;
- До CIDR;
- До FQDN.
Чтобы разрешить трафик до FQDN должен быть разрешен трафик до Kubernetes DNS и включен DNS proxy. Без соблюдения этих условий правило добавить можно, но оно не будет работать. Такая связь будет отображаться серым цветом.
Внутри кластера
Исходящий трафик к любому поду в любом неймспейсе кластера будет запрещен, если он не разрешен другими правилами.
Если необходимо отправлять исходящий трафик к другим подам в других неймспейсах внутри кластера, рассмотрите один из следующих вариантов:
- разрешить исходящий трафик только к выбранным неймспейсам;
- разрешить исходящий трафик только к подам, соответствующим выбранным лейблам.
Типы правил:
- Ко всем ресурсам кластера (по умолчанию);
- Kubernetes DNS (Когда разрешена: разрешает потоки Egress в Kubernetes DNS. Когда запрещена: Текущая политика не допускает передачу трафика на DNS Kubernetes. В результате запросы DNS от подов в конфигурируемый неймспейс будут игнорироваться, если не будет разрешено другими правилами). Когда Kubernetes DNS разрешен, есть возможность включить или отключить DNS proxy. Когда отключен, отображается тег “Разрешить DNS”.
- К некоторым неймспейсам;
- К некоторым подам;
- К сервисам;
- К хостам (выбирает локальный хост и все контейнеры, запущенные на этом хосте);
- К удаленным узлам (любой узел в любом из подключенных кластеров, кроме локального хоста. Также выбирает все контейнеры, работающие в режиме сети хоста на удаленных узлах).
Внутри неймспейса
Исходящий трафик к любому поду из конфигурируемого неймспейса будет запрещен, если не разрешен другими правилами.
Используйте селекторы подов, чтобы обеспечить минимальные привилегии безопасности, или разрешите весь входящий трафик в пределах неймспейса для начала работы с более простой политикой.
Типы правил:
- К любому поду;
- К сервисам;
- К некоторым подам.
Дефолтные сетевые политики
Доступ к KubeAPI-серверу
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-kube-apiserver
namespace: yournamespacename
spec:
description: "For endpoints in this namespace, allow egress to kube-apiserver"
endpointSelector: {}
egress:
- toEntities:
- kube-apiserver
Запрещающая политика
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: deny-all
namespace: yournamespacename
spec:
description: "Deny all traffic in this namespace"
endpointSelector: {}
ingress:
- {}
egress:
- {}
Исходящий трафик к KubeDNS и NodeLocalDNS
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-dns
namespace: yournamespacename
spec:
description: "For endpoints in this namespace, allow egress to kube-dns and shturval-caching-dns"
endpointSelector: {}
egress:
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: kube-system
k8s-app: kube-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
- port: "53"
protocol: TCP
- port: "9153"
protocol: TCP
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: kube-system
app.kubernetes.io/name: shturval-caching-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
- port: "9253"
protocol: TCP
Исходящий трафик к определенному приложению
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-egress
namespace: yournamespacename
spec:
description: "For endpoints in this namespace, allow to target app"
endpointSelector: {}
egress:
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: <TARGET NAMESPACE>
app.kubernetes.io/name: <TARGET APP NAME>
toPorts:
- ports:
- port: "<TARGET APP PORT>"
protocol: <TARGET APP PORT PROTOCOL(TCP/UDP)>
Входящий трафик из Ingress-контроллера
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-ingress
namespace: yournamespacename
spec:
description: "For endpoints in this namespace, allow ingress from ingress-controller"
endpointSelector: {}
ingress:
- fromEndpoints:
- matchLabels:
app.kubernetes.io/name: shturval-ingress-controller
io.kubernetes.pod.namespace: ingress
Трафик внутри неймспейса
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-in-namespace
namespace: yournamespacename
spec:
description: "For endpoints in this namespace, allow all in this namespace"
endpointSelector: {}
ingress:
- fromEndpoints:
- {}
egress:
- toEndpoints:
- {}