Пространство IT-технологий развивается со скоростью света. Инструменты и фреймворки, которые могут быть крутыми сегодня, завтра могут быть полностью забыты или отброшены. Яркими примерами являются Docker Swarm и его Universal Control Plane, который изначально был очень популярен на рынке, а теперь используется экономно среди многих сторонников Docker, хотя и в гораздо меньших масштабах по сравнению с его когда-то главным конкурентом, а именно Kubernetes.

В настоящее время, с появлением новых инструментов и ажиотажем по поводу перехода на облачные технологии, облачные платформы становятся все более и более развитыми благодаря множеству способов их распространения/развертывания на нескольких платформах. Настроить даже сложную инфраструктуру можно относительно легко с помощью хорошо спланированных и выполненных наборов инструментов для настройки и управления инфраструктурой. Многие из них на рынке сейчас основаны на парадигме Infrastructure-As-Code (IaC). У нас были решения, не зависящие от облака, такие как Terraform и в некоторой степени Ansible (в основном для управления конфигурацией). Кроме того, есть Cloudformation и Azure Resource Manager, которые в данном случае представляют собой решения для конкретных поставщиков, предназначенные для AWS и Microsoft Azure соответственно.

В этом уже переполненном и действительно зрелом пространстве инструментов IaC мое внимание привлек несколько новый инструмент под названием Pulumi…

Я был заинтригован и решил попробовать, ниже я поделился своим опытом того, что я узнал.

Что такое пулуми?

Pulumi — это, по сути, еще один инструмент «инфраструктура как код», разработанный с учетом простоты использования разработчиками. Это позволяет разработчикам писать свои собственные конвейеры / манифесты IaC в этом случае на языке по своему выбору без необходимости изучать язык, специфичный для предметной области (DSL), который требуется другим инструментам «инфра-как-код». Он поддерживает всех основных облачных провайдеров, таких как AWS, Azure, Google Cloud и даже ванильный Kubernetes, поэтому он подходит для большинства случаев использования облака.

Для кого это?

В основном для разработчиков или очень гибких гибридов разработчик/SRE или инженеров DevOps, у которых есть хотя бы некоторые предварительные навыки программирования (хотя кодирование в Pulumi ужасно ограничительно и включает повторное использование одних и тех же библиотек и некоторых основных функций для выполнения вашей работы, поэтому, даже если вы не маэстро программирования, которого, я думаю, вы легко поймаете). Если вы являетесь системным администратором и вас устраивает автоматизация сценариев, я уверен, что Terraform и Cloudformation и ARM для конкретных ситуаций поставщика отлично подойдут вам… пока…

Как им пользоваться?

Pulumi поддерживает три платформы Linux, Mac и Windows. Здесь я покажу вам, как установить Pulumi на Linux Ubuntu 16.04 для провайдера Kubernetes. Вы устанавливаете Pulumi в Linux с помощью базовой команды →

curl -fsSL https://get.pulumi.com | sh

Это загрузит Pulumi с веб-сайта Pulumi и установит двоичные файлы в соответствующее место. Убедитесь, что после установки ваш двоичный каталог Pulumi добавлен к переменной PATH linux, либо запустив →

export PATH=$PATH:/path/to/pulumi/bin
or
vi ~/.profile
### Append :/path/to/pulumi/bin to PATH variable or add the full export line above into your profile.
source ~/.profile

Установите свой любимый язык программирования, в настоящее время Pulumi поддерживает Javascript, Typescript, Python и C# (режим предварительного просмотра). Я сделал это, используя node/Typescript, но вы также можете выбрать Python/Javascript, если хотите.

