1. Giriş
Bu Codelab'de, uygunluk kısıtlamaları olan bir projedeki hizmet için çeşitli Google Cloud hizmetlerinin nasıl entegre edileceğini gösteren temel bir gösterim uygulaması oluşturacaksınız. Bu proje aşağıdaki güvenlik özelliklerini kullanır:
- Düzenlemeye tabi ortamlar için kontrolleri ele almaya yardımcı olan Veri Sınırları
- Etkin olmayan verileri korumak için müşteri tarafından yönetilen şifreleme anahtarları ( CMEK),
- İşleme sırasında verilerin güvenliğini sağlamaya yardımcı olmak için GKE Korumalı Düğümleri ve GKE Gizli Düğümleri
- Görüntü işleme görevleri için Gemini'ı kullanan Vertex AI'a erişimi yönetmek üzere GKE için Workload Identity
- Video akışından baret algılamayı yönetmek için Vertex AI'da üretken yapay zeka
Bu Codelab, yeni başlayanlar da dahil olmak üzere her seviyeden geliştiriciye yöneliktir. Google Cloud Shell'de komut satırı arayüzünü ve Python kodunu kullanacaksınız. Python uzmanı olmanız gerekmez ancak kodu nasıl okuyacağınızla ilgili temel bilgiler, kavramları anlamanıza yardımcı olur.
Not: Bu, üretim uygulaması değil, basitleştirilmiş bir konsept kanıtlama örneğidir. Gerçek hayattaki bir senaryoda, bu hizmete kimliği doğrulanmış ve güvenli harici erişim gibi ek önlemler uygulayın.
2. Başlamadan önce
Proje kurulumu
../shared/_project-setup.md
Cloud Shell'i başlatma
Cloud Shell, Google Cloud'da çalışan ve gerekli araçların önceden yüklendiği bir komut satırı ortamıdır.
- Google Cloud konsolunun üst kısmından Cloud Shell'i etkinleştir'i tıklayın:

