Mengakses cluster Google Kubernetes Engine pribadi dari kumpulan pribadi Cloud Build menggunakan Identity Service for GKE


Tutorial ini menjelaskan cara mengakses bidang kontrol cluster Google Kubernetes Engine (GKE) pribadi menggunakan kumpulan pribadi Cloud Build. Akses ini dapat digunakan untuk menggunakan Cloud Builduntuk men-deploy aplikasi dan mengelola resource di cluster GKE pribadi. Tutorial ini ditujukan untuk administrator platform, administrator cluster, dan developer. Anda dianggap sudah familier dengan GKE, Cloud Build, OpenID Connect, dan alat command line gcloud.

Kumpulan pribadi Cloud Build dan bidang kontrol cluster GKE berjalan di jaringan Virtual Private Cloud (VPC) milik Google. Jaringan VPC ini di-peering ke jaringan VPC Anda sendiri di Google Cloud. Namun, Peering Jaringan VPC tidak mendukung peering transitif, yang dapat menjadi pembatasan saat Anda menggunakan kumpulan pribadi Cloud Build. Tutorial ini menyajikan solusi yang menggunakan Identity Service for GKE untuk memungkinkan pekerja di kumpulan pribadi Cloud Build mengakses bidang kontrol cluster GKE pribadi.

Ringkasan arsitektur

Identity Service for GKE adalah proxy autentikasi untuk bidang kontrol cluster GKE. Token ini melakukan proxy permintaan ke server API dan memvalidasi token ID yang dikeluarkan oleh penyedia identitas OpenID Connect (OIDC). Setelah proxy berhasil memvalidasi token ID, proxy akan menambahkan header HTTP peniruan identitas pengguna ke permintaan asli dan meneruskannya ke server API. Proxy berjalan sebagai akun layanan Kubernetes yang memiliki izin untuk meniru identitas pengguna dan grup.

Proxy Identity Service untuk GKE berjalan sebagai pod pada node cluster. Layanan Kubernetes jenis LoadBalancer mengekspos proxy di luar cluster. Jika Identity Service untuk GKE diaktifkan di cluster pribadi, penginstal akan menambahkan anotasi ke layanan Kubernetes untuk menyediakan Load Balancer Jaringan passthrough internal. Proxy dapat diakses melalui load balancer melalui koneksi Peering Jaringan VPC, seperti dari kumpulan pribadi Cloud Build, karena proxy berjalan pada node cluster di jaringan VPC Anda.

Anda dapat mengonfigurasi Google sebagai penyedia identitas OpenID Connect di Identity Service untuk GKE karena sistem autentikasi OAuth 2.0 Google sesuai dengan spesifikasi OpenID Connect. Guna mendapatkan token ID untuk akun layanan Google, Anda dapat menggunakan metode generateIdToken dari Service Account Credentials API API. Token ID diterbitkan dan ditandatangani oleh Google.

Dengan menggabungkan semuanya, solusi ini memungkinkan akses ke bidang kontrol cluster GKE pribadi menggunakan Identity Service untuk proxy GKE. Build yang berjalan di kumpulan pribadi Cloud Build terhubung ke proxy melalui koneksi Peering Jaringan VPC. Build yang berjalan pada kumpulan pribadi Cloud Build berjalan sebagai akun layanan Google. Akun layanan Google ini dapat memperoleh token ID untuk mengautentikasi ke proxy dari Service Account Credentials API.

Diagram berikut menunjukkan arsitektur yang dijelaskan dalam teks sebelumnya:

Mengakses cluster GKE pribadi menggunakan Identity Service for GKE

Semua komunikasi dalam solusi ini terjadi melalui ruang alamat IP internal. Pekerja di kolam renang pribadi tidak memerlukan konektivitas internet publik.

Izin Identity and Access Management (IAM) yang diberikan ke akun pengguna dan akun layanan Google tidak berlaku saat mereka melakukan autentikasi menggunakan Identity Service for GKE. Sebagai gantinya, Anda dapat menggunakan Kontrol akses berbasis peran (RBAC) Kubernetes untuk mengelola izin cluster bagi akun tersebut.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Buat atau pilih project Google Cloud.

    • Membuat project Google Cloud:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk project Google Cloud yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Aktifkan API Cloud Build, GKE, Identity-Aware Proxy (IAP), and Service Networking APIs:

    gcloud services enable cloudbuild.googleapis.com container.googleapis.com iap.googleapis.com servicenetworking.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Buat atau pilih project Google Cloud.

    • Membuat project Google Cloud:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk project Google Cloud yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Aktifkan API Cloud Build, GKE, Identity-Aware Proxy (IAP), and Service Networking APIs:

    gcloud services enable cloudbuild.googleapis.com container.googleapis.com iap.googleapis.com servicenetworking.googleapis.com