Теперь, чтобы поиграть с провайдером Kubernetes, вам нужно будет установить Kubernetes на вашем локальном компьютере, что для большинства людей будет миникубом, но я выбрал k3s, потому что он более легкий и простой в установке и управлении. Перед этим вы должны были знать, что установка k3s по умолчанию не включает команды kubectl из коробки, а также kubeconfig на k3s не использует расположение и формат по умолчанию. Но для правильной работы Pulumi вам понадобится правильный двоичный файл kubectl, подключающийся к работающему кластеру kubernetes, и, следовательно, правильный файл kubeconfig на вашем локальном компьютере. Для этого нам нужно установить k3s, а затем объединить переменную среды KUBECONFIG с путем по умолчанию для kubernetes и k3s. Давайте сделаем это сейчас →

### Install k3s using the following:
curl -sfL https://get.k3s.io | sh -
### Query if k3s kubernetes is up using the following:
k3s kubectl get nodes
### You should get an output quite like this --> 
NAME               STATUS   ROLES    AGE   VERSION
mdhar-virtualbox   Ready    master   59d   v1.16.3-k3s.2
###

Теперь, чтобы заставить kubectl работать над этим (подключиться к этому кластеру k3s), запустите на своем терминале следующее:

export KUBECONFIG="~/.kube/config:/etc/rancher/k3s/k3s.yaml"

Это гарантирует, что ваши свойства k3s и kubeconfig будут объединены, и, следовательно, и kubectl, и k3s смогут использовать эти свойства.

Теперь давайте начнем с создания фиктивного проекта Pulumi для провайдера Kubernetes.

### Create a directory and browse into it
mkdir kubernetes-quickstart && cd kubernetes-quickstart
### Create a new Pulumi project 
pulumi new kubernetes-typescript

Он задаст вам несколько вопросов, вы можете ответить или пропустить их следующим образом →

Затем он сразу же устанавливает зависимости, загружая базовый манифест nginx Pulumi, а затем устанавливая его зависимости. Обратите внимание, что при установке зависимостей вы можете столкнуться с проблемой установки пакета «deasync», который является одной из третичных зависимостей. Если вы не сталкиваетесь с этой ошибкой, вы можете пропустить раздел ниже и прочитать, где вы можете, наконец, развернуть свой проект. Ошибка будет выглядеть примерно так:

Что вы должны понимать, так это то, что Pulumi делает при создании нового проекта, загружает много халтурного кода (создает развертывание nginx Kubernetes) со своих серверов, а затем устанавливает его с помощью управления пакетом для конкретного языка, которым в данном случае является npm. Чтобы решить эту проблему при сбое npm, вы можете установить другой менеджер пакетов с именем yarn и использовать yarn для завершения этой установки. Для этого выполните следующие шаги:

### Install yarn using npm
npm install -g yarn
### now from inside your Pulumi project folder execute the following
yarn install
### The following will install all the project dependencies and make you ready for the next project.

Теперь, чтобы проверить созданный код (код находится в index.ts) →

Как видите, все, что он делает, — это импорт библиотеки pulumi kubernetes, которую вы будете использовать для взаимодействия с локальным кластером kubernetes. Затем он объявляет константу appLabels, которая является меткой приложения, которое вы собираетесь развернуть, а затем создаете развертывание, отправляя манифест развертывания kubernetes в качестве аргумента классу Pulumi k8s для создания экземпляра экземпляра развертывания. Это все, что вам нужно будет передать Pulumi, что все, что вы просите, — это запрос на создание объекта развертывания «nginx».

Теперь, чтобы развернуть проект Pulumi (пользователи, не столкнувшиеся с указанной выше ошибкой, могут продолжить отсюда):

### Deploy your Pulumi project here
pulumi up

Ниже вы увидите следующие действия. Если вы получите приглашение продолжить, нажмите «Да»:

Чтобы проверить, выполнил ли Pulumi и запланировал ли развертывание в вашем кластере kubernetes, запросите развертывания, проверьте, видите ли вы развертывание nginx, указанное в выводе kubectl:

### Check if the nginx deployment is deployed
kubectl get deployments
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
nginx-826ps80g   1/1     1            1           8m2s

Итак, поздравляю, вы успешно развернули k3s, установили Pulumi и успешно развернули развертывание nginx с помощью Pulumi.