
Здравейте на всички!
Получилo се така, че нашият малък екип, да не кажа, че наскоро, и със сигурност не внезапно, стигна до прехвърлянето на някои (а в перспектива и всички) продукти в Kubernetes.
Причините за това бяха многобройни, но нашата история не е за холивар.
Изборът ни по отношение на инфраструктурната основа беше малък. vCloud Director и vCloud Director. Избрахме по-новия и решихме да започнем.
След пореден път, разглеждайки „The Hard Way“, бързо стигнах до извода, че инструментът за автоматизация поне на основните процеси, като деплойване и размериране, е необходим още вчера. Дълбокото потапяне в Google показа такъв продукт като VMware Container Service Extension (CSE) — open-source продукт, позволяващ да автоматизираме създаването и размерирането на k8s клъстери за тези, които работят с vCloud.
Отказ от отговорност: CSE има свои ограничения, но за нашите цели се представя идеално. Освен това решението трябва да бъде поддържано от облачния доставчик, но тъй като сървърната част също е open-source, поискайте наличието му от най-близкия мениджър 🙂
За да започнете работа, е необходима администрация на сметка в организацията vCloud и предварително създадена routed-мрежа за клъстера (по време на деплоя е необходим достъп до интернет от тази мрежа, не забравяйте да настроите Firewall/NAT). Адресацията не е важна. В този пример ще вземем 10.0.240.0/24.
![]()
Тъй като след създаването на клъстера, трябва да управлявате по някакъв начин, се препоръчва наличието на VPN с маршрутизация в създадената мрежа. Използваме стандартен SSL-VPN, настроен на Edge Gateway на нашата организация.
След това е необходимо да инсталирате CSE клиента там, откъдето ще управлявате кластери k8s. В моя случай това е работно лаптопче и няколко добре скрити контейнера, които управляват автоматизацията.
Клиентът изисква инсталиран Python версия 3.7.3 и по-нова и инсталиран модул , така че ще инсталираме и двете.
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Ако получим грешка Грешка: Сесията е изтекла или потребителят не е влезен. Моля, влезте отново. — отново влизаме в vcd-cli в vCloud, както е описано по-горе, и повтаряме опита.
Този път всичко е наред и задачата за създаване на кластера е стартирала.
Операция по кластера: Създаване на кластер vApp 'MyCluster' (38959587-54f4-4a49-8f2e-61c3a3e879e0) от шаблон 'photon-v2_k8-1.12_weave-2.3.0' (ревизия 1)
Завършването на задачата ще отнеме около 20 минути, а междувременно ще разгледаме основните параметри на стартиране.
—network — създадената от нас преди мрежа.
—ssh-key — създадените от нас ключове, които ще бъдат записани на нодовете на клъстера.
—nodes n — Брой на работещите нодовете на кластера. Мастера винаги е един, това е ограничение на CSE.
—enable-nfs — създаване на допълнителен нод за NFS споделяне под постоянни обеми. Малко сложна опция, за донастройка на това, което прави, ще се върнем по-късно.
Междувременно, в vCloud можем визуално да наблюдаваме създаването на кластера.

След като задачата за създаване на кластера се е приключила, той е готов за работа.
Нека проверим коректността на разполагането с командата vcd cse cluster info MyCluster

След това е необходимо да получим конфигурацията на кластера за използване. kubectl
# vcd cse cluster config MyCluster > ./.kube/config
И можем да проверим състоянието на кластера с нейна помощ:

На този етап можем да считаме кластера за условно работещ, ако не беше историята с постоянните обеми. Тъй като сме в vCloud, не можем да използваме vSphere Provider. Опцията —enable-nfs е предназначена да омилостиви този проблем, но не е напълно разрешена. Необходима е ръчна донастройка.
Първо, нашият нод трябва да създаде отделен независим диск в 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
Внимание: Съществуващият етикет на диска на /dev/sdb ще бъде унищожен и всички данни на
този диск ще бъдат загубени. Искате ли да продължите?
Да/Не? да
(parted) unit GB
(parted) mkpart primary 0 100
(parted) print
Модел: VMware Virtual disk (scsi)
Диск /dev/sdb: 100GB
Размер на сектора (логически/физически): 512B/512B
Таблица на дяловете: gpt
Дискови флагове:
Номер Начало Край Размер Файлова система Име Флагове
1 0.00GB 100GB 100GB primary
(parted) quit
root@nfsd-9604:~# mkfs -t ext4 /dev/sdb1
Създаване на файловата система с 24413696 4k блока и 6111232 инода
UUID на файловата система: 8622c0f5-4044-4ebf-95a5-0372256b34f0
Копия на супервъзелите, съхранени на блокове:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Резервиране на групови таблици: свършено
Записване на таблиците с иноди: свършено
Създаване на журнал (32768 блока): свършено
Записване на супервъзлите и информацията за счетоводство на файловата система: свършено
Създаваме директория за данни и монтираме новия дял там:
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 в нашия клъстер по следния начин:
PV:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
# Същият IP адрес като хоста на NFS, към който се свързахме по-рано.
server: 10.150.200.22
path: "/export/vol1"
EOF
PVC:
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
