Напишите инфраструктуру Kubernetes в виде кода на Go — Расширение cdk8s с помощью пользовательских конструкций

Постройте развертывание WordPress как конструкцию cdk8s

Конструкты — это фундаментальный строительный блок cdk8s (Cloud Development Kit for Kubernetes) — фреймворка с открытым исходным кодом (часть CNCF), с помощью которого вы можете создавать приложения Kubernetes, используя обычные языки программирования (вместо yaml). В разделе Начало работы с cdk8s вы узнали, как использовать основную библиотеку cdk8s.

Вы также можете использовать библиотеку cdk8s-plus (о ней также рассказывалось в предыдущем блоге), чтобы уменьшить количество кода, который нужно писать. С помощью cdk8s-plus создание Kubernetes Deployment, указание контейнера (и других свойств) и предоставление доступа к нему через Service — это три вызова функций.

Например, для настройки и доступа к Nginx вам понадобится следующее:

//...
deployment := cdk8splus22.NewDeployment(chart, jsii.String("deployment"), &cdk8splus22.DeploymentProps{Metadata: &cdk8s.ApiObjectMetadata{Name: jsii.String("nginx-deployment-cdk8s-plus")}})

deployment.AddContainer(&cdk8splus22.ContainerProps{
        Name:  jsii.String("nginx-container"),
        Image: jsii.String("nginx"),
        Port:  jsii.Number(80)})

deployment.ExposeViaService(&cdk8splus22.DeploymentExposeViaServiceOptions{
        Name:        jsii.String("nginx-container-service"),
        ServiceType: cdk8splus22.ServiceType_LOAD_BALANCER,
        Ports:       &[]*cdk8splus22.ServicePort{{Port: jsii.Number(9090), TargetPort: jsii.Number(80)}}})
//...
Войти в полноэкранный режим Выйти из полноэкранного режима

Но все может стать еще лучше!

Вместо того чтобы писать одну и ту же логику снова и снова, вы можете упаковать ее в виде многократно используемого компонента, который можно вызывать так же, как и другие встроенные функции cdk8s (например, NewDeployment, NewService и т.д.). Хотя это может показаться не столь полезным для простого приложения (приложений), такой подход неоценим для большого проекта, команды или организации, которые хотят масштабировать свои инженерные усилия. На самом деле, на сайте constructs.dev уже существует целый пул готовых к использованию компонентов. Они включают в себя конструкции, созданные сообществом, AWS и другими компаниями, для различных языков программирования.

Чтобы лучше понять, как это может выглядеть на практике

… давайте посмотрим на код. Я продолжу использовать WordPress в качестве примера, как я это делал в предыдущей записи блога. Вот фрагмент кода, который показывает, как все соединено вместе (с описанием реализации в следующем разделе):

Полный код можно найти на Github

//...

