Mengonfigurasi akses terbatas untuk cluster pribadi GKE

Dokumen ini menjelaskan cara mengonfigurasi entri DNS untuk merutekan permintaan ke domain pkg.dev dan gcr.io menggunakan IP virtual (VIP) terbatas saat Anda menggunakan cluster pribadi Google Kubernetes Engine di perimeter layanan Kontrol Layanan VPC.

Domain registry ini biasanya di-resolve ke alamat IP publik di internet. Di cluster pribadi GKE, node diisolasi dari internet secara default. Artinya, permintaan ke registry akan gagal jika Anda belum mengonfigurasi perutean DNS ke VIP terbatas.

Cluster pribadi Anda harus selalu mengakses Artifact Registry atau Container Registry dengan VIP yang dibatasi untuk mencegah pemindahan data yang tidak sah dari layanan yang didukung ke layanan yang tidak didukung.

Langkah-langkah ini hanya diperlukan jika:

  • Anda menggunakan cluster pribadi GKE.
  • Anda belum mengonfigurasi perutean domain registry pkg.dev atau gcr.io ke restricted.googleapis.com.

Sebelum memulai

Sebelum membuat perimeter layanan, siapkan cluster pribadi baru atau identifikasi cluster pribadi yang ada yang ingin Anda lindungi.

Selain itu, Anda harus mengizinkan traffic keluar ke 199.36.153.4/30 pada port 443. Biasanya, jaringan VPC memiliki aturan tersirat yang mengizinkan semua traffic keluar ke tujuan mana pun. Namun, jika ada aturan yang menolak traffic tersebut, Anda harus membuat aturan firewall keluar untuk mengizinkan traffic TCP pada port 443 ke 199.36.153.4/30.

Mengkonfigurasi DNS

Konfigurasikan server DNS Anda agar permintaan ke alamat registry ditetapkan ke restricted.googleapis.com, VIP yang dibatasi. Anda dapat melakukannya menggunakan zona DNS pribadi Cloud DNS.

  1. Membuat zona pribadi terkelola.

    gcloud dns managed-zones create ZONE_NAME \
        --visibility=private \
        --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
        --description=DESCRIPTION \
        --dns-name=REGISTRY_DOMAIN \
        --project=PROJECT_ID
    

    Dengan keterangan:

    • ZONE_NAME adalah nama untuk zona yang Anda buat. Misalnya, registry. Nama ini akan digunakan di setiap langkah berikut.

    • PROJECT_ID adalah ID project yang menghosting cluster pribadi GKE Anda.

    • NETWORK adalah daftar opsional nama jaringan cluster yang ingin Anda alihkan permintaannya.

    • DESCRIPTION adalah deskripsi zona terkelola yang dapat dibaca manusia.

    • REGISTRY_DOMAIN adalah domain untuk registry Anda:

      • pkg.dev untuk Artifact Registry
      • gcr.io untuk Container Registry atau repositori gcr.io yang dihosting di Artifact Registry
  2. Mulai transaksi.

    gcloud dns record-sets transaction start \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    Dengan keterangan:

    • ZONE_NAME adalah nama zona yang Anda buat pada langkah pertama.

    • PROJECT_ID adalah ID project yang menghosting cluster pribadi GKE Anda.

  3. Tambahkan data CNAME untuk registry Anda.

    gcloud dns record-sets transaction add \
      --name=*.REGISTRY_DOMAIN. \
      --type=CNAME REGISTRY_DOMAIN. \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    Dengan keterangan:

    • ZONE_NAME adalah nama zona yang Anda buat pada langkah pertama.

    • PROJECT_ID adalah ID project yang menghosting cluster pribadi GKE Anda.

    • REGISTRY_DOMAIN adalah domain untuk registry Anda:

      • pkg.dev untuk Artifact Registry
      • gcr.io untuk Container Registry atau repositori gcr.io yang dihosting di Artifact Registry
  4. Tambahkan catatan A untuk VIP terbatas.

    gcloud dns record-sets transaction add \
      --name=REGISTRY_DOMAIN. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    Dengan keterangan:

    • ZONE_NAME adalah nama zona yang Anda buat pada langkah pertama.

    • PROJECT_ID adalah ID project yang menghosting cluster pribadi GKE Anda.

    • REGISTRY_DOMAIN adalah domain untuk registry Anda:

      • pkg.dev untuk Artifact Registry
      • gcr.io untuk Container Registry atau repositori gcr.io yang dihosting di Artifact Registry
  5. Jalankan transaksi.

    gcloud dns record-sets transaction execute \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    Dengan keterangan:

    • ZONE_NAME adalah nama zona yang Anda buat pada langkah pertama.

    • PROJECT_ID adalah ID project yang menghosting cluster pribadi GKE Anda.

Setelah mengonfigurasi perutean DNS, pastikan GKE, registry, dan layanan lain yang diperlukan berada di dalam perimeter layanan Kontrol Layanan VPC Anda. Untuk mengonfigurasi perimeter layanan Anda, lihat bagian berikut.

Mengonfigurasi perimeter layanan

Setelah mengonfigurasi data DNS, buat perimeter layanan baru atau perbarui perimeter yang ada, lalu tambahkan layanan Container Registry atau Artifact Registry ke daftar layanan yang ingin Anda lindungi menggunakan perimeter layanan.

Selain itu:

  • Tambahkan layanan didukung lain yang Anda gunakan dengan registry ke perimeter layanan, seperti Cloud Build, Analisis Artefak, dan Otorisasi Biner.
  • Untuk Container Registry, Anda juga harus menambahkan Cloud Storage ke perimeter layanan.

Memverifikasi pekerjaan perimeter

Setelah mengonfigurasi perimeter layanan, node Anda di cluster pribadi GKE dapat mengakses image container di Artifact Registry dan Container Registry jika image disimpan dalam project yang berada di perimeter layanan Anda.

Image container dalam project di luar perimeter tetap tidak dapat diakses, kecuali untuk beberapa repositori publik hanya baca tertentu.

Misalnya, jika project google-samples tidak berada dalam perimeter layanan Anda, menjalankan perintah untuk membuat deployment dari container hello-app akan gagal:

domain pkg.dev

kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

domain gcr.io

kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0

Periksa status pod dengan perintah:

kubectl get pods

Perintah tersebut menampilkan tabel yang mirip dengan contoh berikut. Status pod ErrImagePull menunjukkan bahwa pull gagal.

NAME                            READY   STATUS         RESTARTS   AGE
hello-server-dbd86c8c4-h5wsf    1/1     ErrImagePull   0          45s

Anda dapat menggunakan perintah kubectl describe pod untuk melihat detail deployment selengkapnya. Untuk pod pada contoh sebelumnya, perintahnya adalah:

kubectl describe pod hello-server-dbd86c8c4-h5wsf