Настройка групп безопасности
Для групп безопасности действует принцип «весь трафик, который не разрешен, запрещен». Чтобы кластер работал, необходимо создать правила в его группах безопасности, разрешающие:
- Служебный трафик внутри кластера.
- Подключение к сервисам из интернета.
- Подключение к узлам по SSH.
- Доступ к API Kubernetes.
Примечание
Рекомендуется создать отдельные группы безопасности для каждого из перечисленных наборов правил.
Вы можете задать более детальные правила для групп безопасности, например, разрешающие трафик только в определенных подсетях.
Группы безопасности должны быть корректно настроены для всех подсетей, в которых будет размещен кластер. От этого зависит работоспособность и доступность кластера и запущенных в нем сервисов.
Перед изменением списка групп безопасности или настроек входящих в них правил убедитесь, что это не нарушит работу кластера и его групп узлов.
Внимание
Не удаляйте группы безопасности, привязанные к работающему кластеру или группе узлов: это может привести к нарушению их работы и потере данных.
Создать правила для служебного трафика
Важно
Настройка правил для служебного трафика — обязательное условие для работоспособности регионального кластера.
Чтобы кластер работал корректно, создайте правила для входящего и исходящего трафика, и примените их к кластеру и группам узлов:
- Добавьте правила для входящего трафика.
- Для сетевого балансировщика нагрузки:
- Диапазон портов —
0-65535
. - Протокол —
TCP
. - Источник —
Проверки состояния балансировщика
.
- Диапазон портов —
- Для передачи служебного трафика между мастером и узлами:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Источник —
Группа безопасности
. - Группа безопасности —
Текущая
(Self
).
- Диапазон портов —
- Для передачи трафика между подами и сервисами:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Источник —
CIDR
. - CIDR блоки — укажите диапазоны адресов подсетей, созданных вместе с кластером. Например,
10.96.0.0/16
или10.112.0.0/16
.
- Диапазон портов —
- Для проверки работоспособности узлов с помощью ICMP-запросов из подсетей внутри Yandex Cloud:
- Протокол —
ICMPv6
. - Источник —
CIDR
. - CIDR блоки — диапазоны адресов подсетей внутри Yandex Cloud, из которых будет осуществляться диагностика кластера, например:
10.0.0.0/8
.192.168.0.0/16
.172.16.0.0/12
.
- Протокол —
- Для сетевого балансировщика нагрузки:
- Добавьте правило для исходящего трафика, разрешающее хостам кластера подключаться к внешним ресурсам, например, для скачивания образов с Docker Hub или работы с Yandex Object Storage:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Назначение —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
- Диапазон портов —
О том, как настроить группы безопасности для L7-балансировщика, см. в разделе Настройка групп безопасности для инструментов Application Load Balancer для Managed Service for Kubernetes.
Создать правило для подключения к сервисам из интернета
Чтобы запущенные на узлах сервисы были доступны из интернета и подсетей внутри 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
.
Создать правила для доступа к API Kubernetes
Для доступа к API Kubernetes и управления кластером с помощью kubectl
и других утилит нужны правила, разрешающие подключение к мастеру через порты 6443
и 443
. Создайте два правила для входящего трафика, по одному для каждого порта, и примените их к кластеру:
- Диапазон портов —
443
,6443
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки — укажите диапазон адресов подсетей, из которых будете управлять кластером, например:
85.23.23.22/32
— для внешней сети.192.168.0.0/24
— для внутренней сети.
Примеры
Например, нужно создать правила для имеющегося кластера Kubernetes:
- С зональным мастером, размещенным в зоне доступности
ru-central1-a
. - С группой узлов
worker-nodes-с
. - С диапазоном адресов для подов и сервисов
10.96.0.0/16
и10.112.0.0/16
. - С доступом к сервисам:
- С диапазона адресов балансировщика нагрузки
198.18.235.0/24
и198.18.248.0/24
. - Из внутренних подсетей
172.16.0.0/12
,10.0.0.0/8
и192.168.0.0/16
для протокола ICMP. - Из интернета с любых адресов (
0.0.0.0/0
) на диапазон портов NodePort (30000-32767
).
- С диапазона адресов балансировщика нагрузки
- С доступом к узлам из интернета с адреса
85.32.32.22/32
на порт22
. - С доступом к API Kubernetes из внешней подсети с диапазона адресов
203.0.113.0/24
через порты443
и6443
.
Будут созданы четыре группы безопасности:
k8s-main-sg
— правила для служебного трафика.k8s-public-services
— правила для подключения к узлам из интернета.k8s-nodes-ssh-access
— правила для подключения к узлам по протоколу SSH.k8s-master-whitelist
— правила для доступа к API кластера.
Конфигурационный файл для такого кластера:
terraform {
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
}
}
provider "yandex" {
token = "<OAuth_или_статический_ключ_сервисного_аккаунта>"
cloud_id = "<идентификатор_облака>"
folder_id = "<идентификатор_каталога>"
zone = "<зона_доступности>"
}
resource "yandex_vpc_security_group" "k8s-main-sg" {
name = "k8s-main-sg"
description = "Правила группы обеспечивают базовую работоспособность кластера. Примените ее к кластеру и группам узлов."
network_id = "<идентификатор_облачной_сети>"
ingress {
protocol = "TCP"
description = "Правило разрешает проверки доступности с диапазона адресов балансировщика нагрузки. Нужно для работы отказоустойчивого кластера и сервисов балансировщика."
predefined_target = "loadbalancer_healthchecks"
from_port = 0
to_port = 65535
}
ingress {
protocol = "ANY"
description = "Правило разрешает взаимодействие мастер-узел и узел-узел внутри группы безопасности."
predefined_target = "self_security_group"
from_port = 0
to_port = 65535
}
ingress {
protocol = "ANY"
description = "Правило разрешает взаимодействие под-под и сервис-сервис. Укажите подсети вашего кластера и сервисов."
v4_cidr_blocks = ["10.96.0.0/16", "10.112.0.0/16"]
from_port = 0
to_port = 65535
}
ingress {
protocol = "ICMP"
description = "Правило разрешает отладочные ICMP-пакеты из внутренних подсетей."
v4_cidr_blocks = ["172.16.0.0/12", "10.0.0.0/8", "192.168.0.0/16"]
}
egress {
protocol = "ANY"
description = "Правило разрешает весь исходящий трафик. Узлы могут связаться с Yandex Container Registry, Object Storage, Docker Hub и т. д."
v4_cidr_blocks = ["0.0.0.0/0"]
from_port = 0
to_port = 65535
}
}
resource "yandex_vpc_security_group" "k8s-public-services" {
name = "k8s-public-services"
description = "Правила группы разрешают подключение к сервисам из интернета. Примените правила только для групп узлов."
network_id = "<идентификатор_облачной_сети>"
ingress {
protocol = "TCP"
description = "Правило разрешает входящий трафик из интернета на диапазон портов NodePort. Добавьте или измените порты на нужные вам."
v4_cidr_blocks = ["0.0.0.0/0"]
from_port = 30000
to_port = 32767
}
}
resource "yandex_vpc_security_group" "k8s-nodes-ssh-access" {
name = "k8s-nodes-ssh-access"
description = "Правила группы разрешают подключение к узлам кластера по SSH. Примените правила только для групп узлов."
network_id = "<идентификатор_облачной_сети>"
ingress {
protocol = "TCP"
description = "Правило разрешает подключение к узлам по SSH с указанных IP-адресов."
v4_cidr_blocks = ["85.32.32.22/32"]
port = 22
}
}
resource "yandex_vpc_security_group" "k8s-master-whitelist" {
name = "k8s-master-whitelist"
description = "Правила группы разрешают доступ к API Kubernetes из интернета. Примените правила только к кластеру."
network_id = "<идентификатор_облачной_сети>"
ingress {
protocol = "TCP"
description = "Правило разрешает подключение к API Kubernetes через порт 6443 из указанной сети."
v4_cidr_blocks = ["203.0.113.0/24"]
port = 6443
}
ingress {
protocol = "TCP"
description = "Правило разрешает подключение к API Kubernetes через порт 443 из указанной сети."
v4_cidr_blocks = ["203.0.113.0/24"]
port = 443
}
}
resource "yandex_kubernetes_cluster" "k8s-cluster" {
name = "k8s-cluster"
cluster_ipv4_range = "10.96.0.0/16"
service_ipv4_range = "10.112.0.0/16"
...
master {
version = "1.20"
master_location {
zone = "ru-central1-a"
subnet_id = <идентификатор_облачной_подсети>
}
security_group_ids = [
yandex_vpc_security_group.k8s-main-sg.id,
yandex_vpc_security_group.k8s-master-whitelist.id
]
...
}
...
}
resource "yandex_kubernetes_node_group" "worker-nodes-c" {
cluster_id = yandex_kubernetes_cluster.k8s-cluster.id
name = "worker-nodes-c"
version = "1.20"
...
instance_template {
platform_id = "standard-v3"
network_interface {
nat = true
subnet_ids = [<идентификатор_облачной_подсети>]
security_group_ids = [
yandex_vpc_security_group.k8s-main-sg.id,
yandex_vpc_security_group.k8s-nodes-ssh-access.id,
yandex_vpc_security_group.k8s-public-services.id
]
...
}
...
}
}