декабря 21, 2025
12 мин. чтения

Вопросы и ответы для Senior GCP Cloud Engineer

interview
career-advice
job-search
Вопросы и ответы для Senior GCP Cloud Engineer
Milad Bonakdar

Milad Bonakdar

Автор

Подготовьтесь к senior-собеседованию по GCP: архитектура, GKE, Cloud Run, IAM, затраты, BigQuery, надежность и безопасность.


Введение

На собеседовании Senior GCP Cloud Engineer обычно проверяют не знание списка сервисов, а способность обосновывать production-решения. Будьте готовы объяснить, когда выбирать GKE, Cloud Run, Cloud SQL, Spanner, Shared VPC, IAM-контроли и ограничения по затратам для конкретной нагрузки.

Используйте эти вопросы, чтобы тренировать ответы senior-уровня: начните с требования, обоснуйте выбор, назовите риски и объясните, как будете эксплуатировать решение в production.


Архитектура и проектирование

1. Разработайте высокодоступное приложение в GCP.

Ответ: Готовая к использованию архитектура с резервированием и масштабируемостью:

Loading diagram...

Ключевые компоненты:

# Создание управляемой группы экземпляров с автомасштабированием
gcloud compute instance-groups managed create my-mig \
  --base-instance-name=my-app \
  --template=my-template \
  --size=3 \
  --zone=us-central1-a

# Настройка автомасштабирования
gcloud compute instance-groups managed set-autoscaling my-mig \
  --max-num-replicas=10 \
  --min-num-replicas=3 \
  --target-cpu-utilization=0.7 \
  --cool-down-period=90

# Создание балансировщика нагрузки
gcloud compute backend-services create my-backend \
  --protocol=HTTP \
  --health-checks=my-health-check \
  --global

# Добавление группы экземпляров в бэкенд
gcloud compute backend-services add-backend my-backend \
  --instance-group=my-mig \
  --instance-group-zone=us-central1-a \
  --global

Принципы проектирования:

  • Развертывание в нескольких зонах
  • Автомасштабирование на основе метрик
  • Управляемые сервисы для баз данных
  • CDN для статического контента
  • Проверки работоспособности и мониторинг

Распространенность: Очень часто
Сложность: Сложно


Google Kubernetes Engine (GKE)

2. Как развертывать приложения и управлять ими в GKE?

Ответ: GKE — это управляемый сервис Kubernetes от Google.

Процесс развертывания:

# Создание кластера GKE
gcloud container clusters create my-cluster \
  --num-nodes=3 \
  --machine-type=e2-medium \
  --zone=us-central1-a \
  --enable-autoscaling \
  --min-nodes=3 \
  --max-nodes=10

# Получение учетных данных
gcloud container clusters get-credentials my-cluster \
  --zone=us-central1-a

# Развертывание приложения
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: gcr.io/my-project/myapp:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080
EOF

Возможности GKE, которые стоит упомянуть:

  • Региональные кластеры для доступности control plane и узлов
  • Cluster autoscaling вместе с Horizontal Pod Autoscaling
  • Workload Identity Federation for GKE вместо долгоживущих ключей сервисных аккаунтов
  • Binary Authorization и сканирование образов для контроля цепочки поставки
  • Cloud Logging, Cloud Monitoring, SLO и оповещения

Распространенность: Очень часто
Сложность: Сложно


Serverless и передовые сервисы

3. В каких случаях использовать Cloud Functions, а в каких Cloud Run?

Ответ: Выбор зависит от операционного контракта, который вы берете на себя. Сильный ответ сравнивает триггеры, упаковку, контроль runtime, масштабирование и сложность эксплуатации.

Cloud Functions:

  • Подходит для небольших обработчиков событий Pub/Sub, Cloud Storage, Eventarc или простых HTTP endpoint
  • Минимальная инфраструктурная поверхность
  • Удобно, когда команда хочет деплой на уровне функции без пользовательских контейнеров
  • Меньше контроля над runtime, чем у контейнерного сервиса

