Menyiapkan jaringan ambient GKE

Halaman ini menunjukkan cara mengaktifkan jaringan sekitar di cluster baru atau yang sudah ada, mendaftarkan namespace dan workload untuk mengaktifkan pengalihan traffic sekitar, serta mengonfigurasi kebijakan otorisasi dan mTLS.

Untuk mengetahui informasi selengkapnya tentang arsitektur, manfaat, dan kemampuan jaringan sekitar, lihat Ringkasan jaringan sekitar.

Prasyarat dan batasan

Sebelum menyiapkan jaringan sekitar, tinjau batasan fitur, persyaratan versi, dan batasan cakupan berikut:

  • Versi GKE: Memerlukan GKE versi 1.35.2-gke.1842000 atau yang lebih baru.
  • Dukungan Regional: Cluster harus dibuat di region yang didukung oleh Regional Cloud Service Mesh.
  • Interoperabilitas Workload: Workload yang terdaftar dalam jaringan sekitar tidak dapat beroperasi dengan workload yang disisipkan sidecar atau gRPC tanpa proxy dalam pratinjau pribadi.
  • Fitur yang Tidak Didukung:
    • Kolom Kubernetes Service trafficDistribution.
    • Layanan Headless.
    • GKE Sandbox (gVisor).
  • Pemberitahuan Keamanan: Jika komponen gke-ambient-nriplugin menjadi tidak tersedia di node, penegakan autentikasi dan otorisasi traffic masuk mungkin dilewati.

Sebelum memulai

Selesaikan langkah-langkah penyiapan prasyarat berikut di Cloud de Confiance by S3NS:

  1. Buat atau pilih project.
  2. Aktifkan API yang diperlukan:

    gcloud services enable \
        privateca.googleapis.com \
        gkehub.googleapis.com \
        compute.googleapis.com \
        container.googleapis.com \
        trafficdirector.googleapis.com \
        networkservices.googleapis.com \
        networksecurity.googleapis.com \
        telemetry.googleapis.com \
        monitoring.googleapis.com \
        logging.googleapis.com
    
  3. Mengonfigurasi autentikasi managed workload identity untuk GKE.

Mengaktifkan jaringan sekitar di cluster baru

Jalankan perintah berikut untuk membuat cluster GKE baru dengan ambient networking yang diaktifkan:

  1. Membuat cluster GKE dengan jaringan sekitar diaktifkan

    gcloud beta container clusters create CLUSTER_NAME \
        --machine-type=e2-standard-4 \
        --enable-ambient-networking \
        --enable-dataplane-v2 \
        --enable-fleet \
        --gateway-api=standard \
        --location=CLUSTER_LOCATION \
        --release-channel=rapid \
        --workload-pool=PROJECT_ID.s3ns.svc.id.goog
    

    Dua DaemonSet kini berjalan di namespace gke-managed-ambient.

Mengaktifkan jaringan sekitar di cluster yang ada

Ikuti langkah-langkah berikut untuk mengaktifkan mesh sekitar pada cluster GKE yang ada:

  1. Pastikan cluster Anda memenuhi persyaratan berikut:

    • Versi 1.35.2-gke.1842000 atau yang lebih tinggi.
    • GKE Dataplane V2 diaktifkan.
    • Jenis mesin harus e2-standard-4 atau yang lebih besar.
    • Cluster harus ditambahkan ke fleet.
    • Cluster harus mengaktifkan Gateway API dan Workload Identity.
  2. Mengaktifkan jaringan sekitar di cluster yang ada:

    gcloud beta container clusters update CLUSTER_NAME \
        --enable-ambient-networking \
        --location=CLUSTER_LOCATION \
        --enable-fleet
    

    Dua DaemonSet kini berjalan di namespace gke-managed-ambient.

  3. Untuk memverifikasi, arahkan CLI Anda ke cluster:

    gcloud beta container clusters get-credentials CLUSTER_NAME \
        --location=CLUSTER_LOCATION
    
  4. Dapatkan daemonset di namespace gke-managed-ambient:

    kubectl get daemonset -n gke-managed-ambient
    

    Outputnya mirip dengan:

    NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   AGE
    gke-ambient-nriplugin   9         9         9       9            9           4d1h
    gke-ambient-proxy       9         9         9       9            9           4d1h
    

Mendaftarkan namespace untuk jaringan sekitar

