Настройка групп безопасности
Для групп безопасности действует принцип «весь трафик, который не разрешен, запрещен». Чтобы кластер работал, необходимо создать правила в его группах безопасности, разрешающие:
- Служебный трафик внутри кластера.
- Подключение к сервисам из интернета.
- Подключение к узлам по SSH.
- Доступ к API Kubernetes.
Вы можете задать более детальные правила для групп безопасности, например, разрешающие трафик только в определенных подсетях.
Группы безопасности должны быть корректно настроены для всех подсетей, в которых будет размещен кластер. От этого зависит работоспособность и доступность кластера и запущенных в нем сервисов.
Перед изменением списка групп безопасности или настроек входящих в них правил убедитесь, что это не нарушит работу кластера и его групп узлов.
Внимание
Не удаляйте группы безопасности, привязанные к работающему кластеру или группе узлов: это может привести к нарушению их работы и потере данных.
Создать правила для служебного трафика
Важно
Настройка правил для служебного трафика — обязательное условие для работоспособности регионального кластера.
- Добавьте правила для входящего трафика.
- Для сетевого балансировщика нагрузки:
- Диапазон портов —
0-65535
. - Протокол —
TCP
. - Тип источника —
CIDR
. - Назначение —
198.18.235.0/24
и198.18.248.0/24
.
- Диапазон портов —
- Для передачи служебного трафика между мастером и узлами:
- Диапазон портов —
0-65535
:- Протокол — любой (
Any
). - Тип источника —
Группа безопасности
. - Группа безопасности — текущая (
Self
).
- Протокол — любой (
- Диапазон портов —
- Для передачи трафика между подами и сервисами:
- Диапазон портов —
0-65535
. - Протокол — любой (
Any
). - Тип источника —
CIDR
. - Назначение — укажите диапазоны адресов подсетей, созданных вместе с кластером, например:
10.96.0.0/16
.10.112.0.0/16
.
- Диапазон портов —
- Для проверки работоспособности узлов с помощью ICMP-запросов из подсетей внутри Yandex Cloud:
- Протокол —
ICMP
. - Тип источника —
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
. - Назначение —
0.0.0.0/0
.
- Диапазон портов —
Создать правило для подключения к сервисам из интернета
Чтобы запущенные на узлах сервисы были доступны из интернета и подсетей внутри Yandex Cloud, создайте правило для входящего трафика:
- Диапазон портов —
30000-32767
. - Протокол —
TCP
. - Тип источника —
CIDR
. - Назначение —
0.0.0.0/0
.
Создать правило для подключения к узлам по SSH
Для подключения к узлам по протоколу SSH создайте правило для входящего трафика:
- Порт —
22
. - Протокол —
TCP
. - Тип источника —
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
. - Назначение — укажите диапазон адресов подсетей, из которых будете управлять кластером, например:
85.23.23.22/32
— для внешней сети.192.168.0.0/24
— для внутренней сети.
Примеры
Например, нужно создать правила для имеющегося кластера Kubernetes:
- с зональным мастером, размещенным в зоне доступности
ru-central1-a
; - с группой узлов
worker-nodes-с
; - с доступом к сервисам:
- с диапазона адресов балансировщика нагрузки
198.18.235.0/24
и198.18.248.0/24
; - из внутренней подсети
10.129.0.0/24
для передачи трафика между подами и сервисами; - из внутренней подсети
172.16.0.0/12
для протокола 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 = "Правило разрешает проверки доступности с диапазона адресов балансировщика нагрузки. Нужно для работы отказоустойчивого кластера и сервисов балансировщика."
v4_cidr_blocks = ["198.18.235.0/24", "198.18.248.0/24"]
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.129.0.0/24"]
from_port = 0
to_port = 65535
}
ingress {
protocol = "ICMP"
description = "Правило разрешает отладочные ICMP-пакеты из внутренних подсетей."
v4_cidr_blocks = ["172.16.0.0/12"]
}
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"
...
master {
version = "1.20"
zonal {
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-с" {
cluster_id = yandex_kubernetes_cluster.k8s-cluster.id
name = "worker-nodes-с"
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
]
...
}
...
}
}