Membuat cluster GKE pribadi

  1. Di Cloud Shell, buat cluster GKE yang tidak memiliki akses klien ke endpoint publik bidang kontrol, dan yang telah menginstal Identity Service for GKE:

    gcloud container clusters create CLUSTER  \
      --enable-identity-service \
      --enable-ip-alias \
      --enable-master-authorized-networks \
      --enable-private-endpoint \
      --enable-private-nodes \
      --master-ipv4-cidr CONTROL_PANE_CIDR \
      --network NETWORK\
      --release-channel regular \
      --scopes cloud-platform \
      --subnetwork SUBNET \
      --tags NODE_TAGS \
      --workload-pool PROJECT_ID.svc.id.goog \
      --zone ZONE
    

    Ganti kode berikut:

    • CLUSTER: nama cluster. Untuk tutorial ini, gunakan private-cluster.
    • CONTROL_PANE_CIDR: rentang alamat IP bidang kontrol. Kode harus memiliki awalan /28. Untuk tutorial ini, Anda dapat menggunakan 172.16.0.32/28.
    • NETWORK: jaringan VPC yang terhubung dengan bidang kontrol. Untuk tutorial ini, gunakan default.
    • SUBNET: subnet yang terhubung dengan bidang kontrol cluster GKE. Subnet harus termasuk dalam jaringan VPC yang ditetapkan oleh NETWORK. Untuk tutorial ini, gunakan default.
    • NODE_TAGS: daftar tag jaringan yang dipisahkan koma untuk diterapkan ke node. Untuk tutorial ini, gunakan private-cluster-node.
    • PROJECT_ID: Project ID Google Cloud Anda.
    • ZONE: zona untuk cluster GKE. Untuk tutorial ini, gunakan us-central1-f.

    Perhatikan hal-hal berikut tentang perintah ini:

    • Flag --enable-identity-service akan mengaktifkan Identity Service untuk GKE di cluster. Di lingkungan Anda sendiri, Anda dapat mengaktifkan Identity Service untuk GKE di cluster yang ada.

    • Tanda --enable-private-endpoint mengonfigurasi bidang kontrol agar dapat diakses hanya menggunakan alamat IP internal.

    • Flag --enable-private-nodes mengonfigurasi node cluster agar hanya memiliki alamat IP internal.

    • Tanda --enable-master-authorized-networks dan --enable-private-nodes memungkinkan akses ke server API hanya dari jaringan pribadi yang ditentukan oleh tanda --network.

    • Tanda --workload-pool opsional mengaktifkan Workload Identity. Tidak diperlukan untuk tutorial ini.

  2. Tambahkan aturan firewall yang memungkinkan bidang kontrol cluster GKE terhubung ke webhook masuk yang memvalidasi untuk resource ClientConfig:

    gcloud compute firewall-rules create allow-control-plane-clientconfig-webhook \
      --allow tcp:15000 \
      --network NETWORK\
      --source-ranges CONTROL_PANE_CIDR\
      --target-tags NODE_TAGS
    

    ClientConfig adalah jenis resource kustom (CRD) Kubernetes yang digunakan Identity Service for GKE untuk mengonfigurasi cara berinteraksi dengan penyedia identitas.

Mendaftarkan Identity Service untuk GKE sebagai aplikasi klien OAuth 2.0

