Что такое 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.