CSE: Kubernetes для тих хто у vCloud-і

CSE: Kubernetes для тих хто у vCloud-і
Всім привіт!

Так склалося, що наша невелика команда, не сказати, щоб недавно, і вже точно не раптово, доросла до перенесення деяких (а в перспективі і всіх) продуктів у Kubernetes.

Причин тому було багато, але наша історія не про холівар.

Із інфраструктурної основи вибір у нас був невеликий. vCloud Director та vCloud Director. Вибрали той, що новіший і вирішили почати.

В черговий раз погортавши The Hard Way, я дуже швидко дійшов висновку, що інструмент для автоматизації хоча б базових процесів, таких як деплой і сайзинг, потрібен ще вчора. Глибоке занурення в гугл явило світ такий продукт як VMware Container Service Extension (CSE) — опенсорсний продукт, що дозволяє автоматизувати створення та сайзинг k8s кластерів для тих, хто в vCloud-і.

Disclaimer: CSE має свої обмеження, але для наших цілей він ідеально підійшов. Також рішення має підтримуватись хмарним провайдером, але оскільки серверна частина також open-source, вимагайте його наявності у найближчого менеджера 🙂

Для початку використання необхідний обліковий запис адміністратора в організації vCloud і заздалегідь створена routed-мережа для кластера (у процесі деплою необхідний доступ в інтернет з цієї мережі, не забудьте налаштувати Firewall/NAT). Адресація не має значення. У цьому прикладі візьмемо 10.0.240.0/24

CSE: Kubernetes для тих хто у vCloud-і

Так як після створення кластером потрібно буде якось керувати, рекомендується наявність VPN з маршрутизацією в створену мережу. Ми використовуємо стандартний SSL-VPN, налаштований на Edge Gateway нашої організації.

Далі необхідно встановити CSE клієнт туди, звідки буде керуватися кластерами k8s. У моєму випадку це робочий ноут і пара добре прихованих контейнерів, які керують автоматизацією.

Клієнт вимагає наявності встановленого Python версії 3.7.3 і вище та встановленого модуля vcd-cli, тому встановимо і те, й інше.

pip3 install vcd-cli

pip3 install container-service-extension

Після встановлення перевіряємо версію CSE та отримуємо наступне:

# vcd cse version
Error: No such command "cse".

Несподівано, але можна виправити. Як виявилося, CSE необхідно прикрутити як модуль до vcd-cli.
Для цього необхідно спочатку залогінити vcd-cli до нашої організації:

# vcd login MyCloud.provider.com org-dev admin
Password: 
admin logged in, org: 'org-dev', vdc: 'org-dev_vDC01'

Після цього vcd-cli створить файл конфігурації ~/.vcd-cli/profiles.yaml
У його кінець необхідно додати таке:

extensions:
  - container_service_extension.client.cse

Після чого повторно перевіряємо:

# vcd cse version
CSE, Container Service Extension for VMware vCloud Director, version 2.5.0

Етап встановлення клієнта завершено. Спробуємо розгорнути перший кластер.
CSE має кілька наборів параметрів використання, всі їх можна переглянути тут.

Спочатку створимо ключі, для безпарольного доступу до майбутнього кластера. Цей момент важливий, тому що за замовчуванням вхід за паролем на ноди буде відключений і якщо не задати ключі, можна отримати багато роботи через консолі віртуальних машин, що не сказати, щоб зручно.

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

Пробуємо запустити створення кластера:

vcd cse cluster create MyCluster --network k8s_cluster_net --ssh-key ~/.ssh/id_rsa.pub --nodes 3 --enable-nfs

Якщо отримуємо помилку Error: Помилка не expired або user not logged in. Please re-login. - Знову логіним vcd-cli в vCloud як описано вище і повторюємо спробу.

На цей раз все добре і завдання створення кластера запустилося.

