1. Введение
В рамках этого практического занятия вы создадите базовое демонстрационное приложение, иллюстрирующее интеграцию различных сервисов Google Cloud для сервиса, расположенного в проекте с ограничениями по соблюдению нормативных требований. В этом проекте используются следующие средства обеспечения безопасности:
- Границы данных помогают обеспечить контроль в регулируемых средах.
- Ключи шифрования, управляемые клиентом ( CMEK ), для защиты данных в состоянии покоя;
- Экранированные узлы GKE и конфиденциальные узлы GKE помогают обеспечить безопасность данных во время обработки;
- Идентификатор рабочей нагрузки для GKE используется для управления доступом к Vertex AI, которая применяет Gemini для задач обработки изображений.
- Генеративный ИИ на Vertex A для управления обнаружением защитных касок в видеопотоке
Этот практический семинар предназначен для разработчиков всех уровней, включая начинающих. Вы будете использовать интерфейс командной строки Google Cloud Shell и код на Python. Вам не обязательно быть экспертом в Python, но базовое понимание того, как читать код, поможет вам усвоить основные концепции.
Примечание: Это упрощенная демонстрационная версия, а не готовое к использованию приложение. В реальных условиях следует принять дополнительные меры предосторожности, такие как аутентифицированный и защищенный внешний доступ к этому сервису.
2. Прежде чем начать
Настройка проекта
../shared/_project-setup.md
Запустить Cloud Shell
Cloud Shell — это среда командной строки, работающая в Google Cloud и поставляемая с предустановленными необходимыми инструментами.
- В верхней части консоли Google Cloud нажмите кнопку «Активировать Cloud Shell» :

