Постройте развертывание 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
в конце означает, что эта зависимость будет работать с Kubernetes1.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
С помощью браузера перейдите на сайт http://localhost:80. Вы должны увидеть знакомый экран установки WordPress.
Завершите установку и войдите в свой экземпляр WordPress. Не стесняйтесь экспериментировать с ним.
Заключение
cdk8s
сам по себе является мощным инструментом, но он также предоставляет вам возможность расширять и создавать другие абстракции поверх него. Вы увидели, как написать пользовательскую конструкцию в Go
и использовать ее для развертывания WordPress на Kubernetes. В дальнейшем это можно использовать как основу для других повторно используемых компонентов.
Счастливого кодинга!