
Привет, Хабр! Я Данил Трещев, работаю в T-Банке в команде Spirit Compute, которая отвечает за runtime-инфраструктуру. Сегодня я хочу рассказать, как работать с Cluster API Provider Yandex (CAPY). Мы разработали собственное решение, которое позволяет разворачивать k8s-кластеры в инфраструктуре Yandex Cloud.
Разберем, как развернуть Management Cluster и Workload Cluster с помощью инструментов управления кластерами. Материал подходит для обучения и тестирования. Итоговое окружение не будет готово к продакшену — для этого понадобятся дополнительные настройки безопасности и отказоустойчивости.
Добро пожаловать под кат все, кому интересно познакомиться с темой!
Основные понятия
Чтобы быть в одном контексте, введем основные понятия.
Management Cluster (управляющий кластер) — это кластер Kubernetes, который управляет жизненным циклом других кластеров Kubernetes: отвечает за их создание, обновление, масштабирование и удаление.
В Management Cluster развернуты:
Cluster API (CAPI) — инструмент для автоматизированного управления кластерами Kubernetes в облаке и on-premise. В данной статье не будет рассказано о принципах работы CAPI, более подробно вы можете прочитать это в документации.
Cluster-api-provider-yandex (CAPY) — провайдер для развертывания кластера Kubernetes в облачной инфраструктуре Yandex Cloud.
Workload Cluster (рабочий кластер) — это кластер Kubernetes, в котором развернуты приложения (нагрузка, workloads). За весь жизненный цикл workload cluster отвечают CAPI-/CAPY-контроллеры.

Зачем мы разработали свое решение
Мы используем подход к развертыванию кластеров с помощью CAPI. И мы не нашли open-source-решения для Yandex Cloud, которое позволяло бы управлять кластерами как в on-premise инфраструктуре. Мы стремимся избежать vendor lock, поэтому изначально хотели опубликовать решение в open-source, чтобы сформировать альтернативу существующим решениям.
Мы рассматриваем CAPI как стратегическое направление и намерены развивать его, поскольку нам нужен infrastructure provider как часть собственной платформы, а не интеграция с чужой экосистемой.
Иногда мы временно идем на компромисс и используем решения вроде deckhouse, чтобы сэкономить время, когда результат нужен «еще вчера». Но вектор развития остается прежним — максимальная независимость и контроль над архитектурой.