cluster operation: Creating cluster vApp 'MyCluster' (38959587-54f4-4a49-8f2e-61c3a3e879e0) from template 'photon-v2_k8-1.12_weave-2.3.0' (revision 1)

На завершення завдання потрібно близько 20 хвилин, тим часом розберемо основні параметри запуску.

-network - Створена нами раніше мережа.
-ssh-key - створені нами ключі, які будуть записані на ноди кластера
-nodes n - Кількість Worker нод кластера. Майстер буде завжди один, це обмеження CSE
-enable-nfs - створити додаткову ноду для NFS кулі під persistent volumes. Трохи педальна опція, до доналаштування того, що вона робить, ми повернемося трохи згодом.

Тим часом, vCloud можна візуально спостерігати за створенням кластера
CSE: Kubernetes для тих хто у vCloud-і

Як тільки завдання створення кластера завершилося, він готовий до роботи.

Перевіримо коректність деплою командою vcd cse cluster info MyCluster

CSE: Kubernetes для тих хто у vCloud-і

Далі нам необхідно отримати конфігурацію кластера для використання кубектл

# vcd cse cluster config MyCluster > ./.kube/config

І можна перевірити стан кластера вже за допомогою неї:

CSE: Kubernetes для тих хто у vCloud-і

На цьому моменті кластер можна вважати умовно робітником, якби не історія з persistent volumes. Оскільки ми в vCloud-і, використовувати vSphere Provider не вийде. Опція -enable-nfs покликана згладити цю неприємність, але вийшло не до кінця. Потрібна ручна донастройка.

Для початку нашій ноді необхідно створити окремий Independent диск у vCloud. Це дає гарантію того, що наші дані не зникнуть разом із кластером, він буде видалений. Також, підключимо диск до NFS

# vcd disk create nfs-shares-1 100g --description 'Kubernetes NFS shares'
# vcd vapp attach mycluster nfsd-9604 nfs-shares-1

Після цього йдемо по ssh (ви ж правда, створили ключі?) на нашу NFS ноду і остаточно підключаємо диск:

root@nfsd-9604:~# parted /dev/sdb
(parted) mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? yes
(parted) unit GB
(parted) mkpart primary 0 100
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 100GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name     Flags
 1      0.00GB  100GB  100GB               primary

(parted) quit
root@nfsd-9604:~# mkfs -t ext4 /dev/sdb1
Creating filesystem with 24413696 4k blocks and 6111232 inodes
Filesystem UUID: 8622c0f5-4044-4ebf-95a5-0372256b34f0
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

Створюємо директорію під дані та маунтимо туди свіжий розділ:

mkdir /export
echo '/dev/sdb1  /export   ext4  defaults   0 0' >> /etc/fstab
mount -a

Створимо п'ять тестових розділів та розшаримо їх для кластера:

>cd /export
>mkdir vol1 vol2 vol3 vol4 vol5
>vi /etc/exports
#Добавим это в конец файла
/export/vol1 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol2 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol3 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol4 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol5 *(rw,sync,no_root_squash,no_subtree_check)
#:wq! ;)
#Далее - экспортируем разделы
>exportfs -r

Після всієї цієї магії, можна створити PV та PVC у нашому кластері приблизно так:
репортер:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-vol1
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    # Same IP as the NFS host we ssh'ed to earlier.
    server: 10.150.200.22
    path: "/export/vol1"
EOF

ПВХ:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 10Gi
EOF

На цьому історія створення одного кластера закінчується та починається історія його життєвого циклу. Як бонус — ще дві корисні команди CSE, що дозволяють часом непогано економити чи ні ресурси:

#Увеличиваем размер кластера до 8 воркер нод
>cse cluster resize MyCluster --network k8s_cluster_net --nodes 8

#Выводим ненужные ноды из кластера с их последующим удалением
>vcd cse node delete MyCluster node-1a2v node-6685 --yes

Всім дякую за приділений час, якщо будуть запитання – задавайте у коментарях.

Джерело: habr.com

Додати коментар або відгук