Что такое Google Cloud Deployment Manager?
Google Cloud Deployment Manager — это сервис для управления инфраструктурой как кодом в Google Cloud Platform. Он позволяет декларативно описать ресурсы GCP в YAML или Python файлах и автоматически создавать, обновлять и управлять облачной инфраструктурой. Deployment Manager обеспечивает воспроизводимые и версионируемые развертывания.
Основные возможности Deployment Manager
- Declarative configuration — описание желаемого состояния инфраструктуры
- Template support — переиспользуемые шаблоны для ресурсов
- Dependency management — автоматическое управление зависимостями
- Preview mode — предварительный просмотр изменений
- Rollback support — откат к предыдущим версиям
- Python templates — программируемые шаблоны на Python
Основные компоненты
- Configuration — YAML файл с описанием развертывания
- Template — переиспользуемые определения ресурсов
- Deployment — экземпляр конфигурации с созданными ресурсами
- Resource — отдельные компоненты GCP
- Type — тип ресурса или шаблона
- Manifest — снимок состояния развертывания
Пример конфигурации YAML
1# vm-config.yaml
2imports:
3- path: vm-template.jinja
4
5resources:
6- name: my-vm
7 type: vm-template.jinja
8 properties:
9 zone: us-central1-a
10 machineType: n1-standard-1
11 diskImage: projects/debian-cloud/global/images/family/debian-11
12 network: default
13
14- name: my-firewall
15 type: compute.v1.firewall
16 properties:
17 allowed:
18 - IPProtocol: TCP
19 ports: ["80", "443"]
20 sourceRanges: ["0.0.0.0/0"]
21 targetTags: ["web-server"]
22
23- name: my-static-ip
24 type: compute.v1.globalAddress
25 properties:
26 name: web-server-ip
Пример Jinja2 шаблона
# vm-template.jinja
resources:
- name: {{ env["name"] }}
type: compute.v1.instance
properties:
zone: {{ properties["zone"] }}
machineType: zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
disks:
- deviceName: boot
type: PERSISTENT
boot: true
autoDelete: true
initializeParams:
sourceImage: {{ properties["diskImage"] }}
diskSizeGb: 20
networkInterfaces:
- network: global/networks/{{ properties["network"] }}
accessConfigs:
- name: External NAT
type: ONE_TO_ONE_NAT
tags:
items:
- web-server
metadata:
items:
- key: startup-script
value: |
#!/bin/bash
apt-get update
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx
outputs:
- name: instanceName
value: $(ref.{{ env["name"] }}.name)
- name: externalIP
value: $(ref.{{ env["name"] }}.networkInterfaces[0].accessConfigs[0].natIP)
Пример Python шаблона
1# vm-template.py
2def GenerateConfig(context):
3 """Генерирует конфигурацию для VM."""
4
5 resources = []
6 properties = context.properties
7
8 # VM instance
9 vm_resource = {
10 'name': context.env['name'],
11 'type': 'compute.v1.instance',
12 'properties': {
13 'zone': properties['zone'],
14 'machineType': f"zones/{properties['zone']}/machineTypes/{properties['machineType']}",
15 'disks': [{
16 'deviceName': 'boot',
17 'type': 'PERSISTENT',
18 'boot': True,
19 'autoDelete': True,
20 'initializeParams': {
21 'sourceImage': properties['diskImage'],
22 'diskSizeGb': properties.get('diskSize', 20)
23 }
24 }],
25 'networkInterfaces': [{
26 'network': f"global/networks/{properties['network']}",
27 'accessConfigs': [{
28 'name': 'External NAT',
29 'type': 'ONE_TO_ONE_NAT'
30 }]
31 }],
32 'tags': {
33 'items': properties.get('tags', [])
34 }
35 }
36 }
37
38 if 'startupScript' in properties:
39 vm_resource['properties']['metadata'] = {
40 'items': [{
41 'key': 'startup-script',
42 'value': properties['startupScript']
43 }]
44 }
45
46 resources.append(vm_resource)
47
48 return {
49 'resources': resources,
50 'outputs': [{
51 'name': 'instanceName',
52 'value': f"$(ref.{context.env['name']}.name)"
53 }, {
54 'name': 'externalIP',
55 'value': f"$(ref.{context.env['name']}.networkInterfaces[0].accessConfigs[0].natIP)"
56 }]
57 }
Команды gcloud для управления
1# Создание развертывания
2gcloud deployment-manager deployments create my-deployment \
3 --config vm-config.yaml
4
5# Обновление развертывания
6gcloud deployment-manager deployments update my-deployment \
7 --config vm-config.yaml
8
9# Предварительный просмотр изменений
10gcloud deployment-manager deployments update my-deployment \
11 --config vm-config.yaml \
12 --preview
13
14# Применение предварительного просмотра
15gcloud deployment-manager deployments update my-deployment
16
17# Просмотр развертываний
18gcloud deployment-manager deployments list
19
20# Описание развертывания
21gcloud deployment-manager deployments describe my-deployment
22
23# Удаление развертывания
24gcloud deployment-manager deployments delete my-deployment
25
26# Просмотр ресурсов в развертывании
27gcloud deployment-manager resources list \
28 --deployment my-deployment
Комплексный пример с VPC
1# network-config.yaml
2imports:
3- path: network-template.jinja
4
5resources:
6- name: my-network
7 type: network-template.jinja
8 properties:
9 region: us-central1
10 subnetCidr: 10.0.1.0/24
11
12- name: web-servers
13 type: compute.v1.instanceGroupManager
14 properties:
15 zone: us-central1-a
16 targetSize: 3
17 baseInstanceName: web-server
18 instanceTemplate: $(ref.web-server-template.selfLink)
19
20- name: web-server-template
21 type: compute.v1.instanceTemplate
22 properties:
23 properties:
24 machineType: n1-standard-1
25 disks:
26 - deviceName: boot
27 type: PERSISTENT
28 boot: true
29 autoDelete: true
30 initializeParams:
31 sourceImage: projects/debian-cloud/global/images/family/debian-11
32 networkInterfaces:
33 - network: $(ref.my-network.selfLink)
34 subnetwork: $(ref.my-network.subnetworks[0])
35 tags:
36 items: ["web-server"]
37
38- name: load-balancer
39 type: compute.v1.globalForwardingRule
40 properties:
41 IPProtocol: TCP
42 portRange: 80
43 target: $(ref.web-server-backend.selfLink)
Когда использовать Deployment Manager
- Управление GCP инфраструктурой как кодом
- Автоматизация развертывания в Google Cloud
- Создание воспроизводимых сред разработки
- CI/CD пайплайны для GCP ресурсов
- Стандартизация архитектурных паттернов
- Управление сложными multi-tier приложениями
Преимущества Deployment Manager
- Нативная интеграция с GCP сервисами
- Поддержка YAML и Python шаблонов
- Автоматическое управление зависимостями
- Возможность предварительного просмотра
- Бесплатный сервис (платишь только за ресурсы)
- Интеграция с Cloud Build и другими сервисами
Ограничения Deployment Manager
- Работает только с GCP (vendor lock-in)
- Менее популярен по сравнению с Terraform
- Ограниченная поддержка некоторых новых GCP сервисов
- Сложность отладки Python шаблонов
- Отсутствие планирования изменений как в Terraform
Deployment Manager vs Terraform
- Провайдеры — Deployment Manager только GCP, Terraform multi-cloud
- Синтаксис — DM использует YAML/Python, Terraform HCL
- Планирование — Terraform plan более детальный
- Сообщество — у Terraform больше ресурсов и примеров
- State — DM управляет автоматически, Terraform требует state файлы
Рекомендации по внедрению
Для успешного внедрения Deployment Manager рекомендуется:
- Начать с простых YAML конфигураций
- Создавать переиспользуемые шаблоны
- Использовать preview mode перед применением изменений
- Версионировать конфигурации в системе контроля версий
- Документировать шаблоны и их параметры
- Рассмотреть Terraform для multi-cloud проектов
FAQ
Подходит ли Deployment Manager для продакшена?
Да, но Google рекомендует рассмотреть использование Terraform или других инструментов для новых проектов, так как развитие Deployment Manager замедлилось.
Можно ли мигрировать с Deployment Manager на Terraform?
Да, можно экспортировать существующие ресурсы и пересоздать их конфигурацию в Terraform, но это требует планирования и тестирования.
Какие требования к проекту GCP?
Необходимы права на создание и управление ресурсами в GCP проекте, а также включенный Deployment Manager API.