Подготовка к работе
Нам понадобятся инструменты:
Go версии 1.22.0 и выше;
Kubectl версии 1.11.3 и выше;
Clusterctl версии 1.5.0 и выше;
YC актуальной версии.
Команды, которые будут выполнены с локальной машины:
$ COMMAND
Настройка YC:
$ curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash $ yc init yc init Welcome! This command will take you through the configuration process. Please go to https://oauth.yandex.ru/authorize?response_type= in order to obtain OAuth token. Please enter OAuth token: TOKEN You have one cloud available: 'cloud-daniltreshchev' (id = b1gbhh2a1pmra4btp1um). It is going to be used by default. Please choose folder to use: [1] default (id = b1gn632om9rumce9tabc) [2] Create a new folder Please enter your numeric choice: 1 Your current folder has been set to 'default' (id = b1gn632om9rumce9tabc). Do you want to configure a default Compute zone? [Y/n] Y Which zone do you want to use as a profile default? [1] ru-central1-a [2] ru-central1-b [3] ru-central1-d [4] Don't set default zone Please enter your numeric choice: 4
Готовим инфраструктуру.
1. Настраиваем сервисный аккаунт Yandex Cloud. Создаем сервисный аккаунт, от имени которого будут создаваться ресурсы кластеры.
$ yc iam service-account create --name capy-service-account --description "service account for CAPY"
Назначаем сервисному аккаунту роли compute.editor и alb.editor на каталог.
$ yc iam service-account list +----------------------+----------------------+--------+---------------------+-----------------------+ | ID | NAME | LABELS | CREATED AT | LAST AUTHENTICATED AT | +----------------------+----------------------+--------+---------------------+-----------------------+ | aje6gad4ev79dfms8i6h | capy-service-account | | 2025-02-18 20:27:17 | | +----------------------+----------------------+--------+---------------------+-----------------------+ $ yc resource-manager folder add-access-binding default \ --role compute.editor \ --subject serviceAccount:aje6gad4ev79dfms8i6h $ yc resource-manager folder add-access-binding default \ --role alb.editor \ --subject serviceAccount:aje6gad4ev79dfms8i6h
Получаем авторизованный ключ для сервисного аккаунта в формате JSON.
$ yc iam key create --service-account-name capy-service-account -o capy-sa-key.json
2. Если в нашем каталоге еще нет облачной сети Virtual Private Cloud, создаем ее и подсеть. В статье используем сеть default, которая создается автоматически при создании облака.
3. Инфраструктуре создаваемого кластера в Virtual Private Cloud назначается группа безопасности по умолчанию. Добавим в эту группу правила для входящего трафика:
Протокол | Диапазон портов | Тип источника | Источник | Описание |
TCP | 0-65535 | Группа безопасности | Balancer | Проверки состояния L7-балансировщиком |
Any | 8443 | CIDR | 0.0.0.0/0 | Доступ к Kubernetes API |
$ yc vpc security-group list +----------------------+---------------------------------+--------------------------------+----------------------+ | ID | NAME | DESCRIPTION | NETWORK-ID | +----------------------+---------------------------------+--------------------------------+----------------------+ | enpjob28k16saao6ooum | default-sg-enpe888420gefk9d6r47 | Default security group for | enpe888420gefk9d6r47 | | | | network | | +----------------------+---------------------------------+--------------------------------+----------------------+ $ yc vpc security-group update-rules --id enpjob28k16saao6ooum --add-rule description="Доступ к Kubernetes API",direction=ingress,port=8443,protocol=any,v4-cidrs=0.0.0.0/0 \ --add-rule description="Проверки состояния L7-балансировщиком",direction=ingress,from-port=0,to-port=65535,protocol=tcp,predefined=loadbalancer_healthchecks id: enppv4bf655np8p7gjm4 folder_id: b1gsflehga67etlh2ibf created_at: "2025-02-23T02:01:09Z" name: default-sg-enps0m3n749aelfdh5sc description: Default security group for network network_id: enps0m3n749aelfdh5sc status: ACTIVE rules: - id: enpsv7m2tsd5alnhcl77 direction: INGRESS protocol_name: ANY protocol_number: "-1" cidr_blocks: v4_cidr_blocks: - 0.0.0.0/0 - id: enpc3fob9g4i4dcu6op1 direction: EGRESS protocol_name: ANY protocol_number: "-1" cidr_blocks: v4_cidr_blocks: - 0.0.0.0/0 - id: enp54dgl0k880j8gkdf6 description: Доступ к Kubernetes API direction: INGRESS ports: from_port: "8443" to_port: "8443" protocol_name: ANY protocol_number: "-1" cidr_blocks: v4_cidr_blocks: - 0.0.0.0/0 - id: enpnqmfppbfn6u7oqbsg description: Проверки состояния L7-балансировщиком direction: INGRESS ports: to_port: "65535" protocol_name: TCP protocol_number: "6" predefined_target: loadbalancer_healthchecks default_for_network: true
4. Создаваемый workload-кластер будет доступен в облачной сети по внутреннему IP-адресу. Чтобы обеспечить удаленный доступ в кластер, создадим вспомогательный jumphost в той же сети, в которой будет развернут кластер, и с той же группой безопасности. Установим на jumphost kubectl.
$ yc compute instance create \ --name jumphost \ --zone ru-central1-b \ --network-interface subnet-name=default-ru-central1-b,nat-ip-version=ipv4 \ --create-boot-disk image-folder-id=standard-images,image-family=ubuntu-2004-lts \ --ssh-key ~/.ssh/id_rsa.pub $ yc compute instance list +----------------------+----------------+---------------+---------+--------------+------------- | ID | NAME | ZONE ID | STATUS | EXTERNAL IP | INTERNAL IP +----------------------+----------------+---------------+---------+--------------+------------- | epd2et0u39bn48g30qtf | jumphost | ru-central1-b | RUNNING | 84.252.139.3 | 10.129.0.21 +----------------------+----------------+---------------+---------+--------------+------------- $ ssh yc-user@84.252.139.3
Примечание:
SSH User всегда будет yc-user, вне зависимости от username в облаке.
Команды, которые будут выполнены с вспомогательного jumphost`а, будут выглядеть так:
$ (jumohost) COMMAND
5. Создадим управляющий кластер и группу узлов. Из этого кластера будет разворачиваться новый кластер с помощью Cluster API и управление кластерной инфраструктурой.
Пример создания управляющего кластера:
$ yc iam service-account create k8s-cluster-management-sa done (1s) id: ajegobpbgfiq42c3cl6m folder_id: b1gn632om9rumce9tabc created_at: "2025-02-18T21:11:37.936353688Z" name: k8s-cluster-management-sa $ yc resource-manager folder add-access-binding default \ --role editor \ --subject serviceAccount:ajegobpbgfiq42c3cl6m $ yc resource-manager folder add-access-binding default \ --role container-registry.images.puller \ --subject serviceAccount:ajegobpbgfiq42c3cl6m $ yc resource-manager folder add-access-binding default \ --role vpc.publicAdmin \ --subject serviceAccount:ajegobpbgfiq42c3cl6m $ yc managed-kubernetes cluster create \ --name capy-management-cluster \ --network-name default \ --zone ru-central1-b \ --subnet-name default-ru-central1-b \ --public-ip \ --release-channel regular \ --version 1.31 \ --service-account-name k8s-cluster-management-sa \ --node-service-account-name k8s-cluster-management-sa $ yc managed-kubernetes node-group create \ --cluster-name capy-management-cluster \ --fixed-size 1
6. Настраиваем для kubectl доступ к управляющему кластеру Kubernetes.
$ yc managed-kubernetes cluster list +----------------------+-------------------------+---------------------+---------+---------+------------------------+---------------------+ | ID | NAME | CREATED AT | HEALTH | STATUS | EXTERNAL ENDPOINT | INTERNAL ENDPOINT | +----------------------+-------------------------+---------------------+---------+---------+------------------------+---------------------+ | catrpi1s5kq9pib1ltii | capy-management-cluster | 2025-02-14 03:01:24 | HEALTHY | RUNNING | https://158.160.167.10 | https://10.130.0.32 | +----------------------+-------------------------+---------------------+---------+---------+------------------------+---------------------+ $ yc managed-kubernetes cluster get-credentials --id catrpi1s5kq9pib1ltii --external Context 'yc-capy-management-cluster' was added as default to kubeconfig '/Users/username/.kube/config'. Check connection to cluster using 'kubectl cluster-info --kubeconfig /Users/username/.kube/config'. Note, that authentication depends on 'yc' and its config profile 'default'. To access clusters using the Kubernetes API, please use Kubernetes Service Account. $ kubectl cluster-info Kubernetes control plane is running at https://51.250.107.4 CoreDNS is running at https://51.250.107.4/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. $ kubectl get nodes NAME STATUS ROLES AGE VERSION cl13s99dfd2q0u1jkrg0-yrap Ready <none> 16m v1.31.2
Установка CAPI-/CAPY-контроллеров в управляющий кластер
Установка CAPI- и CAPY-контроллеров в управляющий кластер необходима для того, чтобы он мог управлять жизненным циклом Kubernetes-кластеров в Yandex Cloud.
Установим CAPI- и CAPY-контроллеры и проверим их работу. Клонируем репозиторий cluster-api-provider-yandex и переходим в директорию с проектом:
$ git clone https://github.com/yandex-cloud/cluster-api-provider-yandex.git $ cd cluster-api-provider-yandex
Устанавливаем основные CAPI-компоненты:
$ clusterctl init Fetching providers Installing cert-manager version="v1.16.2" Waiting for cert-manager to be available... Installing provider="cluster-api" version="v1.9.5" targetNamespace="capi-system" Installing provider="bootstrap-kubeadm" version="v1.9.5" targetNamespace="capi-kubeadm-bootstrap-system" Installing provider="control-plane-kubeadm" version="v1.9.5" targetNamespace="capi-kubeadm-control-plane-system" Your management cluster has been initialized successfully!
Создадим в управляющем кластере CustomResourceDefinitions для создаваемого кластера: это необходимо, чтобы Kubernetes понимал, как работать с новыми типами ресурсов, которые приносят CAPY/CAPI:
$ make install
Создадим пространство имен для провайдера Yandex Cloud, это нужно для размещения контроллеров CAPY:
$ kubectl create namespace capy-system
Создадим секрет с авторизованным ключом сервисного аккаунта Yandex Cloud, чтобы контроллеры CAPY могли аутентифицироваться в Yandex Cloud и управлять ресурсами:
$ kubectl create secret generic yc-sa-key \ --from-file=key=<путь_к_файлу_с_авторизованным_ключом> \ --namespace capy-system
Установим CAPY:
$ make deploy
Проверим установленные компоненты:
$ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE capi-kubeadm-bootstrap-system capi-kubeadm-bootstrap-controller-manager-67dc888b6d-9tqv5 1/1 Running 0 15s capi-kubeadm-control-plane-system capi-kubeadm-control-plane-controller-manager-c497bb7df-zqfwl 1/1 Running 0 13s capi-system capi-controller-manager-66986b964b-ng7cm 1/1 Running 0 18s cert-manager cert-manager-74b56b6655-tttgm 1/1 Running 0 42s cert-manager cert-manager-cainjector-55d94dc4cc-c5szh 1/1 Running 0 43s cert-manager cert-manager-webhook-564f647c66-r5qbf 1/1 Running 0 42s kube-system coredns-6c58946d99-hbjwf 1/1 Running 0 5m14s kube-system ip-masq-agent-5b6tf 1/1 Running 0 3m2s kube-system kube-dns-autoscaler-8574ff8cd7-8dmfk 1/1 Running 0 5m10s kube-system kube-proxy-8m7ct 1/1 Running 0 3m2s kube-system metrics-server-7f749774cd-wpm7n 2/2 Running 0 2m53s kube-system npd-v0.8.0-pzhcq 1/1 Running 0 3m2s kube-system yc-disk-csi-node-v2-r5gwm 6/6 Running 0 3m2s
Создание workload-кластера
Когда управляющий кластер настроен и все необходимые контроллеры установлены, мы можем приступить к созданию workload-кластера, то есть кластера, в котором будут запускаться реальные приложения. Это основной сценарий использования Cluster API: мы описываем желаемую конфигурацию нового кластера, а управляющий кластер автоматически создает всю нужную инфраструктуру в Yandex Cloud и разворачивает Kubernetes.
Выберем зону доступности, в которой хотим развернуть кластер. У нас выбрана зона доступности ru-central1-b, но можно выбрать любую.
Создадим NAT для доступа из workload-кластера в интернет:
$ yc vpc gateway create \ --name gateway id: enpkq1s3bfif04ur9fea folder_id: b1gsflehga67etlh2ibf created_at: "2025-02-23T02:44:51Z" name: gateway shared_egress_gateway: {} $ yc vpc route-table create \ --name=test-route-table \ --network-name=default \ --route destination=0.0.0.0/0,gateway-id=enpkq1r8j59f8liic1c7
Получим идентификаторы ресурсов Yandex Cloud для развертывания кластера.
Для упрощения демонстрации CAPY используем образ fd8a3kknu25826s8hbq3. Он создан исключительно в ознакомительных целях, применять его в промышленной эксплуатации не рекомендуется.
Можно собрать свой по инструкции.
export YANDEX_CONTROL_PLANE_MACHINE_IMAGE_ID=fd8a3kknu25826s8hbq3
$ yc resource-manager folder list +----------------------+---------+--------+--------+ | ID | NAME | LABELS | STATUS | +----------------------+---------+--------+--------+ | b1gn632om9rumce9tabc | default | | ACTIVE | +----------------------+---------+--------+--------+ $ export YANDEX_FOLDER_ID=b1gn632om9rumce9tabc
Если используем каталог, отличный от default, нужно выбрать соответствующий ID.
$ yc vpc network list +----------------------+---------+ | ID | NAME | +----------------------+---------+ | enpe888420gefk9d6r47 | default | +----------------------+---------+ $ export YANDEX_NETWORK_ID=enpe888420gefk9d6r47
Если используем сеть, отличную от default, нужно выбрать соответствующий ID.
$ yc vpc subnet list +----------------------+-----------------------------------------------------------+----------------------+----------------------+---------------+-----------------+ | ID | NAME | NETWORK ID | ROUTE TABLE ID | ZONE | RANGE | +----------------------+-----------------------------------------------------------+----------------------+----------------------+---------------+-----------------+ | e2lqmecfk68jek7ibbtd | default-ru-central1-b | enpe888420gefk9d6r47 | | ru-central1-b | [10.129.0.0/24] | | e9b7dr33rs111b14miu5 | default-ru-central1-a | enpe888420gefk9d6r47 | | ru-central1-a | [10.128.0.0/24] | | e9bjngd1uqlra97c5liv | k8s-cluster-catrpi1s5kq9pib1ltii-service-cidr-reservation | enpe888420gefk9d6r47 | | ru-central1-a | [10.96.0.0/16] | | e9bmc08qhj61su95e6pk | k8s-cluster-catrpi1s5kq9pib1ltii-pod-cidr-reservation | enpe888420gefk9d6r47 | | ru-central1-a | [10.112.0.0/16] | | fl8f5nrktjd0tqdkbe9k | default-ru-central1-d | enpe888420gefk9d6r47 | | ru-central1-d | [10.130.0.0/24] | +----------------------+-----------------------------------------------------------+----------------------+----------------------+---------------+-----------------+ $ export YANDEX_SUBNET_ID=e2lqmecfk68jek7ibbtd
Если используем подсеть, отличную от ru-central1-b, нужно выбрать соответствующий ID. Сформируем манифесты кластера:
clusterctl generate cluster <имя_создаваемого_кластера> \ --from templates/cluster-template.yaml > /tmp/capy-cluster.yaml
Наш кластер называется capy-workload-cluster. По умолчанию для доступа в кластер будет развернут L7-балансировщик Application Load Balancer c динамическим внутренним IP-адресом.
По сгенерированному манифесту будут развернуты три узла с Control Plane. Если хотим сразу развернуть узлы для рабочей нагрузки, выполним команду:
clusterctl generate cluster <имя_создаваемого_кластера> \ --worker-machine-count <количество_узлов_для_рабочей_нагрузки> \ --from templates/cluster-template.yaml > /tmp/capy-cluster.yaml
Развернем кластер:
$ kubectl apply -f /tmp/capy-cluster.yaml
За процессом развертывания кластера можно следить в консоли управления Yandex Cloud или в логах пода capy-controller-manager:
$ kubectl logs <имя_пода_с_capy-controller-manager> \ --namespace capy-system \ --follow
Подключитесь к кластеру
Нам нужно убедиться, что кластер успешно запущен, работает корректно и готов к размещению нагрузок. Для подключения мы используем kubeconfig с правами cluster-admin, автоматически созданный управляющим кластером (CAPI).
Подключение к кластеру необходимо для установки дополнительных компонентов, таких как Cloud Controller Manager (CCM) и Container Network Interface (CNI), которые обеспечивают интеграцию кластера с облачной инфраструктурой и сетевое взаимодействие между подами.
Реквизиты для подключения к новому кластеру будут созданы в управляющем кластере в секрете <имя_создаваемого_кластера>-kubeconfig.
Получаем данные из секрета:
$ kubectl get secret <имя_создаваемого_кластера>-kubeconfig \ --output yaml | yq -r '.data.value' | base64 \ --decode > capy-cluster-config
Передаем на jumphost, находящуюся в той же сети, в которой расположен новый кластер, файл с конфигурацией для kubectl:
$ scp <путь_к_файлу_capy-cluster-config_на_локальном_компьютере> \ <имя_пользователя>@<публичный_IP-адрес_jumphost>:/home/<имя_пользователя>/.kube/config
Подключимся к ранее созданной jumphost по SSH, а потом к новому кластеру:
$ (jumphost) kubectl cluster-info Kubernetes control plane is running at https://10.129.0.100:8443 CoreDNS is running at https://10.129.0.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Установка CNI в созданный кластер
CNI нужен для обеспечения сетевого взаимодействия между подами. Установка Cilium:
$ (jumphost) wget https://github.com/cilium/cilium-cli/releases/download/v0.16.24/cilium-linux-amd64.tar.gz $ (jumphost) tar xf cilium-linux-amd64.tar.gz $ (jumphost) ./cilium install
Проверим связь управляющего кластера с созданным. Убедимся, что все поды с необходимыми системными компонентами развернуты в кластере:
$ (jumphost) kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system cilium-2xbm8 1/1 Running 0 8m9s kube-system cilium-envoy-6wzgh 1/1 Running 0 8m9s kube-system cilium-operator-7658c5585d-4skfr 1/1 Running 0 8m8s kube-system coredns-7c65d6cfc9-5cqlv 1/1 Running 0 2d16h kube-system coredns-7c65d6cfc9-whl5d 1/1 Running 0 2d16h kube-system etcd-capy-workload-cluster-control-plane-mc5st 1/1 Running 1 (71m ago) 2d16h kube-system kube-apiserver-capy-workload-cluster-control-plane-mc5st 1/1 Running 2 (71m ago) 2d16h kube-system kube-controller-manager-capy-workload-cluster-control-plane-mc5st 1/1 Running 1 (71m ago) 2d16h kube-system kube-proxy-vzmhq 1/1 Running 1 (71m ago) 2d16h kube-system kube-scheduler-capy-workload-cluster-control-plane-mc5st 1/1 Running 1 (71m ago) 2d16h kube-system yandex-cloud-controller-manager-6pd7x 1/1 Running 0 7s
На локальном компьютере проверим связь управляющего кластера с созданным. После установки CNI и CCM кластер начнет разворачиваться до того количества нод, которое указывалось при создании манифестов кластера:
$ clusterctl describe cluster capy-workload-cluster NAME READY SEVERITY REASON SINCE MESSAGE Cluster/capy-workload-cluster False Warning ScalingUp 112s Scaling up control plane to 3 replicas (actual 2) ├─ClusterInfrastructure - YandexCluster/capy-workload-cluster └─ControlPlane - KubeadmControlPlane/capy-workload-cluster-control-plane False Warning ScalingUp 112s Scaling up control plane to 3 replicas (actual 2) ├─Machine/capy-workload-cluster-control-plane-mc5st True 2d16h │ └─MachineInfrastructure - YandexMachine/capy-workload-cluster-control-plane-mc5st └─Machine/capy-workload-cluster-control-plane-qw9hz False Info WaitingForInfrastructure 112s 1 of 2 completed └─MachineInfrastructure - YandexMachine/capy-workload-cluster-control-plane-qw9hz
Установка ССМ в созданный кластер
Для обеспечения связи между ресурсами кластера и ресурсами Yandex Cloud установите в созданный кластер Cloud Controller Manager, например Kubernetes Cloud Controller Manager for Yandex Cloud.
$ (jumphost) cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: labels: k8s-app: yandex-cloud-controller-manager name: yandex-cloud namespace: kube-system stringData: service-account-json: | <Содержимое json файла созданного сервисного аккаунта> folder-id: "b1gn632om9rumce9tabc" EOF
folder-id соответствует переменной YANDEX_FOLDER_ID:
$ (jumphost) wget https://raw.githubusercontent.com/deckhouse/yandex-cloud-controller-manager/refs/heads/master/manifests/yandex-cloud-controller-manager.yaml $ (jumphost) wget https://raw.githubusercontent.com/deckhouse/yandex-cloud-controller-manager/refs/heads/master/manifests/yandex-cloud-controller-manager-rbac.yaml
В скачанный yandex-cloud-controller-manager.yaml yaml файл нужно добавить env YANDEX_CLUSTER_NAME:
--- apiVersion: v1 kind: ServiceAccount metadata: name: cloud-controller-manager namespace: kube-system --- apiVersion: apps/v1 kind: DaemonSet metadata: name: yandex-cloud-controller-manager labels: k8s-app: yandex-cloud-controller-manager namespace: kube-system spec: selector: matchLabels: k8s-app: yandex-cloud-controller-manager template: metadata: labels: k8s-app: yandex-cloud-controller-manager spec: hostNetwork: true dnsPolicy: Default serviceAccountName: cloud-controller-manager nodeSelector: # The CCM will only run on masters node-role.kubernetes.io/control-plane: "" tolerations: # this taint is set on all nodes when an external CCM is used # so we should tolerate it to schedule our CCM - key: "node.cloudprovider.kubernetes.io/uninitialized" value: "true" effect: "NoSchedule" # CCM should be able to run on masters - key: "node-role.kubernetes.io/control-plane" effect: "NoSchedule" - key: "CriticalAddonsOnly" operator: "Exists" containers: - image: registry.deckhouse.io/yandex-cloud-controller-manager/yandex-cloud-controller-manager:v0.21.3 name: yandex-cloud-controller-manager command: - /bin/yandex-cloud-controller-manager - --cloud-provider=yandex - --v=3 resources: requests: cpu: 100m memory: 50Mi env: - name: YANDEX_CLOUD_SERVICE_ACCOUNT_JSON valueFrom: secretKeyRef: name: yandex-cloud key: service-account-json - name: YANDEX_CLOUD_FOLDER_ID valueFrom: secretKeyRef: name: yandex-cloud key: folder-id - name: YANDEX_CLUSTER_NAME value: capy-workload-cluster
Что получилось
Workload Cluster успешно развернут и готов к работе. Теперь можно устанавливать в него рабочие нагрузки, управлять сетевыми настройками и обеспечивать масштабирование под свои задачи.
Преимущества использования CAPY. Раньше в Yandex Cloud не было нативного способа создавать и управлять кластерами Kubernetes с использованием Cluster API. Теперь благодаря CAPY можно:
Управлять кластерами декларативно — создавать и обновлять кластеры с помощью YAML-манифестов и kubectl apply.
Автоматизировать управление инфраструктурой — используя clusterctl и CRD, можно интегрировать развертывание кластера в CI/CD-процессы.
Гибко масштабировать кластер — добавлять и удалять ноды по необходимости, управляя этим через стандартные Kubernetes-механизмы.
Использовать MachineHealthCheck (MHC) — автоматически обнаруживать и заменять проблемные ноды.
Благодаря CAPY создание и управление Kubernetes-кластерами в Yandex Cloud теперь полностью совместимо с Cluster API, что открывает новые возможности для автоматизации и унификации работы с Kubernetes в облаке.
На прощание оставлю заметки, как удалить созданные ресурсы.
Удаление workload-кластера:
$ kubectl delete -f /tmp/capy-cluster.yaml
Удаление CAPY из management-кластера:
$ make uninstall $ make undeploy
Удаление вспомогательного jumphost:
$ yc compute instance delete jumphost
Удаление management-кластера:
$ yc managed-kubernetes cluster delete capy-management-cluster