Di bagian ini, Anda akan mendaftarkan Identity Service untuk GKE sebagai aplikasi klien menggunakan sistem autentikasi OAuth 2.0 Google.

  1. Buka halaman Credentials di Konsol Google Cloud.

    Buka halaman Credentials

  2. Klik Create Credentials.

  3. Pilih Client ID OAuth.

    Jika layar izin belum dikonfigurasi untuk project Google Cloud, klik Configure consent screen. Ikuti dokumentasi tentang cara mengonfigurasi layar izin. Untuk tutorial ini, tetapkan nilai berikut:

    • Jenis Pengguna dapat berupa Internal atau Eksternal. Untuk tutorial ini, Anda dapat memilih Internal.
    • Nilai untuk Nama aplikasi, Email dukungan pengguna, dan Informasi kontak developer wajib ada dan dapat bernilai berapa pun.
    • Anda tidak perlu menambahkan cakupan apa pun untuk tutorial ini.

    Setelah Anda selesai mengonfigurasi layar izin, klik Kembali ke dasbor, lalu mulai lagi dari langkah 1 dalam prosedur saat ini.

  4. Dalam daftar Jenis aplikasi, pilih Aplikasi web.

  5. Di kolom Nama, masukkan nama untuk client ID. Untuk tutorial ini, gunakan Identity Service for GKE.

  6. Klik Create.

    Dialog akan muncul. Salin nilai Client ID Anda; Anda akan memerlukannya nanti dalam prosedur ini.

  7. Klik OK untuk menutup kotak dialog.

  8. Di Cloud Shell, buat direktori di bawah direktori utama Anda yang bernama cloud-build-private-pools-gke-tutorial, lalu buka direktori tersebut:

    mkdir -p ~/cloud-build-private-pools-gke-tutorial cd ~/cloud-build-private-pools-gke-tutorial

  9. Di direktori baru, buat file YAML bernama client-config-patch.yaml yang memiliki nilai yang nantinya diperlukan untuk melakukan patch pada resource Identity Service untuk resource ClientConfig GKE:

    cat << EOF > client-config-patch.yaml
    spec:
      authentication:
      - name: google-oidc
        oidc:
          clientID: CLIENT_ID
          cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
          extraParams: prompt=consent,access_type=offline
          issuerURI: https://accounts.google.com
          kubectlRedirectURI: http://localhost:10000/callback
          scopes: email
          userClaim: email
          userPrefix: '-'
    EOF
    

    Ganti CLIENT_ID dengan client ID OAuth dari langkah sebelumnya.

    Perhatikan hal-hal berikut terkait patch:

    • Token ID yang dikeluarkan oleh sistem autentikasi OAuth 2.0 Google berisi ID numerik unik dalam klaim sub (subjek). Menggunakan ID buram ini dalam binding peran akan menyulitkan identifikasi subjek binding peran. Oleh karena itu, patch ini mengonfigurasi Layanan Identitas untuk GKE agar menggunakan klaim email dari token ID untuk mengidentifikasi pengguna, bukan menggunakan subklaim default.

    • Cakupan email ditambahkan sehingga token ID yang dikeluarkan menyertakan klaim email.

    • Kolom cloudConsoleRedirectURI, extraParams, kubectlRedirectURI, dan cakupan digunakan saat developer melakukan autentikasi ke cluster menggunakan Identity Service for GKE. Keduanya tidak digunakan saat akun layanan Google melakukan autentikasi ke cluster. Kolom kubectlRedirectURI bersifat wajib.

    • Kolom userPrefix adalah awalan untuk pengguna yang melakukan autentikasi menggunakan penyedia identitas yang dikonfigurasi. Nilai '-' berarti tanpa awalan.

    • Kolom spec.authentication adalah array. Anda dapat menggunakan beberapa penyedia identitas OpenID Connect dengan Identity Service untuk GKE. Misalnya, Anda dapat menggunakan Google sebagai penyedia identitas untuk mengautentikasi akun layanan Google, dan penyedia identitas lain untuk mengautentikasi developer.

    Untuk mengetahui informasi selengkapnya tentang kolom dalam konfigurasi ini, lihat Menggunakan penyedia identitas eksternal untuk melakukan autentikasi ke GKE.

Membuat akun layanan Google guna mengonfigurasi Identity Service untuk GKE

  1. Di Cloud Shell, buat akun layanan Google:

    gcloud iam service-accounts create ISG_GSA \
      --display-name "Configure Identity Service for GKE"
    

    Ganti ISG_GSA dengan nama yang ingin Anda gunakan untuk akun layanan Google. Untuk tutorial ini, gunakan identity-service-for-gke.

    Anda menetapkan akun layanan Google ini ke instance VM Compute Engine guna mengonfigurasi kontrol akses berbasis peran Identity Service untuk GKE dan Kubernetes di cluster.

  2. Berikan peran Kubernetes Engine Admin ke akun layanan Google pada project tersebut:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --role roles/container.admin
    

    Peran ini memberikan izin yang diperlukan untuk melakukan tugas berikut dalam tutorial ini:

    • Konfigurasi setelan Identity Service for GKE pada cluster dalam project.
    • Membuat binding peran dan binding peran cluster di cluster.

Mengonfigurasi Identity Service untuk GKE

Untuk mengonfigurasi Identity Service for GKE, Anda harus memiliki akses ke bidang kontrol cluster. Dalam tutorial ini, Anda akan membuat instance VM Compute Engine untuk mengakses bidang kontrol.