Cloud Run:

  • Подходит для контейнеризованных HTTP-сервисов, API, worker и событийных сервисов
  • Больше контроля над зависимостями, concurrency, CPU, запуском и разделением трафика
  • Масштабируется до нуля, но для чувствительных к задержке путей можно использовать минимальные инстансы
  • Часто лучше по умолчанию, если нужны переносимость, собственный runtime или ответственность на уровне сервиса
# Пример Cloud Function
def hello_pubsub(event, context):
    """Запускается сообщением Pub/Sub"""
    import base64
    
    if 'data' in event:
        message = base64.b64decode(event['data']).decode('utf-8')
        print(f'Получено сообщение: {message}')
        
        # Обработка сообщения
        process_data(message)
# Развертывание Cloud Function
gcloud functions deploy hello_pubsub \
  --runtime=python312 \
  --trigger-topic=my-topic \
  --entry-point=hello_pubsub

# Развертывание Cloud Run
gcloud run deploy myapp \
  --image=gcr.io/my-project/myapp:v1 \
  --region=us-central1 \
  --allow-unauthenticated

Распространенность: Часто
Сложность: Средне


Расширенные сетевые возможности

4. Объясните, что такое Shared VPC и когда его следует использовать.

Ответ: Shared VPC позволяет нескольким проектам совместно использовать общую сеть VPC.

Преимущества:

  • Централизованное администрирование сети
  • Совместное использование ресурсов между проектами
  • Упрощенный биллинг
  • Согласованные политики безопасности

Архитектура:

Loading diagram...
# Включение Shared VPC в хост-проекте
gcloud compute shared-vpc enable my-host-project

# Подключение сервисного проекта
gcloud compute shared-vpc associated-projects add my-service-project \
  --host-project=my-host-project

# Предоставление разрешений
gcloud projects add-iam-policy-binding my-host-project \
  --member=serviceAccount:[email protected] \
  --role=roles/compute.networkUser

Сценарии использования:

  • Крупные организации
  • Среды с несколькими командами
  • Централизованное управление сетью
  • Требования соответствия нормативным требованиям

Распространенность: Часто
Сложность: Средне-сложно


Оптимизация затрат

5. Как оптимизировать затраты GCP?

Ответ: Стратегии оптимизации затрат:

1. Правильный выбор размера:

# Использование Recommender API
gcloud recommender recommendations list \
  --project=my-project \
  --location=us-central1 \
  --recommender=google.compute.instance.MachineTypeRecommender

2. Скидки за гарантированное использование (Committed Use Discounts):

  • Обязательства на 1 или 3 года для предсказуемых нагрузок
  • Гибкие обязательства для паттернов расходов; ресурсные обязательства для конкретного compute-использования
  • Совмещайте с правильным sizing, чтобы не закреплять лишние расходы

3. Spot VMs:

# Создание Spot VM для прерываемой работы
gcloud compute instances create my-spot-vm \
  --provisioning-model=SPOT \
  --machine-type=e2-medium

4. Управление жизненным циклом хранилища (Storage Lifecycle):

# Установка политики жизненного цикла
gsutil lifecycle set lifecycle.json gs://my-bucket

# lifecycle.json
{
  "lifecycle": {
    "rule": [
      {
        "action": {"type": "SetStorageClass", "storageClass": "NEARLINE"},
        "condition": {"age": 30}
      },
      {
        "action": {"type": "Delete"},
        "condition": {"age": 365}
      }
    ]
  }
}

5. Мониторинг:

  • Отчеты Cloud Billing
  • Оповещения о бюджете
  • Разбивка затрат по сервисам/проектам

Распространенность: Очень часто
Сложность: Средне


Безопасность

6. Как реализовать лучшие практики безопасности в GCP?

Ответ: Используйте многоуровневую модель: сначала идентичность, затем private networking там, где оно снижает экспозицию, шифрование чувствительных данных и постоянное обнаружение через логи и Security Command Center.