Ikuti langkah-langkah berikut untuk men-deploy aplikasi contoh dan mengaktifkan pengalihan traffic sekitar di namespace-nya:

  1. Men-deploy aplikasi contoh:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: ambient-test
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: client
      namespace: ambient-test
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: server
      namespace: ambient-test
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: server
      namespace: ambient-test
      labels:
        app: server
    spec:
      ports:
      - port: 80
        protocol: TCP
      selector:
        app: server
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: client
      namespace: ambient-test
      labels:
        app: client
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: client
      template:
        metadata:
          labels:
            app: client
        spec:
          serviceAccountName: client
          containers:
          - name: nginx
            image: nginx:1.29.6
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: server
      namespace: ambient-test
      labels:
        app: server
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: server
      template:
        metadata:
          labels:
            app: server
        spec:
          serviceAccountName: server
          containers:
          - name: nginx
            image: nginx:1.29.6
            readinessProbe:
              httpGet:
                path: /
                port: 80
    EOF
    
  2. Beri label pada namespace ambient-test untuk mengaktifkan pengalihan traffic melalui proxy ambient GKE:

    kubectl label namespace ambient-test networking.gke.io/dataplane-mode=ambient
    
  3. Pastikan setiap Pod di namespace telah dikonfigurasi untuk pengalihan traffic:

    kubectl get pods -n ambient-test -o yaml | grep redirection
    

    Outputnya mirip dengan:

    ambient.networking.gke.io/redirection: enabled
    ambient.networking.gke.io/redirection: enabled
    
  4. Uji traffic klien ke server:

    kubectl exec -it deploy/client -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    
  5. Untuk memverifikasi bahwa traffic Teks biasa mengalir melalui gke-ambient-proxy, periksa log akses di Logs Explorer dan telusuri gke-ambient-node-proxy-accesslog:

    Buka Logs Explorer

  6. Atau, aktifkan pembuatan metrik Layer 4 untuk workload di namespace:

    kubectl label namespace ambient-test networking.gke.io/ambient-network-metrics=enabled
    

    Setelah diaktifkan, metrik workload tersedia di Cloud Monitoring melalui Network Services Monitoring.

Mengaktifkan mTLS untuk layanan