Anda memerlukan akses SSH ke instance VM. Untuk mengaktifkan akses SSH yang diautentikasi dan diberi otorisasi dari luar jaringan VPC ke instance VM, gunakan penerusan TCP dengan Identity-Aware Proxy (IAP). Fitur ini memungkinkan akses SSH tanpa mengharuskan instance VM memiliki alamat IP publik.

  1. Di Cloud Shell, buat aturan firewall yang mengizinkan akses SSH menggunakan penerusan IAP TCP ke semua instance VM yang memiliki tag jaringan ssh-iap:

    gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
      --allow tcp:22 \
      --description "Allow SSH tunneling using Identity-Aware Proxy" \
      --network NETWORK \
      --source-ranges 35.235.240.0/20 \
      --target-tags ssh-iap
    

    Rentang sumber berisi alamat IP yang digunakan IAP untuk penerusan TCP.

  2. Buat instance VM Compute Engine di jaringan VPC yang sama dengan cluster GKE:

    gcloud compute instances create VM \
      --metadata enable-oslogin=TRUE \
      --network NETWORK \
      --no-address \
      --scopes cloud-platform,userinfo-email \
      --service-account ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --subnet SUBNET  \
      --tags ssh-iap \
      --zone ZONE
    

    Ganti VM dengan nama yang ingin Anda gunakan untuk instance VM. Untuk tutorial ini, gunakan identity-service-for-gke-configuration.

    Perhatikan hal-hal berikut tentang perintah di atas:

    • Flag --service-account melampirkan akun layanan Google ke instance VM.

    • Cakupan cloud-platform diperlukan untuk mengakses Service Account Credentials API.

    • Cakupan userinfo-email berguna saat membuat instance VM untuk mengelola kontrol akses berbasis peran Kubernetes. Atribut ini bersifat opsional untuk tutorial ini.

    • Tanda --no-address berarti bahwa instance VM dibuat tanpa alamat IP eksternal.

    • Nilai metadata instance enable-oslogin opsional mengaktifkan Login OS pada instance VM. Login OS memungkinkan pengelolaan akses SSH ke instance VM menggunakan IAM.

  3. Salin file patch ClientConfig ke instance VM:

    gcloud compute scp client-config-patch.yaml VM:~ --tunnel-through-iap --zone ZONE
    

    Flag --tunnel-through-iap menginstruksikan gcloud untuk meneruskan koneksi melalui IAP.

  4. Hubungkan ke instance VM menggunakan SSH:

    gcloud compute ssh VM --tunnel-through-iap --zone ZONE
    

    Anda menjalankan perintah lainnya di bagian ini dari sesi SSH.

  5. Instal alat command line kubectl dan biner gke-gcloud-auth-plugin di instance VM:

    sudo apt-get install -y kubectl google-cloud-sdk-gke-gcloud-auth-plugin
    
  6. Ambil kredensial untuk cluster GKE:

    export USE_GKE_GCLOUD_AUTH_PLUGIN=True
    gcloud container clusters get-credentials CLUSTER --zone ZONE
    
  7. Terapkan patch pada resource ClientConfig default:

    kubectl patch clientconfig default \
        --namespace kube-public \
        --patch-file client-config-patch.yaml \
        --type merge
    
  8. Ekstrak kolom certificateAuthorityData dari resource ClientConfig default yang di-patch dan simpan dalam file bernama certificateAuthorityData.pem:

    kubectl get clientconfig default \
         --namespace kube-public \
         --output jsonpath='{.spec.certificateAuthorityData}' \
         | base64 --decode > certificateAuthorityData.pem
    
  9. Ekstrak kolom server dari resource ClientConfig default yang di-patch dan simpan dalam file bernama server.txt:

    kubectl get clientconfig default \
         --namespace kube-public \
         --output jsonpath='{.spec.server}' > server.txt
    
  10. Keluar dari sesi SSH:

    exit
    

(Opsional) Memverifikasi konfigurasi cluster

