Создать кластер k8s с calico и фиксированной нод группой
Перед тем как создать кластер необходимо создать и правильно настроить сущности от которых зависит его создание: SA, SG, KMS.
Установку утилиты ус можно произвести используя мануал:
https://cloud.yandex.ru/docs/cli/operations/install-cli
Про аутентификацию можно почитать тут: https://cloud.yandex.ru/docs/cli/operations/authentication/user
export FOLDER=$(yc config get folder-id) export ZONE=ru-central1-a export NETWORK=$(yc vpc network get cameda-test --format json | jq -r '.id') export SUBNET=subnet-a
0. Установим утилиту jq, если она не установлена ранее:
apt -y install jq
1. Создаём два SA с правами необходимыми для правильного создания кластера и взаимодействия с Container Registry.
yc iam service-account create --name k8s-creator-resources yc iam service-account create --name k8s-puller-registry
2. Назначаем этим аккаунтам необходимые права в фолдере, в котором будет создаваться кластер.
export K8S_Creator_Resources=$(yc iam service-account get k8s-creator-resources --format json | jq -r '.id') export K8S_Puller_Registry=$(yc iam service-account get k8s-puller-registry --format json | jq -r '.id') yc resource folder add-access-binding $FOLDER --role k8s.clusters.agent --subject serviceAccount:$K8S_Creator_Resources yc resource folder add-access-binding $FOLDER --role vpc.publicAdmin --subject serviceAccount:$K8S_Creator_Resources yc resource folder add-access-binding $FOLDER --role kms.admin --subject serviceAccount:$K8S_Creator_Resources yc resource folder add-access-binding $FOLDER --role container-registry.images.puller --subject serviceAccount:$K8S_Puller_Registry
При назначении прав я исхожу из принципа минимально необходимых прав для аккаунта с целью проведения необходимых манипуляций.
Или можно использовать SA с правами, необходимыми для подключения всех возможных дополнений (ingress, pvc, etc) и не думать в дальнейшем о правах. Для этого необходимы права editor. Такой аккаунт мы создавали здесь: https://teletype.in/@cameda/w93lPMPQWS4
export SA=$(yc iam service-account get cameda-service --format json | jq -r '.id')
3. После настройки SA создаём SG (группы безопасности) и задаём минимально необходимые правила для полноценной работы кластера и доступа к нему.
yc vpc sg create --name k8s-sg \ "--rule" "description=access all egress port,direction=egress,from-port=1,to-port=65535,protocol=any,v4-cidrs=[0.0.0.0/0]" \ "--rule" "description=access 22 port,direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \ "--rule" "description=access 443 port,direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \ "--rule" "description=access 6443 port,direction=ingress,port=6443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \ "--rule" "description=balancer port,direction=ingress,from-port=1,to-port=65535,protocol=tcp,v4-cidrs=[198.18.235.0/24],v4-cidrs=[198.18.248.0/24]" \ "--rule" "description=service port,direction=ingress,from-port=30000,to-port=32767,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \ "--rule" "description=ICMP,direction=ingress,protocol=icmp,v4-cidrs=[10.0.0.0/8],v4-cidrs=[192.168.0.0/16]" \ "--rule" "description=PODtoService,direction=ingress,from-port=1,to-port=65535,protocol=any,v4-cidrs=[10.97.0.0/16],v4-cidrs=[10.98.0.0/16]" \ "--rule" "description=Self,direction=ingress,from-port=1,to-port=65535,protocol=any,predefined=self_security_group" \ --network-id $NETWORK --description "k8s access" --folder-id $FOLDER --async
Здесь [10.97.0.0/16] - диапазон подов; [10.98.0.0/16] - диапазон сервисов.
yc kms symmetric-key create \ --folder-id $FOLDER \ --name k8s-key \ --description "k8s symmetric key" \ --default-algorithm aes-256 \ --rotation-period 24h \ --async
5. Создаём кластер K8s с зональным мастером и ключем KMS и сервисным аккаунтом с правами editor.
export SG=$(yc vpc sg get k8s-sg --format json | jq -r '.id') export KMS=$(yc kms symmetric-key get k8s-key --format json | jq -r ".id") yc k8s cluster create \ --folder-id $FOLDER \ --name cam-kuber-prod \ --description "cameda k8s prod cluster" \ --network-id $NETWORK \ --zone $ZONE \ --subnet-name $SUBNET \ --public-ip \ --release-channel stable \ --version 1.21 \ --cluster-ipv4-range 10.97.0.0/16 \ --service-ipv4-range 10.98.0.0/16 \ --auto-upgrade=false \ --security-group-ids $SG \ --enable-network-policy \ --node-service-account-id $SA \ --service-account-id $SA \ --kms-key-id $KMS \ --daily-maintenance-window start=22:00,duration=10h \ --async
Версия кластера 1.21, релизный канал STABLE, обновления кластера по дефолту выключены. CNI=CALICO.
6. Проверяем, что кластер создался корректно.
yc k8s cluster get cam-kuber-prod --folder-id $FOLDER --format json | jq -r ".health"
Создание фиксированной нод группы для кластера.
yc k8s node-group create \ --folder-id $FOLDER \ --name cam-prod-group \ --cluster-name cam-kuber-prod \ --description "prodgroup" \ --metadata serial-port-enable=1 \ --metadata-from-file=ssh-keys=/Users/cameda/ssh-pairs.txt \ --location zone=$ZONE \ --platform standard-v3 \ --memory 16 \ --cores 8 \ --core-fraction 100 \ --disk-type network-ssd \ --disk-size 96 \ --network-acceleration-type standard \ --network-interface security-group-ids=$SG,subnets=$SUBNET,ipv4-address=nat \ --version 1.21 \ --container-runtime containerd \ --fixed-size 2 \ --auto-upgrade=false \ --auto-repair \ --max-expansion 1 \ --max-unavailable 1 \ --daily-maintenance-window start=22:00,duration=5h \ --allowed-unsafe-sysctls net.ipv4.tcp_timestamps \ --async
Файл ssh-pairs.txt: cameda:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDI98mJDBN9cnp6HOdBYTQILeAhUSDvDfoqA9iLmVPDyPLFRWs7tE4BjCAcFD6a3M50QIboCaohfa7h+PWksYibab7I3QHOR7y9pCW8FGonGRw2ACvt906qlaWHFj7jWOxuihFoiRROKqLCW5YE/Yc4XFIvW1gu3JQdvQ1wemWvujsI8EHE6PI1pEg7/41y6kn3IhNHIr8WRLe4dPyPGjwc4LpBCcaRSJiX4YjVXynSIHNk365UrL+nGv8ix7bW5FNCgGqSgfUTVCfMYLzQ/gYHPVQrcIvCeHjkwluH8Z3gXeN3OliejBjpLi+IWIzd9K6UADSUNU8oL+9941tDidp8APoe7RbB4h3bY6k8Bhy0yxohgQS2OWSYd1mjeEx8Ba5wzJKqfpUgmcPdrBJnBwLgLMFQyEfYG6vTPkYWAKEvkkJ6ZiA4tdoQvCb+B0xJV/ivHyLtoi3LFE59mbQFDUy8O51vX9JjBDLwzyTEeslWp7uOP66Ti5Q5ucNXbs5yXTU= cameda@cameda-osx
Здесь создаём группу из 2 нод, версии 1.21 без автоматического обновления. Группа может увеличиться на 1 ноду в следствии обслуживания и уменьшиться до одной ноды. В качестве рантайма используется containerd. Вход по ssh на ноды кластера разрешён.
Проверяем, что нод группа создалась успешно.
yc k8s cluster list-nodes cam-kuber-prod +--------------------------------+---------------------------+--------------------------------+-------------+--------+ | CLOUD INSTANCE | KUBERNETES NODE | RESOURCES | DISK | STATUS | +--------------------------------+---------------------------+--------------------------------+-------------+--------+ | fhmemah91tq3tcn1aibr | cl162l3ckkc7hm6ctadc-ibah | 8 100% core(s), 16.0 GB of | 96.0 GB ssd | READY | | RUNNING_ACTUAL | | memory | | | | fhm42172up7fhv68nqsk | cl162l3ckkc7hm6ctadc-uvim | 8 100% core(s), 16.0 GB of | 96.0 GB ssd | READY | | RUNNING_ACTUAL | | memory | | | +--------------------------------+---------------------------+--------------------------------+-------------+--------+
Подключаемся к кластеру и проверяем, что он работает.
yc managed-kubernetes cluster get-credentials --id cluster_id --external alias kubectl='kubectl --kubeconfig /Users/cameda/.kube/config' kubectl cluster-info kubectl get po -A
Полезные ссылки.
Квоты в облаке: https://teletype.in/@cameda/yTu0k42dbw0
Создаём сервисный аккаунт с ключами: https://teletype.in/@cameda/w93lPMPQWS4
Создаём KMS сервис: https://teletype.in/@cameda/vBIMDOZi7vV
Про зоны доступности: https://teletype.in/@cameda/S34zdiTcbUM
Создаём сеть в облаке: https://teletype.in/@cameda/ZbTkF70KWK9