func NewMyChart(scope constructs.Construct, id string, props *MyChartProps) cdk8s.Chart {
    //....
    NewWordpressStack(chart, jsii.String("wordpress-stack"), &WordpressProps{//....)
    return chart
}

func main() {
    app := cdk8s.NewApp(nil)
    NewMyChart(app, "wordpress-custom-stack", nil)
    app.Synth()
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Мы просто настраиваем его в соответствии с нашими требованиями (с помощью WordPressProps).
  • Включить это как часть cdk8s.Chart, который затем включается в cdk8s.App (как и любое другое cdk8s приложение).

Существует много гибкости в том, как вы хотите построить пользовательскую конструкцию, в зависимости от ваших требований. Но, по своей сути, основная концепция заключается в определении способа создания новой конструкции.Construct. Вы захотите обеспечить способ добавления метаданных для дальнейшей настройки/уточнения вашей Construct — обычно это делается через свойства (cdk8s.ChartProps).

Сначала мы определим WordPressProps — это инкапсулирует/внешне определяет атрибуты установки WordPress. Поскольку это всего лишь пример, я предоставил ограниченные атрибуты, такие как образы MySQL/Wordpress Docker, пароль MySQL и необходимое хранилище.

type WordPressProps struct {
    MySQLImage    *string
    MySQLPassword *string
    MySQLStorage  *float64

    WordPressImage   *string
    WordPressStorage *float64
}
Вход в полноэкранный режим Выход из полноэкранного режима

Затем у нас есть функция, которая позволит другим графикам/конструкциям инстанцировать WordPress. Именно здесь находится вся реализация.

func NewWordpressStack(scope constructs.Construct, id *string, props *WordpressProps) constructs.Construct {
    ...
}
Вход в полноэкранный режим Выход из полноэкранного режима

Параметр props *WordpressProps позволяет другим конструкциям влиять на создание стека WordPress, например, вы можете определить, сколько хранилища вам нужно, возможно, использовать другой образ Docker для WordPress/MySQL. Фактический код этой функции похож на тот, что вы видели здесь (с необходимыми корректировками), поэтому нет смысла повторять его здесь. Я просто выделю важные фрагменты — в частности, те, которые используют props для настройки необходимых компонентов.

В этом примере конструкции использована библиотека cdk8splus22. Причина такого соглашения об именовании заключается в том, что каждая библиотека cdk8s-plus поставляется отдельно для определенной версии Kubernetes — 22 в конце означает, что эта зависимость будет работать с Kubernetes 1.22. Вы можете использовать библиотеку, соответствующую вашей версии Kubernetes, и обратиться к FAQs за дополнительной информацией.

Мы используем пароль MySQL из props и используем его для создания Secret.

    //...
    password := props.MySQLPassword
    mysqlSecret := cdk8splus22.NewSecret(wordpressConstruct, jsii.String("mysql-secret"),
        &cdk8splus22.SecretProps{
            Metadata: &cdk8s.ApiObjectMetadata{Name: jsii.String(secretName)}}) 
    secretKey := "password"
    mysqlSecret.AddStringData(jsii.String(secretKey), password)
    //...
Вход в полноэкранный режим Выход из полноэкранного режима

Образы контейнеров для MySQL и WordPress ссылаются на соответствующие Deployment:

//...
    containerImage := props.MySQLImage

    mysqlContainer := dep.AddContainer(&cdk8splus22.ContainerProps{
        Name:  jsii.String("mysql-container"),
        Image: containerImage,
        Port:  jsii.Number(3306),
    })
//...

    wordpressContainer := wordPressDeployment.AddContainer(&cdk8splus22.ContainerProps{
        Name:  jsii.String("wordpress-container"),
        Image: props.WordpressImage,
        Port:  jsii.Number(80),
    })
Войти в полноэкранный режим Выход из полноэкранного режима

Мы также используем переданное хранилище — оно используется для настройки запроса PersistentVolumeClaim.

...
    mysqlPVC := cdk8splus22.NewPersistentVolumeClaim(wordpressConstruct, jsii.String("mysql-pvc"), &cdk8splus22.PersistentVolumeClaimProps{
        AccessModes: &[]cdk8splus22.PersistentVolumeAccessMode{cdk8splus22.PersistentVolumeAccessMode_READ_WRITE_ONCE},
        Storage:     cdk8s.Size_Gibibytes(props.MySQLStorage)})
...

    wordpressPVC := cdk8splus22.NewPersistentVolumeClaim(wordpressConstruct, jsii.String("wordpress-pvc"), &cdk8splus22.PersistentVolumeClaimProps{
        AccessModes: &[]cdk8splus22.PersistentVolumeAccessMode{cdk8splus22.PersistentVolumeAccessMode_READ_WRITE_ONCE},
        Storage:     cdk8s.Size_Gibibytes(props.WordpressStorage)})
Вход в полноэкранный режим Выход из полноэкранного режима

Наконец, мы вызываем NewWordpressStack из другого cdk8s.Chart и передаем атрибуты, которые хотим настроить.

func NewMyChart(scope constructs.Construct, id string, props *MyChartProps) cdk8s.Chart {
    var cprops cdk8s.ChartProps
    if props != nil {
        cprops = props.ChartProps
    }
    chart := cdk8s.NewChart(scope, jsii.String(id), &cprops)

    NewWordpressStack(chart, jsii.String("wordpress-stack"), &WordpressProps{
        MySQLImage:       jsii.String("mysql"),
        MySQLPassword:    jsii.String("Password123"),
        MySQLStorage:     jsii.Number(3),
        WordPressImage:   jsii.String("wordpress:4.8-apache"),
        WordPressStorage: jsii.Number(2)})

    return chart
}
Вход в полноэкранный режим Выход из полноэкранного режима

Используйте это для установки WordPress

Чтобы протестировать его локально…

… вы можете использовать minikube, kind и т.д.

# make sure cluster is running
minikube start

git clone https://github.com/abhirockzz/cdk8s-for-go-developers
cd part4-custom-construct
Войти в полноэкранный режим Выход из полноэкранного режима

Создайте манифест и просмотрите все ресурсы (см. каталог dist):

cdk8s synth
Войти в полноэкранный режим Выйти из полноэкранного режима

Развернуть их:

kubectl apply -f dist/

# output (might differ in your case)

secret/mysql-pass created
deployment.apps/mysql-mysql-deployment-cdk8splus-c83762d9 created
persistentvolumeclaim/mysql-mysql-pvc-c8799bba created
service/mysql-service created
deployment.apps/wordpress-wordpress-deployment-cdk8splus-c8252da7 created
service/wordpress-service created
persistentvolumeclaim/wordpress-wordpress-pvc-c8334a29 created
Войти в полноэкранный режим Выйти из полноэкранного режима

Проверьте Kubernetes Service (называется wordpress-service), который экспонирует wordpress Deployment.

kubectl get svc wordpress-service
Вход в полноэкранный режим Выход из полноэкранного режима

Если вы используете minikube, в другом терминале запустите (если он еще не запущен):

minikube tunnel
Enter fullscreen mode Выйти из полноэкранного режима

С помощью браузера перейдите на сайт http://localhost:80. Вы должны увидеть знакомый экран установки WordPress.

Завершите установку и войдите в свой экземпляр WordPress. Не стесняйтесь экспериментировать с ним.

Заключение

cdk8s сам по себе является мощным инструментом, но он также предоставляет вам возможность расширять и создавать другие абстракции поверх него. Вы увидели, как написать пользовательскую конструкцию в Go и использовать ее для развертывания WordPress на Kubernetes. В дальнейшем это можно использовать как основу для других повторно используемых компонентов.

Счастливого кодинга!

Оцените статью
devanswers.ru
Добавить комментарий