Setelah mengaktifkan pengalihan traffic untuk workload di namespace, terapkan kebijakan untuk menerapkan enkripsi, autentikasi, dan otorisasi.

  1. Konfigurasi kebijakan mTLS permisif pada beban kerja sisi server:

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPServerTLSPolicy
    metadata:
      name: server
      namespace: ambient-test
    spec:
      mtlsMode: Permissive
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
    EOF
    

    Kebijakan ini membuat Pod menerima traffic mTLS dan plaintext. Perhatikan bahwa mTLS permisif menggunakan sniffing traffic untuk mendeteksi apakah traffic adalah mTLS atau teks biasa. Tindakan ini akan mengganggu traffic aplikasi yang menggunakan TLS-nya sendiri atau protokol "server berbicara terlebih dahulu" seperti MySQL.

  2. Pastikan kebijakan telah diterima oleh pengontrol:

    kubectl describe gcpservertlspolicies -n ambient-test server | grep -A50 Status
    

    Outputnya mirip dengan:

    [...]
    
        Conditions:
        Last Transition Time:  2026-03-25T17:47:30Z
        Message:
        Reason:                Accepted
        Status:                True
        Type:                  Accepted
        Controller Name:         networking.gke.io/dpv2-1n
    Events:
    Type    Reason  Age                   From                   Message
    ----    ------  ----                  ----                   -------
    Normal  Sync    108s (x2 over 2m20s)  sc-dpv2-1n-controller  Sync on Mesh dpv2-1n-fqtx-mesh succeeded
    

    Penyebaran kebijakan dapat memerlukan waktu hingga tiga menit setelah pengontrol diterima. Tunggu tiga menit sebelum melanjutkan.

  3. Konfigurasi kebijakan mTLS sisi klien yang menargetkan layanan:

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPClientTLSPolicy
    metadata:
      name: server-mtls
      namespace: ambient-test
    spec:
      targetRefs:
      - group: ""
        kind: Service
        name: server
      subjectAltNames:
      - uri: spiffe://PROJECT_ID.s3ns.svc.id.goog/ns/ambient-test/sa/server
    EOF
    

    Kebijakan ini mengonfigurasi klien terdaftar untuk memulai traffic mTLS ke Layanan server. Anda mungkin perlu menunggu setidaknya dua menit sebelum melanjutkan ke langkah berikutnya.

  4. Pastikan kebijakan telah diterima oleh pengontrol:

    kubectl describe gcpclienttlspolicies -n ambient-test server-mtls | grep -A50 Status
    

    Outputnya mirip dengan:

    [...]
    Status:
    Conditions:
        Last Transition Time:  2024-10-13T01:15:03Z
        Message:
        Observed Generation:   1
        Reason:                Accepted
        Status:                True
        Type:                  Accepted
    
  5. Uji traffic klien ke server:

    kubectl exec -it deploy/client -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    

    Traffic dari Pod yang terdaftar dalam jaringan sekitar ke layanan server di namespace ambient-test kini harus menggunakan mTLS.

  6. Untuk memverifikasi bahwa koneksi menggunakan mTLS, periksa log akses di Logs Explorer, telusuri nama log kustom:

    Buka Logs Explorer

  7. Perbarui GCPServerTLSPolicy yang ada untuk mengubah mode dari Permissive menjadi Strict pada layanan server sehingga Pod workload tidak lagi menerima traffic teks biasa:

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPServerTLSPolicy
    metadata:
      name: server
      namespace: ambient-test
    spec:
      mtlsMode: Strict
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
    EOF
    
  8. Verifikasi bahwa kebijakan telah diterima:

    kubectl describe gcpservertlspolicies -n ambient-test server | grep -A50 Status
    

    Outputnya mirip dengan:

    Name:         server
    
    <...>
    
    UID:                 e4f2a7a3-69aa-4528-8ea6-6f1bf2142011
    Spec:
    Mtls Mode:  Strict
    Target Refs:
    Group:
    Kind:   Pod
    Selector:
      Match Labels:
        App:  server
    Status:
    Ancestors:
        Ancestor Ref:
        Group:
        Kind:   Pod
        Name:   app=server
        Conditions:
        Last Transition Time:  2026-03-25T22:33:54Z
        Message:
        Reason:                Accepted
        Status:                True
        Type:                  Accepted
        Controller Name:         networking.gke.io/dpv2-1n
    Events:
    Type    Reason  Age                  From                   Message
    ----    ------  ----                 ----                   -------
    Normal  Sync    43s (x5 over 4m57s)  sc-dpv2-1n-controller  Sync on Mesh dpv2-1n-2cdi-mesh succeeded
    

    Semua traffic plaintext ke Layanan server Anda kini akan ditolak.

  9. Untuk memverifikasi bahwa traffic teks biasa kini ditolak, kirim traffic ke layanan server dari klien yang TIDAK terdaftar ke jaringan sekitar:

    kubectl create namespace noambient-test && \
    kubectl run -it -n noambient-test --rm curl --image=nginx -- \
        /bin/curl -fsLSv http://server.ambient-test.svc.cluster.local
    

    Koneksi ini akan gagal dengan pesan yang mirip dengan berikut ini:

    * Request completely sent off
    * Empty reply from server
    * shutting down connection #0
    curl: (52) Empty reply from server
    

Menetapkan kebijakan otorisasi Layer 4

Untuk menerapkan otorisasi berbasis identitas, pemilik workload menentukan label Pod di pemilih kebijakan. Pemilik namespace menerapkan kebijakan di seluruh namespace tanpa pemilih.

  1. Terapkan kebijakan berikut untuk memastikan bahwa hanya klien yang diizinkan untuk berkomunikasi dengan server:

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: allow-client
      namespace: ambient-test
    spec:
      action: ALLOW
      enforcementLevel: L4
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
      rules:
      - from:
          sources:
          - principals:
            - principalSelector: CLIENT_CERT_URI_SAN
              principal:
                type: Exact
                value: spiffe://PROJECT_ID.s3ns.svc.id.goog/ns/ambient-test/sa/client
    EOF
    

    Kebijakan ini diterapkan pada traffic ke Pod server di namespace ambient-test. Kebijakan ini memastikan bahwa traffic hanya diizinkan dari sumber dengan identitas SPIFFE spiffe://PROJECT_ID.s3ns.svc.id.goog/ns/ambient-test/sa/client.

  2. Verifikasi bahwa penerapan kebijakan diizinkan dengan mengirimkan contoh permintaan dari akun layanan klien.

    kubectl exec -it deploy/client -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    
  3. Verifikasi bahwa penerapan kebijakan tidak diizinkan dengan mengirimkan contoh permintaan dari akun layanan server.

    kubectl exec -it deploy/server -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    

    Outputnya mirip dengan:

    curl: (52) Empty reply from server
    command terminated with exit code 52
    
  4. Anda dapat menggunakan Logs Explorer untuk melihat logging penerapan otorisasi. Di konsol Cloud de Confiance , buka halaman Logs Explorer.

    Buka Logs Explorer