Настройка контроллера сетевых политик 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
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
Установите 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-манифестах, будут удалены.
-