Sebelum melanjutkan, Anda dapat memverifikasi bahwa Identity Service for GKE telah disiapkan dengan benar di cluster. Anda memverifikasi penyiapan dengan menggunakan akun layanan Google yang disertakan ke instance VM untuk melakukan autentikasi ke cluster menggunakan Identity Service for GKE.

  1. Di Cloud Shell, berikan Service Account OpenID Connect Identity Token Creator di akun layanan Google ke akun layanan itu sendiri:

    gcloud iam service-accounts add-iam-policy-binding \
      ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --role roles/iam.serviceAccountOpenIdTokenCreator
    

    Peran ini memberikan izin iam.serviceAccounts.getOpenIdToken yang diperlukan agar dapat meminta token ID untuk akun layanan dari Service Account Credentials API.

  2. Hubungkan ke instance VM menggunakan SSH:

    gcloud compute ssh VM --tunnel-through-iap --zone ZONE
    

    Anda menjalankan perintah lainnya di bagian ini dari sesi SSH.

  3. Minta token akses OAuth 2.0 dari server metadata untuk akun layanan Google yang disertakan ke instance VM, menggunakan client ID OAuth sebagai klaim aud (audiens) yang diminta:

    ACCESS_TOKEN=$(curl --silent --header "Metadata-Flavor: Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token \
           | python3 -c 'import json, sys; print(json.load(sys.stdin).get("access_token"))')
    

    Isi respons dari server metadata adalah dokumen JSON. Perintah tersebut menggunakan skrip Python inline untuk mengekstrak kolom access_token dari isi respons.

  4. Minta token ID dari Service Account Credentials API untuk akun layanan Google yang disertakan ke instance VM:

    ID_TOKEN=$(curl --silent --request POST \
        --data '{"audience": "CLIENT_ID", "includeEmail": true}' \
        --header "Authorization: Bearer $ACCESS_TOKEN" \
        --header "Content-Type: application/json; charset=utf-8" \
    "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/ISG_GSA@PROJECT_ID.iam.gserviceaccount.com:generateIdToken" \
           | python3 -c 'import json, sys; print(json.load(sys.stdin).get("token"))')
    

    Perhatikan hal-hal berikut tentang perintah di atas:

    • Kolom audience dalam JSON isi permintaan menentukan klaim aud (audiens) yang diminta dari token ID.
    • Token akses dari langkah sebelumnya digunakan untuk mengautentikasi ke API.
  5. Lihat klaim dalam token ID:

    echo $ID_TOKEN \
        | cut -d. -f2 \
        | base64 --decode --ignore-garbage 2> /dev/null \
        | python3 -m json.tool
    

    Verifikasi bahwa klaim email berisi alamat email akun layanan Google.

  6. Gunakan token ID untuk melakukan autentikasi ke bidang kontrol menggunakan Identity Service for GKE:

    kubectl get namespaces \
        --certificate-authority certificateAuthorityData.pem \
        --server $(cat server.txt) \
        --token $ID_TOKEN
    

    Outputnya akan terlihat seperti berikut:

      Error from server (Forbidden): namespaces is forbidden: User "ISG_GSA@PROJECT_ID.iam.gserviceaccount.com" cannot list resource "namespaces" in API group "" at the cluster scope
    

    Error ini wajar terjadi. Meskipun akun layanan Google telah diberi izin IAM pada cluster GKE dalam project, izin IAM tidak berlaku saat Anda melakukan autentikasi menggunakan Identity Service for GKE. Sebagai gantinya, Anda dapat mengonfigurasi akses menggunakan kontrol akses berbasis peran (RBAC) Kubernetes.

  7. Buat binding peran cluster yang memberikan peran cluster view ke akun layanan Google saat akun layanan mengautentikasi ke cluster menggunakan penyedia OpenID Connect Google:

    kubectl create clusterrolebinding ISG_GSA-cluster-view \
        --clusterrole view \
        --user ISG_GSA@PROJECT_ID.iam.gserviceaccount.com
    

    Jika Anda menetapkan nilai userPrefix selain - di ClientConfig di lingkungan Anda sendiri, tambahkan awalan ke nilai tanda --user dalam perintah ini.

  8. Akses cluster GKE menggunakan Identity Service for GKE:

    kubectl get namespaces \
        --certificate-authority certificateAuthorityData.pem \
        --server $(cat server.txt) \
        --token $ID_TOKEN
    

    Outputnya akan terlihat seperti berikut:

    NAME                      STATUS   AGE
    anthos-identity-service   Active   1h
    default                   Active   1h
    kube-node-lease           Active   1h
    kube-public               Active   1h
    kube-system               Active   1h
    
  9. Keluar dari sesi SSH:

    exit
    

Membuat konteks untuk alat kubectl

Perintah kubectl dapat menggunakan file kubeconfig untuk mengonfigurasi akses ke cluster. File kubeconfig berisi satu atau beberapa konteks. Setiap konteks memiliki nama, dan secara opsional menyertakan informasi konektivitas cluster, kredensial yang digunakan untuk mengautentikasi ke cluster, dan namespace default.

Di bagian ini, Anda akan membuat file kubeconfig yang memiliki konteks. Konteksnya mencakup detail konektivitas proxy Identity Service untuk GKE bagi cluster Anda. Anda tidak menambahkan kredensial pengguna apa pun ke file kubeconfig.

  1. Di Cloud Shell, salin file yang berisi data certificate authority dan URL server dari instance VM ke direktori saat ini:

    gcloud compute scp VM:~/certificateAuthorityData.pem VM:~/server.txt . \
        --tunnel-through-iap --zone ZONE
    
  2. Buat konteks dan konfigurasi cluster yang akan Anda gunakan nanti untuk terhubung ke cluster GKE dari Cloud Build:

    kubectl config set-context private-cluster \
        --cluster private-cluster \
        --kubeconfig kubeconfig
    

    Flag --kubeconfig membuat konteks dan konfigurasi cluster dalam file baru bernama kubeconfig di direktori saat ini.

    Perintah ini menggunakan nama cluster GKE sebagai nama konfigurasi cluster untuk konteksnya. Di lingkungan Anda sendiri, Anda dapat menggunakan nama konfigurasi cluster yang berbeda sesuai konteks.

  3. Tetapkan kolom certificateAuthorityData pada konfigurasi cluster:

    kubectl config set-cluster private-cluster \
        --certificate-authority certificateAuthorityData.pem \
        --embed-certs \
        --kubeconfig kubeconfig
    
  4. Tetapkan kolom server pada konfigurasi cluster:

    kubectl config set-cluster private-cluster \
        --kubeconfig kubeconfig \
        --server $(cat server.txt)
    

Membuat akun layanan Google untuk Cloud Build

  1. Di Cloud Shell, buat akun layanan Google untuk menjalankan build di kumpulan pribadi Cloud Build:

    gcloud iam service-accounts create CB_GSA \
      --description "Runs builds on Cloud Build private pools" \
      --display-name "Cloud Build private pool"
    

    Ganti CB_GSA dengan nama yang ingin Anda gunakan untuk akun layanan Google. Untuk tutorial ini, gunakan cloud-build-private-pool.

  2. Berikan peran Cloud Build Service Account pada project ke akun layanan Google:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/cloudbuild.builds.builder
    

    Peran ini memberikan izin default untuk akun layanan Cloud Build yang dikelola Google.

  3. Berikan Service Account OpenID Connect Identity Token Creator di akun layanan Google untuk akun layanan itu sendiri:

    gcloud iam service-accounts add-iam-policy-binding \
        CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.serviceAccountOpenIdTokenCreator
    

    Peran ini memberikan izin iam.serviceAccounts.getOpenIdToken yang diperlukan agar dapat meminta token ID untuk akun layanan dari Service Account Credentials API.

  4. Hubungkan ke instance VM menggunakan SSH:

    gcloud compute ssh VM --tunnel-through-iap --zone ZONE
    

    Anda menjalankan perintah lainnya di bagian ini dari sesi SSH.

  5. Pada sesi SSH, buat binding peran cluster Kubernetes yang memberikan peran cluster cluster-admin ke akun layanan Google saat akun layanan mengautentikasi ke cluster menggunakan penyedia OpenID Connect Google:

    kubectl create clusterrolebinding CB_GSA-cluster-admin \
        --clusterrole cluster-admin \
        --user CB_GSA@PROJECT_ID.iam.gserviceaccount.com
    

    Peran cluster cluster-admin memberikan izin yang luas untuk seluruh cluster. Di lingkungan sendiri, Anda dapat menggunakan peran cluster yang hanya memberikan izin yang diperlukan untuk tugas yang dijalankan Cloud Build. Anda juga dapat menggunakan binding peran untuk memberikan izin hanya ke namespace tertentu.

    Jika Anda menetapkan userPrefix pada ClientConfig di lingkungan sendiri, Anda harus menambahkan awalan tersebut ke nilai tanda --user dalam perintah ini.

  6. Keluar dari sesi SSH:

    exit
    

Membuat kumpulan pribadi Cloud Build

  1. Di Cloud Shell, alokasikan rentang alamat IP di jaringan VPC Anda untuk koneksi dengan kumpulan pribadi:

    gcloud compute addresses create RESERVED_RANGE_NAME \
    --addresses RESERVED_RANGE_START_IP\
        --description "Cloud Build private pool reserved range" \
        --global \
        --network NETWORK \
        --prefix-length RESERVED_RANGE_PREFIX_LENGTH \
        --purpose VPC_PEERING
    

    Ganti kode berikut:

    • RESERVED_RANGE_NAME: nama rentang alamat IP yang dialokasikan yang menghosting kumpulan pribadi Cloud Build. Untuk tutorial ini, gunakan cloud-build-private-pool.
    • RESERVED_RANGE_START_IP: alamat IP pertama dari rentang alamat IP yang dialokasikan. Untuk tutorial ini, gunakan 192.168.12.0.
    • RESERVED_RANGE_PREFIX_LENGTH: panjang awalan (subnet mask) dari rentang alamat IP yang dialokasikan. Panjang awalan harus /23 atau angka yang lebih rendah, misalnya /22 atau /21. Angka yang lebih kecil berarti rentang alamat IP yang lebih besar. Untuk tutorial ini, gunakan 23, dan jangan masukkan / awal (garis miring).
  2. Buat aturan firewall untuk mengizinkan traffic masuk dari rentang alamat IP yang dicadangkan ke resource lain di jaringan VPC Anda:

    gcloud compute firewall-rules create allow-private-pools-ingress \
        --allow all \
        --network NETWORK \
        --source-ranges RESERVED_RANGE_START_IP/RESERVED_RANGE_PREFIX_LENGTH
    
  3. Buat koneksi layanan pribadi untuk menghubungkan jaringan VPC Anda ke layanan Jaringan Layanan:

    gcloud services vpc-peerings connect \
        --network NETWORK \
        --ranges RESERVED_RANGE_NAME \
        --service servicenetworking.googleapis.com
    

    Kumpulan pribadi Cloud Build menjalankan pekerja menggunakan Service Networking. Dengan koneksi layanan pribadi, jaringan VPC Anda dapat berkomunikasi dengan kumpulan pribadi pada rentang alamat IP internal yang dialokasikan, menggunakan koneksi Peering Jaringan VPC.

    Diperlukan waktu beberapa menit untuk membuat koneksi layanan pribadi.

    Jika Anda menggunakan VPC Bersama di lingkungan Anda sendiri, untuk mengetahui informasi tentang langkah tambahan dalam membuat koneksi layanan pribadi, lihat Menyiapkan lingkungan Anda.

  4. Buat kumpulan pribadi Cloud Build di jaringan VPC milik Google yang di-peering dengan jaringan VPC Anda:

    gcloud builds worker-pools create PRIVATE_POOL_NAME \
       --no-public-egress \
       --peered-network projects/PROJECT_ID/global/networks/NETWORK \
       --region REGION
    

    Ganti kode berikut:

    • PRIVATE_POOL_NAME: nama kolam pribadi. Untuk tutorial ini, gunakan private-pool.
    • REGION: region yang akan digunakan untuk kolam renang pribadi. Untuk tutorial ini, gunakan us-central1.

    Flag --no-public-egress berarti pekerja di kumpulan pribadi tidak memiliki alamat IP publik. Di lingkungan Anda sendiri, Anda dapat menghapus tanda ini jika Anda ingin pekerja di kumpulan pribadi memiliki konektivitas internet menggunakan alamat IP publik.

    Untuk mengetahui informasi tentang opsi konfigurasi tambahan, seperti jenis mesin dan ukuran disk untuk pekerja di kumpulan pribadi, lihat Membuat dan mengelola kumpulan pribadi.

Verifikasi solusi

Di bagian ini, Anda akan memverifikasi solusi dengan menjalankan build di kumpulan pribadi Cloud Build. Build ini mengakses cluster GKE pribadi.

  1. Di Cloud Shell, buat bucket Cloud Storage untuk menyimpan log build dari Cloud Build:

    gsutil mb -l REGION gs://PROJECT_ID-build-logs
    
  2. Buat file konfigurasi build untuk Cloud Build:

    cat << "EOF" > cloudbuild.yaml
    steps:
    - id: list-services
      name: gcr.io/google.com/cloudsdktool/google-cloud-cli
      entrypoint: bash
      args:
      - -eEuo
      - pipefail
      - -c
      - |-
        kubectl config use-context $_KUBECTL_CONTEXT
    
        ACCESS_TOKEN=$$(curl --silent \
            --header "Metadata-Flavor: Google" \
            http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token \
            | python3 -c 'import json, sys; print(json.load(sys.stdin).get("access_token"))')
    
        ID_TOKEN=$$(curl --silent --request POST \
            --data '{"audience": "CLIENT_ID", "includeEmail": true}' \
            --header "Authorization: Bearer $$ACCESS_TOKEN" \
            --header "Content-Type: application/json; charset=utf-8" \
            "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$_SERVICE_ACCOUNT:generateIdToken" \
            | python3 -c 'import json, sys; print(json.load(sys.stdin).get("token"))')
    
        kubectl get services --namespace $_NAMESPACE --token $$ID_TOKEN
    
    logsBucket: gs://PROJECT_ID-build-logs
    
    options:
      env:
      - KUBECONFIG=/workspace/$_KUBECONFIG
    
    substitutions:
      _KUBECONFIG: kubeconfig
      _KUBECTL_CONTEXT: private-cluster
      _NAMESPACE: default
    
    serviceAccount: projects/$PROJECT_ID/serviceAccounts/$_SERVICE_ACCOUNT
    EOF
    

    Langkah dalam file konfigurasi build adalah sebagai berikut:

    1. Beralih ke konteks kubectl yang ditentukan oleh substitusi _KUBECTL_CONTEXT. Nilai substitusi default adalah private-cluster.

    2. Mengambil token akses dari server metadata. Token akses dikeluarkan ke akun layanan Google yang menjalankan build.

    3. Membuat token ID menggunakan Service Account Credentials API. Permintaan untuk membuat token ID diotentikasi dengan menggunakan token akses. Klaim aud (audiens) yang diminta dari token ID adalah client ID OAuth 2.0 yang ditentukan oleh substitusi _CLIENT_ID.

    4. Mencantumkan layanan Kubernetes dalam namespace yang ditentukan oleh substitusi _NAMESPACE. Nilai substitusi default adalah default. Permintaan tersebut diautentikasi menggunakan token ID yang dihasilkan pada perintah sebelumnya.

    Perhatikan hal-hal berikut tentang file konfigurasi build:

    • Karakter $ adalah awalan untuk substitusi. $$ digunakan untuk perluasan parameter bash dan substitusi perintah.

    • Substitusi _KUBECONFIG dan _KUBECTL_CONTEXT memungkinkan file kubeconfig yang berbeda dan konteks yang berbeda dapat ditentukan saat Anda menjalankan build. Substitusi ini memungkinkan Anda mengelola beberapa konfigurasi cluster dengan menggunakan satu file kubeconfig dengan banyak konteks, atau dengan menggunakan beberapa file kubeconfig.

    • Substitusi _SERVICE_ACCOUNT tidak memiliki nilai default. Anda harus memberikan nilai untuk penggantian ini saat menjalankan build.

    • Blok options menetapkan variabel lingkungan KUBECONFIG untuk semua langkah dalam build.

    • Langkah build menggunakan image builder gcr.io/google.com/cloudsdktool/google-cloud-cli. Image ini adalah image container yang besar, dan perlu waktu untuk menariknya dari registry ke pekerja kumpulan pribadi. Untuk mengurangi waktu yang diperlukan untuk mengambil image builder, Anda dapat membuat image builder kustom yang hanya berisi alat yang diperlukan untuk langkah build, seperti curl, kubectl, dan Python.

    Untuk informasi selengkapnya tentang skrip shell inline dalam file konfigurasi build, lihat Menjalankan skrip bash.

  3. Jalankan build menggunakan file konfigurasi build dan file dalam direktori saat ini:

    gcloud builds submit \
        --config cloudbuild.yaml \
        --region REGION \
        --substitutions _SERVICE_ACCOUNT=CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --worker-pool projects/PROJECT_ID/locations/REGION/workerPools/PRIVATE_POOL_NAME
    

    Perintah ini mengupload semua file yang ada di direktori saat ini ke Cloud Storage untuk digunakan oleh Cloud Build. Langkah build menggunakan file kubeconfig untuk terhubung ke cluster GKE.

    Di dekat akhir output, Anda akan melihat baris yang terlihat seperti berikut:

    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   2h
    

    Output ini menunjukkan bahwa pekerja kumpulan pribadi telah terhubung ke bidang kontrol cluster menggunakan Identity Service untuk proxy autentikasi GKE.

Pemecahan masalah

Jika Anda tidak dapat terhubung ke instance VM menggunakan SSH, tambahkan tanda --troubleshoot untuk membantu menemukan penyebab masalah konektivitas:

gcloud compute ssh VM --tunnel-through-iap --zone ZONE --troubleshoot

Jika Anda mendapatkan pesan Error from server (NotFound): clientconfigs.authentication.gke.io "default" not found saat mem-patch ClientConfig default di cluster GKE, pastikan Anda telah membuat aturan firewall seperti yang dijelaskan di bagian Membuat cluster GKE pribadi. Verifikasi bahwa aturan firewall ada:

gcloud compute firewall-rules describe allow-control-plane-clientconfig-webhook

Jika Anda tidak dapat melakukan autentikasi ke Layanan Identitas untuk proxy GKE, cari error dalam log pod di deployment gke-oidc-service:

gcloud compute ssh VM --tunnel-through-iap --zone ZONE --command \
    'kubectl logs deployment/gke-oidc-service \
         --namespace anthos-identity-service --all-containers'

Jika Anda mengalami masalah lain dengan tutorial ini, sebaiknya tinjau dokumen berikut:

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

    Menghapus project Google Cloud:

    gcloud projects delete PROJECT_ID

Menghapus resource

Jika Anda ingin menyimpan project yang digunakan dalam tutorial ini, hapus masing-masing resource:

  1. Di Cloud Shell, hapus kumpulan pribadi Cloud Build:

    gcloud builds worker-pools delete PRIVATE_POOL_NAME --region REGION --quiet
    
  2. Hapus koneksi layanan pribadi ke Service Networking:

    gcloud services vpc-peerings delete --network NETWORK \
      --service servicenetworking.googleapis.com --quiet --async
    
  3. Hapus rentang alamat IP yang dialokasikan ke kumpulan pribadi Cloud Build:

    gcloud compute addresses delete RESERVED_RANGE_NAME --global --quiet
    
  4. Hapus bucket Cloud Storage dan semua isinya:

    gsutil rm -r gs://PROJECT_ID-build-logs
    
  5. Hapus cluster GKE:

    gcloud container clusters delete CLUSTER --zone ZONE --quiet --async
    
  6. Hapus instance VM Compute Engine:

    gcloud compute instances delete VM --zone ZONE --quiet
    
  7. Hapus aturan Firewall:

    gcloud compute firewall-rules delete allow-private-pools-ingress --quiet
    
    gcloud compute firewall-rules delete allow-ssh-ingress-from-iap --quiet
    
    gcloud compute firewall-rules delete allow-control-plane-clientconfig-webhook --quiet
    
  8. Hapus binding peran IAM:

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/cloudbuild.builds.builder
    
    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/container.admin
    
    gcloud iam service-accounts remove-iam-policy-binding \
        CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.serviceAccountOpenIdTokenCreator
    
    gcloud iam service-accounts remove-iam-policy-binding \
        ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.serviceAccountOpenIdTokenCreator
    
  9. Hapus akun layanan Google:

    gcloud iam service-accounts delete CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
       --quiet
    
    gcloud iam service-accounts delete ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
       --quiet
    

Menghapus client ID OAuth 2.0

  1. Buka halaman Credentials di Konsol Google Cloud:

    Buka halaman Credentials

  2. Pilih project Anda dari daftar pemilih project.

  3. Pada tabel Client ID OAuth 2.0, temukan baris untuk Identity Service for GKE, lalu klik ikon Delete OAuth client.

  4. Pada dialog, klik Hapus.

Langkah selanjutnya