Настройка контроллера сетевых политик Calico
Calico
- Применять политики к любому объекту: поду, контейнеру, виртуальной машине или интерфейсу.
- Указывать в правилах политики конкретное действие: запретить, разрешить, логировать.
- Указывать в качестве цели или источника: порт, диапазон портов, протоколы, HTTP- и ICMP-атрибуты, IP-адрес или подсеть и другие объекты.
- Регулировать прохождение трафика с помощью настроек DNAT и политик проброса трафика.
Чтобы настроить контроллер сетевых политик Calico:
- Создайте сервис nginx.
- Изолируйте поды с помощью сетевых политик.
- Создайте сетевые политики, разрешающие доступ к сервису.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Создайте инфраструктуру:
ВручнуюTerraform-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes и группу узлов любой подходящей конфигурации. При создании укажите сеть, подсеть и группы безопасности, подготовленные заранее. Также в кластере задействуйте контроллер сетевых политик Calico:
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера Managed Service for Kubernetes k8s-calico.tf
. В файле описаны:-
Сеть.
-
Подсеть.
-
Кластер Managed Service for Kubernetes.
-
Сервисный аккаунт, необходимый для работы кластера Managed Service for Kubernetes и группы узлов.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
-
Укажите в файле конфигурации:
- Идентификатор каталога.
- Версию Kubernetes для кластера Managed Service for Kubernetes и групп узлов.
- CIDR кластера Managed Service for Kubernetes.
- Имя сервисного аккаунта кластера Managed Service for Kubernetes.
-
Выполните команду
terraform initв директории с конфигурационными файлами. Эта команда инициализирует провайдер, указанный в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
.Ограничения по времени
Провайдер Terraform ограничивает время на выполнение операций с кластером и группой узлов Managed Service for Kubernetes:
- создание и изменение кластера — 30 минут;
- создание и изменение группы узлов — 60 минут;
- удаление группы узлов — 20 минут.
Операции, которые длятся дольше указанного времени, прерываются.
Как изменить эти ограничения?
Добавьте к описанию кластера и группы узлов блоки
timeouts(ресурсыyandex_kubernetes_clusterиyandex_kubernetes_node_groupсоответственно).Пример:
resource "yandex_kubernetes_node_group" "<имя_группы_узлов>" { ... timeouts { create = "1h30m" update = "1h30m" delete = "30m" } } -
-
Установите kubectl
и настройте его на работу с созданным кластером. -
Создайте пространство имен
policy-testв кластере Managed Service for Kubernetes.
Создайте сервис nginx
-
Создайте под с веб-сервером nginx в пространстве имен
policy-test. Используйте объект API Kubernetes Deployment :kubectl create deployment --namespace=policy-test nginx --image=nginxРезультат:
deployment.apps/nginx created -
Запустите под с nginx как сервис Kubernetes:
kubectl expose --namespace=policy-test deployment nginx --port=80Результат:
service/nginx exposed -
Убедитесь, что веб-сервер nginx доступен. Для этого создайте под
access:kubectl run --namespace=policy-test access --rm -ti --image busybox /bin/shНа поде
accessоткроется shell-сессия:If you don't see a command prompt, try pressing enter. / # -
Подключитесь к веб-серверу nginx через сессию на поде
access:wget -q nginx -O -Веб-сервер nginx доступен:
<!DOCTYPE html> <html> <head> ... <p><em>Thank you for using nginx.</em></p> </body> </html> -
Выйдите из пода:
/ # exitПод удален:
Session ended, resume using 'kubectl attach access -c access -i -t' command when the pod is running pod "access" deleted
Изолируйте поды с помощью сетевых политик
Изолируйте пространство имен policy-test. После этого контроллер сетевых политик Calico предотвратит подключения к подам в этом пространстве имен:
kubectl create -f - <<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny
namespace: policy-test
spec:
podSelector:
matchLabels: {}
EOF
Сетевые политики созданы:
networkpolicy.networking.k8s.io/deny created
Протестируйте изоляцию
-
Сетевые политики изолировали веб-сервер nginx. Чтобы это проверить, создайте под
access:kubectl run --namespace=policy-test access --rm -ti --image busybox /bin/shНа поде
accessоткроется shell-сессия:If you don't see a command prompt, try pressing enter. / # -
Проверьте, есть ли у пода
accessдоступ к веб-серверу nginx:wget -q --timeout=5 nginx -O -Соединение не установлено:
wget: download timed out / # -
Выйдите из пода:
/ # exitПод удален:
Session ended, resume using 'kubectl attach access -c access -i -t' command when the pod is running pod "access" deleted
Создайте сетевые политики, разрешающие доступ к сервису
Разрешите доступ к веб-серверу nginx с помощью сетевых политик. Сетевые политики разрешат подключаться только поду access.
-
Создайте сетевые политики
access-nginx:kubectl create -f - <<EOF kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx namespace: policy-test spec: podSelector: matchLabels: app: nginx policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: run: access egress: - to: - podSelector: matchLabels: app: nginx EOFПримечание
Сетевые политики разрешат трафик от подов с Kubernetes-меткой
run: accessк подам с Kubernetes-меткойapp: nginx. Метки автоматически добавляются утилитой kubectl и основаны на имени ресурса.Сетевые политики созданы:
networkpolicy.networking.k8s.io/access-nginx created -
Создайте под
access:kubectl run --namespace=policy-test access --rm -ti --image busybox /bin/shНа поде
accessоткроется shell-сессия:If you don't see a command prompt, try pressing enter. / # -
Проверьте, есть ли у пода
accessдоступ к веб-серверу nginx:wget -q --timeout=5 nginx -O -Соединение установлено:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ... -
Выйдите из пода:
/ # exitПод удален:
Session ended, resume using 'kubectl attach access -c access -i -t' command when the pod is running pod "access" deleted
Проверьте, что сетевая изоляция для других подов работает
В созданных сетевых политиках access-nginx разрешено подключаться подам с Kubernetes-меткой run: access.
-
Создайте под без метки
run: access:kubectl run --namespace=policy-test cant-access --rm -ti --image busybox /bin/shНа поде
cant-accessоткроется shell-сессия:If you don't see a command prompt, try pressing enter. / # -
Проверьте, есть ли у пода
cant-accessдоступ к веб-серверу nginx:wget -q --timeout=5 nginx -O -Соединение не установлено:
wget: download timed out / # -
Выйдите из пода:
/ # exitПод удален:
Session ended, resume using 'kubectl attach access -c access -i -t' command when the pod is running pod "cant-access" deleted -
Чтобы удалить данные примера, удалите пространство имен:
kubectl delete ns policy-testРезультат выполнения команды:
namespace "policy-test" deleted
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
- Удалите кластер Managed Service for Kubernetes.
- Если вы зарезервировали для кластера Managed Service for Kubernetes публичный статический IP-адрес, удалите его.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy -
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-