1. Лучшие практики IAM:

# Использование сервисных аккаунтов с минимальными разрешениями
gcloud iam service-accounts create my-app-sa \
  --display-name="My App Service Account"

# Предоставление определенной роли
gcloud projects add-iam-policy-binding my-project \
  --member=serviceAccount:[email protected] \
  --role=roles/storage.objectViewer \
  --condition='expression=resource.name.startsWith("projects/_/buckets/my-bucket"),title=bucket-access'

На собеседовании скажите, что избегаете базовых ролей в production, разделяете человеческие и workload-идентичности, предпочитаете краткоживущие учетные данные и Workload Identity Federation, а также регулярно проверяете IAM bindings.

2. Безопасность VPC:

  • Private Google Access
  • VPC Service Controls
  • Cloud Armor для защиты от DDoS

3. Шифрование данных:

# Ключи шифрования, управляемые клиентом
gcloud kms keyrings create my-keyring \
  --location=global

gcloud kms keys create my-key \
  --location=global \
  --keyring=my-keyring \
  --purpose=encryption

# Использование с Cloud Storage
gsutil -o 'GSUtil:encryption_key=...' cp file.txt gs://my-bucket/

4. Мониторинг:

  • Cloud Audit Logs
  • Security Command Center
  • Cloud Logging и Monitoring

Распространенность: Очень часто
Сложность: Сложно


Анализ данных

7. Как спроектировать и оптимизировать BigQuery для крупномасштабной аналитики?

Ответ: BigQuery — это бессерверное, масштабируемое хранилище данных от Google.

Архитектура:

  • Столбцовое хранение
  • Автоматическое масштабирование
  • SQL-интерфейс
  • Масштаб петабайт
  • Оплата за запрос

Проектирование таблиц:

-- Создание партиционированной таблицы
CREATE TABLE mydataset.events
(
  event_id STRING,
  user_id STRING,
  event_type STRING,
  event_data JSON,
  event_timestamp TIMESTAMP
)
PARTITION BY DATE(event_timestamp)
CLUSTER BY user_id, event_type
OPTIONS(
  partition_expiration_days=90,
  require_partition_filter=true
);

-- Создание материализованного представления
CREATE MATERIALIZED VIEW mydataset.daily_summary
AS
SELECT
  DATE(event_timestamp) as event_date,
  event_type,
  COUNT(*) as event_count,
  COUNT(DISTINCT user_id) as unique_users
FROM mydataset.events
GROUP BY event_date, event_type;

Стратегии оптимизации:

1. Партиционирование:

-- Партиционирование по времени
CREATE TABLE mydataset.sales
PARTITION BY DATE(sale_date)
AS SELECT * FROM source_table;

-- Партиционирование по диапазону целых чисел
CREATE TABLE mydataset.user_data
PARTITION BY RANGE_BUCKET(user_id, GENERATE_ARRAY(0, 1000000, 10000))
AS SELECT * FROM source_table;

-- Запрос с фильтром партиций (экономичный)
SELECT *
FROM mydataset.events
WHERE DATE(event_timestamp) BETWEEN '2024-01-01' AND '2024-01-31'
  AND event_type = 'purchase';

2. Кластеризация:

-- Кластеризация по часто фильтруемым столбцам
CREATE TABLE mydataset.logs
PARTITION BY DATE(log_timestamp)
CLUSTER BY user_id, region, status
AS SELECT * FROM source_logs;

-- Запросы, использующие кластеризацию
SELECT *
FROM mydataset.logs
WHERE DATE(log_timestamp) = '2024-11-26'
  AND user_id = '12345'
  AND region = 'us-east1';

3. Оптимизация запросов:

-- Плохо: SELECT * (сканирует все столбцы)
SELECT * FROM mydataset.large_table;

-- Хорошо: SELECT конкретные столбцы
SELECT user_id, event_type, event_timestamp
FROM mydataset.large_table;

