Настройка групп безопасности
Для групп безопасности действует принцип «весь трафик, который не разрешен, запрещен». Чтобы кластер работал:
-
Создайте правила в его группах безопасности, разрешающие нужный трафик для узлов кластера:
-
Служебный трафик внутри кластера.
Эти правила разрешают внутрикластерную коммуникацию и подключение к кластеру через API Kubernetes.
Совет
Поместите каждый из этих наборов правил в отдельную группу безопасности.
Тогда будет удобно применять эти группы безопасности к кластеру и его группам узлов.
-
-
(Опционально) Если вы планируете использовать L7-балансировщик Yandex Application Load Balancer вместе с кластером, то добавьте правила для балансировщика.
-
Примените группы безопасности с этими правилами к кластеру и группам узлов.
Вы можете задать более детальные правила для групп безопасности, например, разрешающие трафик только в определенных подсетях.
Группы безопасности должны быть корректно настроены для всех подсетей, в которых будет размещен кластер. От этого зависит работоспособность и доступность кластера и запущенных в нем сервисов.
Перед изменением списка групп безопасности или настроек входящих в них правил убедитесь, что это не нарушит работу кластера и его групп узлов.
Внимание
Не удаляйте группы безопасности, привязанные к работающему кластеру или группе узлов. Это может привести к запрету прохождения сетевого трафика и нарушить работу кластера и его узлов.
Создать правила для служебного трафика
Важно
Настройка правил для служебного трафика — обязательное условие для работоспособности регионального кластера.
Разрешить трафик для кластера и групп узлов
Чтобы кластер работал корректно, создайте правила для входящего и исходящего трафика, и примените их к кластеру и группам узлов:
-
Добавьте правила для входящего трафика, которые разрешают:
- Выполнять проверки состояния сетевого балансировщика нагрузки:
- Диапазон портов —
0-65535
. - Протокол —
TCP
. - Источник —
Проверки состояния балансировщика
.
- Диапазон портов —
- Передавать служебный трафик между мастером и узлами:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Источник —
Группа безопасности
. - Группа безопасности —
Текущая
(Self
).
- Диапазон портов —
- Проверять работоспособность узлов с помощью ICMP-запросов из подсетей внутри Yandex Cloud:
- Протокол —
ICMP
. - Источник —
CIDR
. - CIDR блоки — диапазоны адресов подсетей внутри Yandex Cloud, из которых будет осуществляться проверка работоспособности, например:
10.0.0.0/8
.192.168.0.0/16
.172.16.0.0/12
.
- Протокол —
- Выполнять проверки состояния сетевого балансировщика нагрузки:
-
Добавьте правило для исходящего служебного трафика между мастером и узлами:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Назначение —
Группа безопасности
. - Группа безопасности —
Текущая
(Self
).
- Диапазон портов —
Разрешить трафик для групп узлов
Чтобы группы узлов работали корректно, создайте правила для входящего и исходящего трафика, и примените их к группам узлов:
-
Добавьте правило для входящего трафика, которое разрешает передачу трафика между подами и сервисами:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Источник —
CIDR
. - CIDR блоки — CIDR кластера и CIDR сервисов. Например,
10.96.0.0/16
и10.112.0.0/16
.
- Диапазон портов —
-
Добавьте правило для исходящего трафика, которое разрешает узлам в группе узлов подключаться к внешним ресурсам, например, чтобы скачивать образы с Docker Hub или работать с Yandex Object Storage:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Назначение —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
- Диапазон портов —
Разрешить трафик для кластера
Чтобы кластер работал корректно и к нему можно было подключиться, создайте правила для входящего и исходящего трафика, и примените их к кластеру:
-
Добавьте правила для входящего трафика, которые разрешают подключение к мастеру через порты
6443
и443
. Это позволит получить доступ к API Kubernetes и управлять кластером с помощьюkubectl
и других утилит.Создайте два правила для входящего трафика, по одному для каждого порта:
- Диапазон портов —
443
,6443
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки — укажите диапазон адресов подсетей, из которых будете управлять кластером, например:
85.23.23.22/32
— для внешней сети.192.168.0.0/24
— для внутренней сети.
- Диапазон портов —
-
Добавьте правило для исходящего трафика, которое разрешает передачу трафика между мастером и подами
metric-server
:- Диапазон портов —
4443
. - Протокол —
TCP
. - Назначение —
CIDR
. - CIDR блоки — укажите CIDR кластера, например,
10.96.0.0/16
.
- Диапазон портов —
Создать правило для подключения к сервисам из интернета
Чтобы запущенные на узлах сервисы были доступны из интернета и подсетей внутри Yandex Cloud, создайте правило для входящего трафика, и примените его к группе узлов:
- Диапазон портов —
30000-32767
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
Создать правило для подключения к узлам по SSH
Чтобы получить доступ к узлам по протоколу SSH, создайте правило для входящего трафика и примените его к группе узлов:
- Диапазон портов —
22
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки — диапазоны адресов подсетей внутри Yandex Cloud, а также публичные IP-адреса компьютеров в интернете, например:
10.0.0.0/8
.192.168.0.0/16
.172.16.0.0/12
.85.32.32.22/32
.
Применить группы безопасности с правилами
В зависимости от правил, которые содержатся в группах безопасности, эти группы должны быть назначены кластеру или группе узлов:
Группа безопасности | Объект, на который нужно назначить группу |
---|---|
Группа, разрешающая трафик для кластера и групп узлов | Кластер и группа узлов |
Группа, разрешающая трафик для групп узлов | Группа узлов |
Группа, разрешающая трафик для кластера | Кластер |
Группа, разрешающая подключение к сервисам из интернета | Группа узлов |
Группа, разрешающая подключение к узлам по SSH | Группа узлов |
Примеры правил
Пусть планируется создать кластер Kubernetes, в котором:
-
Используется следующая конфигурация:
- Региональный мастер, размещенный в зонах доступности
ru-central1-a
,ru-central1-b
иru-central1-d
. - Группа узлов
worker-nodes-a
, размещенная в зоне доступностиru-central1-a
. - CIDR кластера —
10.96.0.0/16
, CIDR сервисов —10.112.0.0/16
.
- Региональный мастер, размещенный в зонах доступности
-
Применяются следующие политики по обмену трафиком:
-
Проверка работоспособности узлов с помощью ICMP-запросов разрешена из следующих подсетей внутри Yandex Cloud:
10.0.0.0/8
,172.16.0.0/12
,192.168.0.0/16
.
-
Подключение к сервисам из интернета разрешено с любых адресов —
0.0.0.0/0
. -
Подключение к узлам по SSH разрешено только с одного адреса —
85.32.32.22/32
. -
Доступ к API Kubernetes разрешен из одной подсети —
203.0.113.0/24
.
-
Чтобы создать такой кластер:
-
Создайте группы безопасности с необходимыми правилами.
Конфигурационный файл с группами безопасности
resource "yandex_vpc_security_group" "k8s-cluster-nodegroup-traffic" { name = "k8s-cluster-nodegroup-traffic" description = "Правила группы разрешают служебный трафик для кластера и групп узлов. Примените ее к кластеру и группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для проверок состояния сетевого балансировщика нагрузки." from_port = 0 to_port = 65535 protocol = "TCP" predefined_target = "loadbalancer_healthchecks" } ingress { description = "Правило для входящего служебного трафика между мастером и узлами." from_port = 0 to_port = 65535 protocol = "ANY" predefined_target = "self_security_group" } ingress { description = "Правило для проверки работоспособности узлов с помощью ICMP-запросов из подсетей внутри Yandex Cloud." protocol = "ICMP" v4_cidr_blocks = ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"] } egress { description = "Правило для исходящего служебного трафика между мастером и узлами." from_port = 0 to_port = 65535 protocol = "ANY" predefined_target = "self_security_group" } } resource "yandex_vpc_security_group" "k8s-nodegroup-traffic" { name = "k8s-nodegroup-traffic" description = "Правила группы разрешают служебный трафик для групп узлов. Примените ее к группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее передачу трафика между подами и сервисами." from_port = 0 to_port = 65535 protocol = "ANY" v4_cidr_blocks = ["10.96.0.0/16", "10.112.0.0/16"] } egress { description = "Правило для исходящего трафика, разрешающее узлам в группе узлов подключаться к внешним ресурсам." from_port = 0 to_port = 65535 protocol = "ANY" v4_cidr_blocks = ["0.0.0.0/0"] } } resource "yandex_vpc_security_group" "k8s-services-access" { name = "k8s-services-access" description = "Правила группы разрешают подключение к сервисам из интернета. Примените ее к группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее подключение к сервисам." from_port = 30000 to_port = 32767 protocol = "TCP" v4_cidr_blocks = ["0.0.0.0/0"] } } resource "yandex_vpc_security_group" "k8s-ssh-access" { name = "k8s-ssh-access" description = "Правила группы разрешают подключение к узлам по SSH. Примените ее к группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее подключение к узлам по SSH." port = 22 protocol = "TCP" v4_cidr_blocks = ["85.32.32.22/32"] } } resource "yandex_vpc_security_group" "k8s-cluster-traffic" { name = "k8s-cluster-traffic" description = "Правила группы разрешают трафик для кластера. Примените ее к кластеру." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее доступ к API Kubernetes (порт 443)." port = 443 protocol = "TCP" v4_cidr_blocks = ["203.0.113.0/24"] } ingress { description = "Правило для входящего трафика, разрешающее доступ к API Kubernetes (порт 6443)." port = 6443 protocol = "TCP" v4_cidr_blocks = ["203.0.113.0/24"] } egress { description = "Правило для исходящего трафика, разрешающее передачу трафика между мастером и подами metric-server." port = 4443 protocol = "TCP" v4_cidr_blocks = ["10.96.0.0/16"] } }
-
Создайте кластер и группу узлов.
Примените группы безопасности с правилами следующим образом:
resource "yandex_kubernetes_cluster" "k8s-cluster" { name = "k8s-cluster" service_account_id = "<идентификатор_сервисного_аккаунта_для_кластера>" node_service_account_id = "<идентификатор_сервисного_аккаунта_для_групп_узлов>" cluster_ipv4_range = "10.96.0.0/16" service_ipv4_range = "10.112.0.0/16" network_id = "<идентификатор_облачной_сети>" master { master_location { zone = "ru-central1-a" subnet_id = "<идентификатор_облачной_подсети_в_зоне>" } master_location { zone = "ru-central1-b" subnet_id = "<идентификатор_облачной_подсети_в_зоне>" } master_location { zone = "ru-central1-d" subnet_id = "<идентификатор_облачной_подсети_в_зоне>" } security_group_ids = [ yandex_vpc_security_group.k8s-cluster-nodegroup-traffic.id, yandex_vpc_security_group.k8s-cluster-traffic.id ] public_ip = true } } resource "yandex_kubernetes_node_group" "worker-nodes-a" { cluster_id = yandex_kubernetes_cluster.k8s-cluster.id name = "worker-nodes-a" allocation_policy { location { zone = "ru-central1-a" } } scale_policy { fixed_scale { size = 1 } } instance_template { network_interface { nat = true subnet_ids = [<идентификатор_облачной_подсети>] security_group_ids = [ yandex_vpc_security_group.k8s-cluster-nodegroup-traffic.id, yandex_vpc_security_group.k8s-nodegroup-traffic.id, yandex_vpc_security_group.k8s-services-access.id, yandex_vpc_security_group.k8s-ssh-access.id ] } } }