Создание и настройка кластера Managed Service for Kubernetes без доступа в интернет
Вы можете создать и настроить кластер Managed Service for Kubernetes, для которого недоступно подключение к интернету. Для этого используется следующая конфигурация:
- У кластера и группы узлов Managed Service for Kubernetes нет публичного адреса. К такому кластеру можно подключиться только с виртуальной машины Yandex Cloud.
- Кластер и группа узлов размещены в подсетях без доступа в интернет.
- У сервисных аккаунтов нет ролей на работу с ресурсами, имеющими доступ в интернет, например Yandex Network Load Balancer.
- Группы безопасности кластера ограничивают входящий и исходящий трафик.
Чтобы создать кластер Managed Service for Kubernetes без доступа в интернет:
- Подготовьте инфраструктуру для Managed Service for Kubernetes.
- Подготовьте виртуальную машину.
- Проверьте доступность кластера.
- (Опционально) Подключите приватный реестр Docker-образов.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте инфраструктуру для Managed Service for Kubernetes
-
resource-sa
с ролямиk8s.clusters.agent
,logging.writer
иkms.keys.encrypterDecrypter
на каталог, в котором создается кластер Kubernetes. От имени этого аккаунта будут создаваться ресурсы, необходимые кластеру Kubernetes.node-sa
с рольюcontainer-registry.images.puller
. От имени этого аккаунта узлы будут скачивать из реестра необходимые Docker-образы.
Совет
Вы можете использовать один и тот же сервисный аккаунт для управления кластером Kubernetes и его группами узлов.
-
Создайте симметричный ключ шифрования Yandex Key Management Service с параметрами:
- Имя —
my-kms-key
. - Алгоритм шифрования —
AES-256
. - Период ротации, дни — 365 дней.
- Имя —
-
Создайте сеть
my-net
. -
Создайте подсеть
my-subnet
с доменным именемinternal.
. -
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes с параметрами:
- Сервисный аккаунт для ресурсов —
resource-sa
. - Сервисный аккаунт для узлов —
node-sa
. - Ключ шифрования —
my-kms-key
. - Публичный адрес — без адреса.
- Облачная сеть —
my-net
. - Подсеть —
my-subnet
. - Группы безопасности — выберите созданные ранее группы безопасности, которые содержат правила для служебного трафика и для доступа к API Kubernetes.
- CIDR кластера —
172.19.0.0/16
. - CIDR сервисов —
172.20.0.0/16
. - Запись логов — включена.
- Логи Cluster Autoscaler — включены.
- Логи событий — включены.
- Логи API-сервера Kubernetes — включены.
- Сервисный аккаунт для ресурсов —
-
В кластере Managed Service for Kubernetes создайте группу узлов с параметрами:
- Публичный адрес — без адреса.
- Группы безопасности — выберите созданные ранее группы безопасности, которые содержат правила для служебного трафика, для подключения к сервисам из интернета и для подключения к узлам по SSH.
- Расположение — подсеть
my-subnet
.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации k8s-cluster-with-no-internet.tf
. С помощью файла будут созданы ресурсы:-
Сеть.
-
Таблица маршрутизации.
-
Подсети.
-
Кластер Managed Service for Kubernetes.
-
Группа узлов Managed Service for Kubernetes.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Сервисные аккаунты для ресурсов и узлов Kubernetes.
-
Симметричный ключ шифрования Yandex Key Management Service.
Файл подготовлен с помощью библиотек модулей terraform-yc-vpc
и terraform-yc-kubernetes . Подробнее о конфигурации ресурсов, которые создаются с помощью этих модулей, см. на страницах библиотек. -
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Подготовьте виртуальную машину
Так как у кластера Managed Service for Kubernetes нет доступа в интернет, к нему можно подключиться только с ВМ, находящейся в одной сети с кластером. Поэтому, чтобы проверить доступность кластера, подготовьте инфраструктуру:
-
Создайте необходимые ресурсы:
ВручнуюTerraform-
Создайте сервисный аккаунт
vm-sa
с ролямиk8s.cluster-api.cluster-admin
иk8s.admin
. От имени этого аккаунта вы подключитесь к кластеру Managed Service for Kubernetes. -
Создайте группу безопасности
vm-security-group
и укажите в ней правило для входящего трафика:- Диапазон портов —
22
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
- Диапазон портов —
-
Создайте ВМ Linux с параметрами:
- Подсеть —
my-subnet
. - Публичный адрес —
Автоматически
, либо можно зарезервировать статический публичный IP-адрес и привязать его к новой ВМ. - Группы безопасности —
vm-security-group
. - Сервисный аккаунт —
vm-sa
.
- Подсеть —
-
В директорию с файлом
k8s-cluster-with-no-internet.tf
скачайте файл конфигурации virtual-machine-for-k8s.tf .В этом файле описаны:
- сервисный аккаунт для ВМ;
- группа безопасности для ВМ;
- ВМ.
-
Укажите в файле
virtual-machine-for-k8s.tf
:- Идентификатор каталога.
- Идентификатор сети, созданной вместе с кластером Managed Service for Kubernetes.
- Идентификатор подсети, созданной вместе с кластером Managed Service for Kubernetes и располагающейся в зоне доступности
ru-central1-a
. Эта зона указана в настройках ВМ. - Имя пользователя, от лица которого будет выполняться подключение к ВМ по SSH.
- Абсолютный путь до публичной части SSH-ключа для подключения к ВМ.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
-
Подключитесь к ВМ по протоколу SSH:
ssh <имя_пользователя>@<публичный_IP-адрес_ВМ>
Где
<имя_пользователя>
— имя учетной записи пользователя ВМ. -
Установите интерфейс командной строки Yandex Cloud (YC CLI).
-
Создайте профиль для YC CLI.
-
Установите kubectl
и настройте его на работу с созданным кластером.
Проверьте доступность кластера
На ВМ выполните команду:
kubectl cluster-info
Команда вернет информацию о кластере Managed Service for Kubernetes:
Kubernetes control plane is running at https://<адрес_кластера>
CoreDNS is running at https://<адрес_кластера>/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
(Опционально) Подключите приватный реестр Docker-образов
Вы можете подключить приватный реестр Docker-образов
- При помощи Bash-скрипта на узлах кластера постоянно проверяется наличие нужных сертификатов.
- Если их нет, они копируются из секрета
Kubernetes и обновляются. - Перезагружается среда запуска контейнеров containerd.
Чтобы настроить обновление сертификатов с помощью DaemonSet, на ВМ:
-
Разместите файлы сертификатов с расширением
.crt
. -
Создайте файл
certificate-updater-namespace.yaml
c конфигурацией пространства имен. Это пространство будет использовано для работы и изоляции DaemonSet.apiVersion: v1 kind: Namespace metadata: name: certificate-updater labels: name: certificate-updater
-
Создайте файл
certificate-updater-daemonset.yaml
с конфигурацией DaemonSet:Содержимое файла
--- kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: certificate-updater-deny-all namespace: certificate-updater spec: podSelector: matchLabels: k8s-app: certificate-updater policyTypes: - Ingress - Egress ingress: [] egress: [] --- apiVersion: "apps/v1" kind: DaemonSet metadata: name: certificate-updater namespace: certificate-updater labels: k8s-app: certificate-updater version: 1v spec: selector: matchLabels: k8s-app: certificate-updater template: metadata: labels: k8s-app: certificate-updater spec: hostPID: true hostIPC: true containers: - name: certificate-updater image: cr.yandex/yc/mk8s-openssl:stable command: - sh - -c - | while true; do diff -x '.*' -r /mnt/user-cert-path/ /usr/local/share/ca-certificates if [ $? -ne 0 ]; then echo "Removing all old certificates" rm -r /usr/local/share/ca-certificates/* echo "Copying certificates from configmap" cp /mnt/sbin/update-ca-certificates /usr/sbin/ cp /mnt/user-cert-path/* /usr/local/share/ca-certificates echo "Updating cerfificates authorities" update-ca-certificates echo "Restarting containerd" ps -x -o pid= -o comm= | awk '$2 ~ "^(containerd|dockerd)$" { print $1 }' | xargs kill #systemd will get them back less than a minute else echo "Doing Nothing as no certs has not been changed" fi sleep 60 done imagePullPolicy: Never securityContext: privileged: true resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - mountPath: /etc/ name: etc - mountPath: /usr/local/share/ca-certificates name: docker-cert - name: secret mountPath: /mnt/user-cert-path - name: sbin mountPath: /mnt/sbin readOnly: true - name: ca-cert mountPath: /usr/share/ca-certificates volumes: - name: secret secret: secretName: crt - name: sbin hostPath: path: /usr/sbin/ type: Directory - name: ca-cert hostPath: path: /usr/share/ca-certificates type: Directory - name: docker-cert hostPath: path: /usr/local/share/ca-certificates type: DirectoryOrCreate - name: etc hostPath: path: /etc/ type: Directory
-
Создайте пространство имен:
kubectl apply -f certificate-updater-namespace.yaml
-
Создайте секрет с содержимым сертификатов, выпущенных CA:
kubectl create secret generic crt \ --from-file=<путь_к_файлу_с_сертификатом>.crt \ --namespace="certificate-updater"
В команде укажите сертификат с расширением
.crt
. Если надо добавить несколько сертификатов, передайте каждый из них в команде с помощью флага--from-file
.Вы можете проверить конфигурацию секрета с помощью команды ниже и убедиться, что конфигурация содержит информацию о сертификатах:
kubectl get secret crt -o yaml
-
Создайте DaemonSet:
kubectl apply -f certificate-updater-daemonset.yaml
Далее можно отслеживать состояние контроллера DaemonSet. Когда обновятся сертификаты, в кластере перезагрузятся процессы среды запуска контейнеров containerd.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать.
Удалите:
- Сервисные аккаунты.
- Ключ шифрования Key Management Service.
- Группы безопасности.
- Группу узлов Managed Service for Kubernetes.
- Кластер Managed Service for Kubernetes.
- Виртуальную машину.
- Подсеть.
- Сеть.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
Если для ВМ использовался статический публичный IP-адрес, освободите и удалите его.