-- Использование приближенного агрегирования для больших наборов данных
SELECT APPROX_COUNT_DISTINCT(user_id) as unique_users
FROM mydataset.events;

-- Избегайте самосоединений, используйте оконные функции
SELECT
  user_id,
  event_timestamp,
  LAG(event_timestamp) OVER (PARTITION BY user_id ORDER BY event_timestamp) as prev_event
FROM mydataset.events;

4. Контроль затрат:

# Установка максимального количества оплачиваемых байтов
bq query \
  --maximum_bytes_billed=1000000000 \
  --use_legacy_sql=false \
  'SELECT COUNT(*) FROM mydataset.large_table'

# Сухой прогон для оценки затрат
bq query \
  --dry_run \
  --use_legacy_sql=false \
  'SELECT * FROM mydataset.large_table'

Загрузка данных:

# Загрузка из Cloud Storage
bq load \
  --source_format=NEWLINE_DELIMITED_JSON \
  --autodetect \
  mydataset.mytable \
  gs://mybucket/data/*.json

# Загрузка со схемой
bq load \
  --source_format=CSV \
  --skip_leading_rows=1 \
  mydataset.mytable \
  gs://mybucket/data.csv \
  schema.json

# Потоковая вставка (в реальном времени)
from google.cloud import bigquery

client = bigquery.Client()
table_id = "my-project.mydataset.mytable"

rows_to_insert = [
    {"user_id": "123", "event_type": "click", "timestamp": "2024-11-26T10:00:00"},
    {"user_id": "456", "event_type": "purchase", "timestamp": "2024-11-26T10:05:00"},
]

errors = client.insert_rows_json(table_id, rows_to_insert)
if errors:
    print(f"Errors: {errors}")

Лучшие практики:

  • Всегда используйте фильтры партиций
  • Кластеризуйте по столбцам с высокой кардинальностью
  • Избегайте SELECT *
  • Используйте приблизительные функции для больших наборов данных
  • Отслеживайте затраты на запросы
  • Используйте материализованные представления для повторяющихся запросов
  • Денормализуйте данные при необходимости

Распространенность: Очень часто
Сложность: Сложно


Передовые сервисы баз данных

8. В каких случаях использовать Cloud Spanner, а в каких Cloud SQL?

Ответ: Выбор зависит от масштаба, консистентности и географических требований:

Cloud Spanner:

  • Глобально распределенная реляционная база данных
  • Горизонтальное масштабирование (неограниченное)
  • Строгая согласованность между регионами
  • Доступность 99,999% (SLA)
  • Более высокая стоимость

Cloud SQL:

  • Региональная управляемая база данных (MySQL, PostgreSQL, SQL Server)
  • Вертикальное масштабирование (ограниченное)
  • Один регион (с репликами для чтения)
  • Доступность 99,95% (SLA)
  • Более низкая стоимость

Сравнение:

FeatureCloud SpannerCloud SQL
МасштабПетабайтыТерабайты
СогласованностьГлобальная строгаяРегиональная
Доступность99.999%99.95%
ЗадержкаОднозначные мс глобальноНизкая (региональная)
СтоимостьВысокаяУмеренная
Сценарий использованияГлобальные приложения, финансовые системыРегиональные приложения, традиционные нагрузки

Пример Cloud Spanner:

-- Создание экземпляра Spanner
gcloud spanner instances create my-instance \
  --config=regional-us-central1 \
  --nodes=3 \
  --description="Production instance"

-- Создание базы данных
gcloud spanner databases create my-database \
  --instance=my-instance \
  --ddl='CREATE TABLE Users (
    UserId INT64 NOT NULL,
    Username STRING(100),
    Email STRING(255),
    CreatedAt TIMESTAMP
  ) PRIMARY KEY (UserId)'

