Kubernetes
June 3, 2022

Создать кластер 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] - диапазон сервисов.

4. Создаём ключ KMS.

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"

Ответ должен быть HEALTHY

Создание фиксированной нод группы для кластера.

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