- После подключения к Cloud Shell выполните следующую команду для проверки аутентификации в Cloud Shell:
gcloud auth list
- Выполните следующую команду, чтобы убедиться, что ваш проект настроен для использования с gcloud:
gcloud config get project
- Убедитесь, что проект соответствует ожиданиям, а затем выполните команду ниже, чтобы установить идентификатор проекта :
export PROJECT_ID=$(gcloud config get project)
Необходимые разрешения IAM
Для выполнения этого практического задания вам потребуется учетная запись со следующими ролями IAM. Эти разрешения необходимы для создания требуемых ресурсов Google Cloud (проектов, папок, кластеров GKE, ключей KMS, учетных записей служб и т. д.) и настройки гарантированной рабочей нагрузки.
На уровне организации:
- roles/assuredworkloads.admin (Администратор гарантированных рабочих нагрузок): Создание и управление самим ресурсом гарантированных рабочих нагрузок, обеспечение соответствия конфигурации требованиям.
На уровне платежного аккаунта (в вашем платежном аккаунте):
- roles/billing.accountUser (Пользователь платежного аккаунта): Для привязки указанного платежного аккаунта.
Настройка переменных Codelab
Для создания необходимой инфраструктуры необходимо указать следующие переменные среды:
# The ID of the Billing Account in the format (XXXXXX-XXXXXX-XXXXXX).
# This value will be used to attach in the projects created using Assured Workloads
export BILLING_ACCOUNT=
# The ID of a Google Cloud Platform organization
# Run `gcloud organizations list` to check all your available organizations
export GCP_ORGANIZATION=
# The numeric ID of a folder where the Assured Workloads will create the resources.
export FOLDER_ID=
# Region where the application will be deployed.
# Since you are using Assured Workloads, you MUST use one of the valid locations as described here: <https://docs.cloud.google.com/assured-workloads/docs/locations>
export REGION="us-central1"
# The ID of an existing Google Cloud project to be used for API quota and billing purposes.
# This project will only be used to enable the Assured Workloads API and create an Assured Workload.
export QUOTA_PROJECT_ID=
# Random suffix used to avoid naming collisions when creating the GCP projects.
export RANDOM_SUFFIX=$(cat /dev/urandom | tr -dc 'a-z0-9' | head -c 5 ; echo)
# The ID of the projects that will be created using Assured Workloads.
# You can modify this value if you want a custom id.
export PROJECT_ID="il5-gemini-vision-aw-${RANDOM_SUFFIX}"
export KMS_PROJECT_ID="il5-gemini-vision-kms-${RANDOM_SUFFIX}"
3. Создание основы для гарантированной рабочей нагрузки
Теперь вы можете заложить основу для своего приложения в регулируемой среде. Используйте Assured Workloads , чтобы обеспечить соблюдение требований соответствия, создав контролируемую среду для ваших ресурсов.
Настройте свой проект квот
Включите API гарантированных рабочих нагрузок в вашем проекте квот. Этот API необходим для создания и управления гарантированными рабочими нагрузками.
gcloud services enable assuredworkloads.googleapis.com \
--project="${QUOTA_PROJECT_ID}"
Создайте среду гарантированной рабочей нагрузки.
Следующая команда создаст защищенную «зону загрузки» для вашей демонстрации. Она создаст два новых проекта Google Cloud в указанной вами папке и учетной записи для выставления счетов.
- Один проект размещает ваш кластер GKE и приложение.
- Другой проект управляет вашими ключами шифрования, управляемыми клиентом (CMEK).
Система автоматически применяет указанные меры контроля соответствия стандарту IL5 к обоим проектам с момента их создания.
Выполните следующие действия для создания рабочей среды.
export ASSURED_WORKLOAD_ID=$(gcloud assured workloads create \
--project="${QUOTA_PROJECT_ID}" \
--display-name="DoD IL5 Gemini Vision Demo" \
--compliance-regime="IL5" \
--billing-account="billingAccounts/${BILLING_ACCOUNT}" \
--location="${REGION}" \
--organization="${GCP_ORGANIZATION}" \
--provisioned-resources-parent="folders/${FOLDER_ID}" \
--resource-settings="consumer-project-id=${PROJECT_ID},consumer-project-name=DoD IL5 Workloads,encryption-keys-project-id=${KMS_PROJECT_ID},encryption-keys-project-name=DoD IL5 KMS" \
--labels="codelab=gemini-vision-demo" \
--format="value(name)")
echo "Assured Workload created: ${ASSURED_WORKLOAD_ID}"
export WORKLOAD_FOLDER_ID=$(gcloud assured workloads describe ${ASSURED_WORKLOAD_ID} \
--location="${REGION}" \
--project="${QUOTA_PROJECT_ID}" \
--format="json" | grep -B 1 "CONSUMER_FOLDER" | grep -oE "[0-9]{10,}")
echo "Assured Workload folder created: ${WORKLOAD_FOLDER_ID}"
gcloud projects create "${PROJECT_ID}" \
--folder="${WORKLOAD_FOLDER_ID}" \
--name="DoD IL5 Workloads"
gcloud billing projects link "${PROJECT_ID}" \
--billing-account="${BILLING_ACCOUNT}"
export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" --format="value(projectNumber)")
Включение необходимых API Google Cloud
Перед сборкой включите необходимые API для требуемых сервисов.
Приведенная ниже команда активирует все необходимые сервисы для этого Codelab в вашем основном проекте.
gcloud services enable \
aiplatform.googleapis.com \
artifactregistry.googleapis.com \
cloudkms.googleapis.com \
compute.googleapis.com \
container.googleapis.com \
iam.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com \
--project="${PROJECT_ID}"
4. Настройка инфраструктуры GKE
Создайте базовую инфраструктуру, которая будет поддерживать ваш кластер GKE. Это включает в себя настройку выделенной сети для вашего кластера и создание собственных ключей шифрования для защиты данных на ваших узлах.
Настройка сети VPC
Создайте собственную виртуальную частную сеть (VPC) и подсеть. Такой подход обеспечивает полный контроль над диапазоном IP-адресов и гарантирует изоляцию кластера, как и предполагалось.
Выполните следующие команды, чтобы создать сеть VPC и подсеть в указанном регионе.
export GKE_NETWORK_NAME="il5-gke-network"
export GKE_SUBNETWORK_NAME="il5-gke-subnet"
gcloud compute networks create "${GKE_NETWORK_NAME}" \
--description="VPC network for GKE cluster in DoD IL5 Assured Workload" \
--subnet-mode="custom" \
--project="${PROJECT_ID}"
gcloud compute networks subnets create "${GKE_SUBNETWORK_NAME}" \
--network="${GKE_NETWORK_NAME}" \
--range="10.10.0.0/20" \
--region="${REGION}" \
--description="Subnet for GKE cluster nodes in DoD IL5 Assured Workload" \
--project="${PROJECT_ID}"
Настройка шифрования с помощью Cloud KMS
Для соответствия строгим требованиям к защите данных в состоянии покоя используйте ключи шифрования, управляемые клиентом (CMEK). Это дает вам прямой контроль над ключами, используемыми для шифрования загрузочных дисков ваших узлов GKE.
export KMS_KEYRING_NAME="il5_gke_key_ring"
export KMS_KEY_NAME="il5_gke_key"
gcloud kms keyrings create "${KMS_KEYRING_NAME}" \
--location="$REGION" \
--project="${KMS_PROJECT_ID}"
gcloud kms keys create "${KMS_KEY_NAME}" \
--keyring="${KMS_KEYRING_NAME}" \
--location="${REGION}" \
--purpose="encryption" \
--project="${KMS_PROJECT_ID}"
Поскольку ключ шифрования находится в отдельном проекте KMS, отличном от проекта службы, которой он необходим, агенту службы Google Compute Engine в проекте рабочей нагрузки требуется доступ к этому ключу.
Необходимо явно предоставить агенту службы GCE из проекта рабочей нагрузки разрешение на использование этого ключа. Приведенная ниже команда добавляет привязку политики IAM к ключу, предоставляя агенту службы необходимую роль.
gcloud kms keys add-iam-policy-binding "${KMS_KEY_NAME}" \
--location="${REGION}" \
--keyring="${KMS_KEYRING_NAME}" \
--member="serviceAccount:service-${PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com" \
--role="roles/cloudkms.cryptoKeyEncrypterDecrypter" \
--project="${KMS_PROJECT_ID}"
Настройка учетной записи службы узла GKE
export GKE_NODE_SA=gke-node-sa
gcloud iam service-accounts create "${GKE_NODE_SA}" \
--display-name="GKE Node Service Account" \
--project="${PROJECT_ID}"
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member="serviceAccount:${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/logging.logWriter"
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member="serviceAccount:${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/monitoring.metricWriter"
5. Создание и настройка кластера GKE
Теперь вы можете создать кластер GKE. Следующая команда инициализирует кластер GKE с включенными несколькими функциями безопасности.
Этот процесс занимает несколько минут, поскольку Google Cloud выполняет подготовку узлов и плоскости управления.
export GKE_CLUSTER=ppe-app
gcloud beta container clusters create "${GKE_CLUSTER}" \
--project="$PROJECT_ID" \
--region="$REGION" \
--service-account="${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--release-channel="regular" \
--machine-type="n2d-standard-4" \
--image-type="COS_CONTAINERD" \
--disk-type="pd-ssd" \
--disk-size="50" \
--boot-disk-kms-key="projects/${KMS_PROJECT_ID}/locations/${REGION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}" \
--metadata disable-legacy-endpoints=true \
--num-nodes="1" \
--network="projects/${PROJECT_ID}/global/networks/${GKE_NETWORK_NAME}" \
--subnetwork="projects/${PROJECT_ID}/regions/${REGION}/subnetworks/${GKE_SUBNETWORK_NAME}" \
--security-posture="standard" \
--workload-vulnerability-scanning="disabled" \
--workload-pool="${PROJECT_ID}.svc.id.goog" \
--workload-metadata=GKE_METADATA \
--addons="HorizontalPodAutoscaling,HttpLoadBalancing,NodeLocalDNS,GcePersistentDiskCsiDriver" \
--max-surge-upgrade=1 \
--max-unavailable-upgrade=0 \
--binauthz-evaluation-mode="DISABLED" \
--no-enable-basic-auth \
--enable-autoupgrade \
--enable-autorepair \
--enable-confidential-nodes \
--confidential-node-type=sev \
--enable-ip-access \
--enable-ip-alias \
--enable-managed-prometheus \
--enable-dns-access \
--enable-shielded-nodes \
--shielded-integrity-monitoring \
--shielded-secure-boot
Подключение к новому кластеру
Для взаимодействия с новым кластером настройте локальный инструмент командной строки kubectl.
Эта команда получает учетные данные и конечную точку кластера, а также автоматически настраивает ваш локальный файл kubeconfig. После ее выполнения все команды kubectl будут направлены на ваш новый кластер GKE.
gcloud container clusters get-credentials "${GKE_CLUSTER}" \
--region="${REGION}" \
--project="${PROJECT_ID}" \
--dns-endpoint
6. Настройка идентификации приложения
Для подключения учетной записи службы Kubernetes к учетной записи службы Google Cloud IAM необходимо настроить Workload Identity.
Создание служебных учетных записей
Создайте выделенную учетную запись службы Kubernetes (KSA) внутри вашего кластера.
export GKE_NAMESPACE=default
export GKE_SA=ppe-sa
kubectl create sa "${GKE_SA}" --namespace="${GKE_NAMESPACE}"
Далее вашему приложению потребуется идентификация в Google Cloud. Создайте для приложения учетную запись службы Google Cloud IAM. После создания учетной записи службы предоставьте ей необходимые роли.
# Create GCP service account
gcloud iam service-accounts create "${GKE_SA}" \
--project="${PROJECT_ID}"
# Grant necessary roles
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member="serviceAccount:${GKE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
Разрешение учетной записи службы Kubernetes имитировать учетную запись IAM.
После создания обеих учетных записей служб последним шагом является установление связи между ними. Этот процесс состоит из двух этапов. Сначала добавьте политику IAM в свою учетную запись службы Google Cloud.
# Allow the Kubernetes service account to act as GCP service account by using Workload Identity
gcloud iam service-accounts add-iam-policy-binding "${GKE_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--project="${PROJECT_ID}" \
--role="roles/iam.workloadIdentityUser" \
--member="serviceAccount:${PROJECT_ID}.svc.id.goog[${GKE_NAMESPACE}/${GKE_SA}]"
Во-вторых, добавьте примечание к вашей учетной записи службы Kubernetes.
kubectl annotate --namespace="${GKE_NAMESPACE}" serviceaccount "$GKE_SA" \
iam.gke.io/gcp-service-account="${GKE_SA}@${PROJECT_ID}.iam.gserviceaccount.com"
После завершения этих действий любой под, работающий в вашем кластере с учетной записью службы Kubernetes, теперь может получить доступ к API Vertex.
Примечание: Для упрощения настройки можно отключить имитацию учетной записи службы. Подробности и ограничения см. здесь .
7. Разработка и развертывание приложения
Пришло время упаковать ваше приложение, сохранить его и развернуть в кластере GKE.
Создание репозитория реестра артефактов.
Прежде чем запустить приложение, упакуйте его в контейнер Docker и сохраните в репозитории Artifact Registry. Используйте приведенную ниже команду для создания этого репозитория.
export REPOSITORY_ID=ppe-repo
gcloud artifacts repositories create "${REPOSITORY_ID}" \
--repository-format=docker \
--location="${REGION}" \
--project="${PROJECT_ID}" \
--description="Regional Docker repo for PPE App"
Необходимо явно предоставить учетной записи службы, используемой узлами GKE, возможность чтения из вашего нового репозитория.
gcloud artifacts repositories add-iam-policy-binding "${REPOSITORY_ID}" \
--location="${REGION}" \
--role="roles/artifactregistry.reader" \
--project="${PROJECT_ID}" \
--member="serviceAccount:${GKE_NODE_SA}@${PROJECT_ID}.iam.gserviceaccount.com"
Сборка и загрузка образа Docker
Соберите и загрузите образ Docker в репозиторий. Сначала клонируйте исходный код и соберите образ контейнера. Затем пометьте его полным путем к Artifact Registry и загрузите в ранее созданный репозиторий.
git clone https://github.com/GoogleCloudPlatform/next-26-sessions.git
cd BRK3-034-workplace-safety
cd ppe
export IMAGE_TAG="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_ID}/ppe-app:v15"
docker build -t "${IMAGE_TAG}" .
docker push "${IMAGE_TAG}"
Развертывание в GKE
После того, как образ контейнера станет доступен в реестре артефактов, последним шагом будет указание GKE загрузить и запустить его. Это достигается путем определения ресурсов вашего приложения в файле манифеста Kubernetes и его применения к кластеру. Эта команда создает объекты Deployment и Service, определенные в файле.
export GKE_DEPLOY=ppe-detector
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${GKE_DEPLOY}
spec:
replicas: 2
selector:
matchLabels:
app: ${GKE_DEPLOY}
template:
metadata:
labels:
app: ${GKE_DEPLOY}
spec:
serviceAccountName: ${GKE_SA}
containers:
- name: ${GKE_DEPLOY}
image: ${IMAGE_TAG}
env:
- name: PROJECT_ID
value: ${PROJECT_ID}
- name: LOCATION
value: ${REGION}
ports:
- containerPort: 8080
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
---
apiVersion: v1
kind: Service
metadata:
name: ${GKE_DEPLOY}
spec:
type: LoadBalancer
selector:
app: ${GKE_DEPLOY}
ports:
- protocol: TCP
port: 80
targetPort: 8080
EOF
8. Тестирование приложения
Последний шаг — это доступ к демонстрационному приложению и его тестирование. Это включает в себя получение внешнего IP-адреса, назначенного сервису, и взаимодействие с ним через простой интерфейс.
Получение внешнего IP-адреса сервиса.
Получите внешний IP-адрес доступного сервиса (на инициализацию уходит около 30 секунд).
export IP_ADDRESS=$(kubectl get service "${GKE_DEPLOY}" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $IP_ADDRESS
Запуск фронтенда локально
Для этой демонстрации используется простой HTML/JavaScript-интерфейс, не входящий в состав развертывания GKE. Он предназначен для работы на вашем локальном компьютере.
В рабочем приложении интерфейс пользователя должен обслуживаться из GCP. На локальном компьютере:
# Update the index.html file with the server IP address
cd frontend
# For Linux
sed -i "s#\(const BACKEND_URL = \"http://\)[^/]\+\(\/analyze\";\)#\1${IP_ADDRESS}\2#g" "index.html"
# For MacOS
#sed -i '' "s#\(const BACKEND_URL = #\"http://\)[^/]*\(\/analyze\";\)#\1${IP_ADDRESS}\2#g" "index.html"
python3 -m http.server 8001
Откройте http://localhost:8001/index.html в Chrome.
9. Уборка
Во избежание дальнейших списаний средств удалите ресурсы, созданные в этом практическом задании.
Уничтожение кластера GKE
Чтобы удалить всё приложение целиком, достаточно удалить кластер GKE. Для этого выполните следующую команду:
gcloud container clusters delete "${GKE_CLUSTER}" \
--region="$REGION" \
--project="${PROJECT_ID}"
Удаление гарантированных рабочих нагрузок
Выполните следующие команды, чтобы удалить все ресурсы, связанные с гарантированной рабочей нагрузкой.
# Workload project deletion
gcloud billing projects unlink "${PROJECT_ID}"
gcloud projects delete "${PROJECT_ID}"
# KMS project deletion
gcloud billing projects unlink "${KMS_PROJECT_ID}"
gcloud projects delete "${KMS_PROJECT_ID}"
# Assured Workload folder deletion
gcloud resource-manager folders delete ${WORKLOAD_FOLDER_ID} --quiet
# Assured Workload deletion
gcloud assured workloads delete "${ASSURED_WORKLOAD_ID}" \
--location="${REGION}" \
--organization="${GCP_ORGANIZATION}" \
--project="${QUOTA_PROJECT_ID}"
10. Поздравляем!
Миссия выполнена! Вы успешно разработали систему обнаружения нарушений техники безопасности на рабочем месте для регулируемых отраслей, которая использует Gemini для обнаружения защитных касок.
Чего вы достигли:
- Защита данных и конфиденциальность: Вы создали конфиденциальный узел GKE с помощью CMEK.
- Границы данных: Вы включили средства контроля соответствия платформы требованиям регулируемой среды.