-- Вставка данных
gcloud spanner databases execute-sql my-database \
  --instance=my-instance \
  --sql="INSERT INTO Users (UserId, Username, Email, CreatedAt)
        VALUES (1, 'alice', '[email protected]', CURRENT_TIMESTAMP())"

-- Запрос со строгой согласованностью
gcloud spanner databases execute-sql my-database \
  --instance=my-instance \
  --sql="SELECT * FROM Users WHERE UserId = 1"

Python Client:

from google.cloud import spanner

# Создание клиента
spanner_client = spanner.Client()
instance = spanner_client.instance('my-instance')
database = instance.database('my-database')

# Чтение со строгой согласованностью
def read_user(user_id):
    with database.snapshot() as snapshot:
        results = snapshot.execute_sql(
            "SELECT UserId, Username, Email FROM Users WHERE UserId = @user_id",
            params={"user_id": user_id},
            param_types={"user_id": spanner.param_types.INT64}
        )
        for row in results:
            print(f"User: {row[0]}, {row[1]}, {row[2]}")

# Запись с транзакцией
def create_user(user_id, username, email):
    def insert_user(transaction):
        transaction.execute_update(
            "INSERT INTO Users (UserId, Username, Email, CreatedAt) "
            "VALUES (@user_id, @username, @email, CURRENT_TIMESTAMP())",
            params={
                "user_id": user_id,
                "username": username,
                "email": email
            },
            param_types={
                "user_id": spanner.param_types.INT64,
                "username": spanner.param_types.STRING,
                "email": spanner.param_types.STRING
            }
        )
    
    database.run_in_transaction(insert_user)

Пример Cloud SQL:

# Создание экземпляра Cloud SQL
gcloud sql instances create my-instance \
  --database-version=POSTGRES_14 \
  --tier=db-n1-standard-2 \
  --region=us-central1 \
  --root-password=mypassword

# Создание базы данных
gcloud sql databases create mydatabase \
  --instance=my-instance

# Подключение
gcloud sql connect my-instance --user=postgres

# Создание реплики для чтения
gcloud sql instances create my-replica \
  --master-instance-name=my-instance \
  --tier=db-n1-standard-1 \
  --region=us-east1

Когда использовать:

Используйте Cloud Spanner, когда:

  • Необходима глобальная дистрибуция
  • Требуется строгая согласованность между регионами
  • Масштабирование за пределы одного региона
  • Финансовые транзакции
  • Критически важные приложения
  • Бюджет позволяет более высокие затраты

Используйте Cloud SQL, когда:

  • Региональное приложение
  • Знакомы с MySQL/PostgreSQL
  • Чувствительны к стоимости
  • Умеренный масштаб (< 10 ТБ)
  • Существующие SQL-нагрузки
  • Не требуется глобальная согласованность

Распространенность: Часто
Сложность: Средне-сложно


Безопасность и соответствие требованиям

9. Как реализовать VPC Service Controls?

Ответ: VPC Service Controls создает периметры безопасности вокруг ресурсов GCP для предотвращения утечки данных.

Ключевые понятия:

  • Service Perimeter: Граница вокруг ресурсов
  • Access Levels: Условия доступа
  • Ingress/Egress Rules: Контроль потока данных

Архитектура:

Loading diagram...

Настройка:

# Создание политики доступа
gcloud access-context-manager policies create \
  --organization=123456789 \
  --title="Production Policy"

# Создание уровня доступа
gcloud access-context-manager levels create CorpNetwork \
  --policy=accessPolicies/123456789 \
  --title="Corporate Network" \
  --basic-level-spec=access_level.yaml

# access_level.yaml
conditions:
  - ipSubnetworks:
    - 203.0.113.0/24  # Корпоративный IP-диапазон
  - members:
    - user:[email protected]

Создание периметра сервиса:

# Создание периметра
gcloud access-context-manager perimeters create production_perimeter \
  --policy=accessPolicies/123456789 \
  --title="Production Perimeter" \
  --resources=projects/123456789012 \
  --restricted-services=storage.googleapis.com,bigquery.googleapis.com \
  --access-levels=accessPolicies/123456789/accessLevels/CorpNetwork