- Cloud Shell'e bağlandıktan sonra Cloud Shell'de kimlik doğrulamanızı doğrulamak için şu komutu çalıştırın:
gcloud auth list
- Projenizin gcloud ile kullanılacak şekilde yapılandırıldığını doğrulamak için aşağıdaki komutu çalıştırın:
gcloud config get project
- Projenin beklendiği gibi olduğunu onaylayın ve ardından proje kimliğinizi ayarlamak için aşağıdaki komutu çalıştırın:
export PROJECT_ID=$(gcloud config get project)
Gerekli IAM izinleri
Bu codelab için kullandığınız hesapta aşağıdaki IAM rolleri bulunmalıdır. Bu izinler, gerekli Google Cloud kaynaklarını (projeler, klasörler, GKE kümeleri, KMS anahtarları, hizmet hesapları vb.) oluşturmak ve Assured Workload'u yapılandırmak için gereklidir.
Kuruluş düzeyinde:
- roles/assuredworkloads.admin (Assured Workloads Yöneticisi): Assured Workloads kaynağını oluşturup yönetmek ve uygunluk yapılandırmasını sağlamak için kullanılır.
Faturalandırma Hesabı Düzeyinde (Faturalandırma Hesabınızda):
- roles/billing.accountUser (Faturalandırma Hesabı Kullanıcısı): Belirtilen faturalandırma hesabını bağlamak için.
Codelab değişkenlerini yapılandırma
Gerekli altyapıyı oluşturmak için aşağıdaki ortam değişkenlerini sağlamanız gerekir:
# 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 temelini oluşturma
Artık uygulamanızın temelini düzenlenmiş bir ortamda oluşturabilirsiniz. Kaynaklarınız için kontrollü bir ortam oluşturarak uygunluk şartlarını zorunlu kılmaya yardımcı olması için Assured Workloads'u kullanın.
Kota projenizi yapılandırma
Kota projenizde Assured Workloads API'yi etkinleştirin. Bu API, Assured Workloads oluşturmak ve yönetmek için gereklidir.
gcloud services enable assuredworkloads.googleapis.com \
--project="${QUOTA_PROJECT_ID}"
Assured Workloads ortamını oluşturma
Aşağıdaki komut, demonuz için güvenli bir "iniş alanı" oluşturur. Belirttiğiniz klasör ve faturalandırma hesabı altında iki yeni Google Cloud projesi oluşturur.
- Bir proje, GKE kümenizi ve uygulamanızı barındırır.
- Diğer proje, müşteri tarafından yönetilen şifreleme anahtarlarınızı (CMEK) yönetir.
Belirtilen IL5 uygunluk denetimlerini, oluşturuldukları andan itibaren her iki projeye de otomatik olarak uygular.
İş yükü ortamını oluşturmak için aşağıdaki komutu çalıştırın.
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)")
Gerekli Google Cloud API'lerini etkinleştirme
Derleme işleminden önce, gerekli hizmetler için gereken API'leri etkinleştirin.
Aşağıdaki komut, birincil iş yükü projenizde bu Codelab için gerekli tüm hizmetleri etkinleştirir.
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 altyapı kurulumu
GKE kümenizi destekleyen temel altyapıyı oluşturun. Bu işlem, kümeniz için özel bir ağ oluşturmayı ve düğümlerinizdeki verileri korumak için kendi şifreleme anahtarlarınızı yapılandırmayı içerir.
VPC ağını yapılandırma
Özel bir sanal özel bulut (VPC) ve alt ağ oluşturun. Bu yaklaşım, IP adresi aralığı üzerinde tam kontrol sahibi olmanızı sağlar ve kümenizin amaçlandığı şekilde yalıtılmasını sağlar.
VPC ağını ve belirtilen bölgenizdeki bir alt ağı oluşturmak için aşağıdaki komutları çalıştırın.
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 ile şifrelemeyi yapılandırma
Etkin olmayan verilerle ilgili katı uyumluluk şartlarını karşılamak için müşteri tarafından yönetilen şifreleme anahtarlarını (CMEK) kullanın. Bu sayede, GKE düğümlerinizin önyükleme disklerini şifrelemek için kullanılan anahtarlar üzerinde doğrudan kontrol sahibi olursunuz.
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}"
Şifreleme anahtarı, onu kullanması gereken hizmetten ayrı bir KMS projesinde bulunduğundan iş yükü projesindeki Google Compute Engine hizmet aracısının anahtara erişmesi gerekir.
İş yükü projesindeki GCE hizmet aracısına bu anahtarı kullanma iznini açıkça vermeniz gerekir. Aşağıdaki komut, anahtara IAM politikası bağlaması ekleyerek hizmet aracısına gerekli rolü verir.
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 düğümü hizmet hesabı yapılandırma
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 kümesi oluşturma ve yapılandırma
Artık GKE kümesini oluşturabilirsiniz. Aşağıdaki komut, çeşitli güvenlik özellikleri etkinleştirilmiş bir GKE kümesi sağlar.
Google Cloud, düğümleri ve kontrol düzlemini sağladığından bu işlemin tamamlanması birkaç dakika sürer.
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
Yeni kümeye bağlanma
Yeni kümenizle etkileşim kurmak için yerel kubectl komut satırı aracınızı yapılandırın.
Bu komut, kümenin kimlik bilgilerini ve uç noktasını getirir ve yerel kubeconfig dosyanızı otomatik olarak yapılandırır. Bu komutu çalıştırdıktan sonra çalıştırdığınız tüm kubectl komutları yeni GKE kümenize yönlendirilir.
gcloud container clusters get-credentials "${GKE_CLUSTER}" \
--region="${REGION}" \
--project="${PROJECT_ID}" \
--dns-endpoint
6. Uygulama kimliği yapılandırması
Bir Kubernetes hizmet hesabını Google Cloud IAM hizmet hesabına bağlamak için Workload Identity'yi yapılandırın.
Hizmet hesabı oluşturma
Kümenizde özel bir Kubernetes hizmet hesabı (KSA) oluşturun.
export GKE_NAMESPACE=default
export GKE_SA=ppe-sa
kubectl create sa "${GKE_SA}" --namespace="${GKE_NAMESPACE}"
Ardından, uygulamanızın Google Cloud'da bir kimliği olması gerekir. Uygulama için bir Google Cloud IAM hizmet hesabı oluşturun. Hizmet hesabını oluşturduktan sonra gerekli rolleri atayın.
# 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 hizmet hesabının IAM hizmet hesabının kimliğine bürünmesine izin verme
İki hizmet hesabı da oluşturulduktan sonraki son adım, bunlar arasında bağlantı oluşturmaktır. Bu işlem iki bölümden oluşur. Öncelikle Google Cloud hizmet hesabınıza bir IAM politikası ekleyin.
# 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}]"
İkinci olarak, Kubernetes hizmet hesabınıza açıklama ekleyin.
kubectl annotate --namespace="${GKE_NAMESPACE}" serviceaccount "$GKE_SA" \
iam.gke.io/gcp-service-account="${GKE_SA}@${PROJECT_ID}.iam.gserviceaccount.com"
Bu işlem tamamlandıktan sonra, Kubernetes hizmet hesabıyla kümenizde çalışan tüm pod'lar artık Vertex API'ye erişebilir.
Not: Bu yapılandırmayı basitleştirmek için hizmet hesabı kimliğine bürünmeyi ortadan kaldırmak mümkündür. Ayrıntılar ve sınırlamalar için buraya bakın.
7. Uygulama derleme ve dağıtımı
Uygulamanızı paketleme, depolama ve GKE kümenize dağıtma zamanı geldi.
Artifact Registry deposunu oluşturma
Uygulamayı çalıştırmadan önce Docker container'ı olarak paketleyin ve Artifact Registry deposunda saklayın. Bu depoyu oluşturmak için aşağıdaki komutu kullanın.
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 düğümleri tarafından kullanılan hizmet hesabına, yeni deponuzdan okuma izni açıkça vermeniz gerekir.
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 görüntüsünü oluşturma ve aktarma
Docker görüntüsünü oluşturup depoya aktarın. Öncelikle kaynak kodu klonlayın ve kapsayıcı görüntüsünü oluşturun. Ardından, tam Artifact Registry yoluyla etiketleyin ve daha önce oluşturduğunuz depoya aktarın.
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'ye dağıtma
Container görüntüsü Artifact Registry'de kullanıma sunulduktan sonraki son adım, GKE'ye görüntüyü çekip çalıştırması talimatını vermektir. Bu, uygulamanızın kaynaklarını bir Kubernetes manifest dosyasında tanımlayıp kümeye uygulayarak gerçekleştirilir. Bu komut, dosyada tanımlanan Deployment ve Service nesnelerini oluşturur.
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. Uygulamayı test etme
Son adım, demo uygulamasına erişip test etmektir. Bu işlem, hizmete atanan harici IP adresinin alınmasını ve basit bir ön uç aracılığıyla bu adresle etkileşim kurulmasını içerir.
Hizmetin harici IP'sini alma
Açığa çıkarılan hizmetin harici IP'sini alın (sağlama işlemi yaklaşık 30 saniye sürer).
export IP_ADDRESS=$(kubectl get service "${GKE_DEPLOY}" -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $IP_ADDRESS
Ön ucu yerel olarak çalıştırma
Bu gösterimde ön uç, GKE dağıtımının bir parçası olmayan basit bir HTML/JavaScript sayfasıdır. Yerel makinenizde çalışacak şekilde tasarlanmıştır.
Ön uç, bir üretim uygulamasında GCP'den sunulmalıdır. Yerel makinede:
# 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
Chrome'da http://localhost:8001/index.html adresini açın.
9. Temizleme
Devam eden ücretlendirmeleri önlemek için bu codelab'de oluşturulan kaynakları silin.
GKE kümesini yok etme
Uygulamanın tamamını silmek için GKE kümesini silmeniz yeterlidir. Bunu yapmak için şu komutu çalıştırın:
gcloud container clusters delete "${GKE_CLUSTER}" \
--region="$REGION" \
--project="${PROJECT_ID}"
Assured Workloads'u silme
Assured Workload ile ilgili tüm kaynakları silmek için aşağıdaki komutları çalıştırın.
# 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. Tebrikler
Görev Tamamlandı! Gemini'ı kullanarak baretleri algılayan, düzenlemeye tabi sektörler için iş yeri güvenliği algılama sistemini başarıyla oluşturdunuz.
Başarılarınız:
- Veri koruma ve gizlilik: CMEK ile Gizli GKE düğümü sağladınız
- Veri Sınırları: Düzenlemeye tabi bir ortam için platform uygunluk denetimlerini etkinleştirdiniz.