# Добавление проекта в периметр
gcloud access-context-manager perimeters update production_perimeter \
  --policy=accessPolicies/123456789 \
  --add-resources=projects/987654321098

Правила Ingress/Egress:

# ingress_rule.yaml
ingressPolicies:
  - ingressFrom:
      sources:
        - accessLevel: accessPolicies/123456789/accessLevels/CorpNetwork
      identities:
        - serviceAccount:[email protected]
    ingressTo:
      resources:
        - '*'
      operations:
        - serviceName: storage.googleapis.com
          methodSelectors:
            - method: '*'

# Применение правила ingress
gcloud access-context-manager perimeters update production_perimeter \
  --policy=accessPolicies/123456789 \
  --set-ingress-policies=ingress_rule.yaml

Правила Egress:

# egress_rule.yaml
egressPolicies:
  - egressFrom:
      identities:
        - serviceAccount:[email protected]
    egressTo:
      resources:
        - projects/external-project-id
      operations:
        - serviceName: storage.googleapis.com
          methodSelectors:
            - method: 'google.storage.objects.create'

# Применение правила egress
gcloud access-context-manager perimeters update production_perimeter \
  --policy=accessPolicies/123456789 \
  --set-egress-policies=egress_rule.yaml

Поддерживаемые сервисы:

  • Cloud Storage
  • BigQuery
  • Cloud SQL
  • Compute Engine
  • GKE
  • Cloud Functions
  • И многие другие

Тестирование:

# Тестирование доступа изнутри периметра
from google.cloud import storage

def test_access():
    try:
        client = storage.Client()
        bucket = client.bucket('my-protected-bucket')
        blobs = list(bucket.list_blobs())
        print(f"Access granted: {len(blobs)} objects")
    except Exception as e:
        print(f"Access denied: {e}")

# Это пройдет успешно из авторизованной сети
# Это не удастся из неавторизованной сети
test_access()

Мониторинг:

# Просмотр логов VPC SC
gcloud logging read \
  'protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"' \
  --limit=50 \
  --format=json

Сценарии использования:

  • Предотвращение утечки данных
  • Требования соответствия нормативным требованиям (HIPAA, PCI-DSS)
  • Защита конфиденциальных данных
  • Изоляция производственных сред
  • Безопасность для нескольких арендаторов

Лучшие практики:

  • Начните с режима dry-run
  • Тщательно протестируйте перед применением
  • Используйте уровни доступа для точного контроля
  • Отслеживайте логи VPC SC
  • Документируйте границы периметра
  • Регулярные проверки доступа

Распространенность: Редко
Сложность: Сложно


Заключение

Собеседования для старших инженеров GCP Cloud требуют глубоких технических знаний и практического опыта. Сосредоточьтесь на:

  1. Архитектура: Высокая доступность, масштабируемость, аварийное восстановление
  2. GKE: Оркестровка контейнеров, стратегии развертывания
  3. Serverless: Варианты использования Cloud Functions, Cloud Run
  4. Сеть: Shared VPC, гибридное подключение
  5. Оптимизация затрат: Правильный выбор размера, гарантированное использование, политики жизненного цикла
  6. Безопасность: IAM, шифрование, элементы управления VPC

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

Newsletter subscription

Еженедельные советы по карьере, которые действительно работают

Получайте последние идеи прямо на вашу почту

Выделитесь перед рекрутерами и получите работу мечты

Присоединяйтесь к тысячам тех, кто изменил свою карьеру с помощью резюме на базе ИИ, которые проходят ATS и впечатляют менеджеров по найму.

Начать создание

Поделиться этим постом

Сократите Время Написания Резюме на 90%

Средний соискатель тратит более 3 часов на форматирование резюме. Наш ИИ делает это менее чем за 15 минут, ускоряя переход к этапу подачи заявки в 12 раз.