Mengelola infrastruktur cloud dengan kpt

Last reviewed 2023-03-15 UTC

Tutorial ini memperkenalkan kpt, alat open source dari Google yang memungkinkan Anda menangani konfigurasi Kubernetes (juga dikenal sebagai manifes): mengemas, menarik, mengupdate, dan memodifikasinya. kpt adalah alternatif untuk alat berbasis template jika Anda ingin menjaga pemisahan yang bersih antara konfigurasi dan operasi pada konfigurasi tersebut. kpt memungkinkan Anda menggunakan kembali dan membagikan kode yang bekerja pada konfigurasi (baik untuk memodifikasi atau memeriksanya).

Tutorial ini juga menunjukkan cara menggabungkan kpt dengan solusi Google lainnya seperti Config Sync dan blueprint keamanan GKE Enterprise. Baik Anda developer yang bekerja dengan Kubernetes atau engineer platform yang mengelola platform berbasis Kubernetes, tutorial ini memungkinkan Anda mengetahui cara menggunakan kpt dalam alur kerja terkait Kubernetes Anda sendiri. Tutorial ini mengasumsikan bahwa Anda sudah memahami Kubernetes dan Google Cloud.

Konfigurasi deklaratif untuk infrastruktur cloud adalah praktik yang umum di industri IT. Hal ini menghadirkan abstraksi yang canggih dari sistem yang mendasarinya. Abstraksi ini membebaskan Anda untuk tidak mengelola dependensi dan detail konfigurasi tingkat rendah. Oleh karena itu, konfigurasi deklaratif memiliki keunggulan dibandingkan dengan pendekatan imperatif, seperti operasi yang dilakukan dalam antarmuka grafis dan command line.

Model resource Kubernetes telah berpengaruh dalam membuat pendekatan konfigurasi deklaratif menjadi mainstream. Karena Kubernetes API pada dasarnya bersifat deklaratif, Anda hanya perlu memberi tahu Kubernetes apa yang Anda inginkan, bukan cara mencapai apa yang Anda inginkan. Kubernetes API memungkinkan Anda memisahkan konfigurasi (baik yang diinginkan maupun yang sebenarnya) dari operasi pada konfigurasi (menambahkan, menghapus, dan memodifikasi objek). Dengan kata lain, dalam model resource Kubernetes, konfigurasinya adalah data, bukan kode.

Pemisahan konfigurasi dari operasi ini memiliki banyak keuntungan: pengguna dan sistem otomatis dapat memahami serta mengerjakan konfigurasi, dan software yang memodifikasi konfigurasi dapat digunakan kembali dengan mudah. Pemisahan ini juga memungkinkan Anda mengimplementasikan metodologi GitOps dengan mudah (seperti yang didefinisikan dalam tutorial Continuous delivery bergaya GitOps dengan Cloud Build).

Dalam tutorial ini, Anda akan mempelajari pemisahan deklarasi konfigurasi dari operasi konfigurasi menggunakan kpt. Tutorial ini berfokus pada fitur-fitur kpt sebagai berikut:

  • Pengelolaan paket: mendownload dan mengupdate paket konfigurasi Kubernetes.
  • Fungsi: menjalankan potongan kode arbitrer untuk mengubah atau memvalidasi konfigurasi.
  • Pipeline fungsi: sekumpulan fungsi yang disertakan oleh pembuat paket di dalam paket.
  • Pengelolaan resource: menerapkan, mengupdate, dan menghapus resource yang sesuai dengan konfigurasi Anda di cluster Kubernetes.

Tujuan

  • Membuat cluster Google Kubernetes Engine (GKE).
  • Menggunakan kpt untuk mendownload kumpulan konfigurasi Kubernetes yang sudah ada.
  • Menggunakan fungsi kpt untuk menyesuaikan konfigurasi.
  • Menerapkan konfigurasi Anda ke cluster GKE.
  • Menggunakan kpt untuk mengambil beberapa perubahan upstream untuk konfigurasi Anda.
  • Menggunakan kpt dalam praktiknya untuk memperkuat cluster GKE Anda.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

  • Google Kubernetes Engine

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  7. Konfigurasikan Cloud Shell untuk menggunakan project Anda:

    gcloud config set project PROJECT_ID
    
  8. Di Cloud Shell, aktifkan Google Kubernetes Engine dan Cloud Source Repositories API:

    gcloud services enable container.googleapis.com \
       sourcerepo.googleapis.com
    

Setelah menyelesaikan tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk detail selengkapnya, lihat Pembersihan.

Membuat cluster GKE

Di bagian ini, Anda akan membuat cluster GKE tempat Anda men-deploy konfigurasi nanti dalam tutorial.

  1. Di Cloud Shell, buat cluster GKE:

    gcloud container clusters create kpt-tutorial \
       --num-nodes=1 --machine-type=n1-standard-4 \
       --zone=us-central1-a --enable-network-policy
    
  2. Pastikan Anda memiliki akses ke cluster. Perintah berikut menampilkan informasi tentang node atau node yang ada di cluster.

    kubectl get nodes
    

Menerapkan paket kpt

Di bagian ini, Anda akan menggunakan kpt untuk mendownload serangkaian konfigurasi, menyesuaikannya, dan menerapkannya ke cluster yang telah dibuat di bagian sebelumnya. kpt harus diinstal di dalam lingkungan Cloud Shell Anda. Jika belum, instal dengan perintah berikut:

  1. Di Cloud Shell, instal kpt:

    sudo apt update && sudo apt-get install google-cloud-sdk-kpt
    
  2. Download contoh kumpulan konfigurasi. Untuk informasi selengkapnya, lihat kpt pkg get.

    kpt pkg get https://github.com/GoogleContainerTools/kpt.git/package-examples/wordpress@v0.9
    

    Perintah sebelumnya mendownload paket contoh wordpress yang tersedia di repositori GitHub kpt, pada versi v0.9 yang diberi tag.

  3. Periksa konten paket: kpt pkg tree.

    kpt pkg tree wordpress
    

    Outputnya akan terlihat seperti berikut:

    Package "wordpress"
    ├── [Kptfile]  Kptfile wordpress
    ├── [service.yaml]  Service wordpress
    ├── deployment
    │   ├── [deployment.yaml]  Deployment wordpress
    │   └── [volume.yaml]  PersistentVolumeClaim wp-pv-claim
    └── Package "mysql"
        ├── [Kptfile]  Kptfile mysql
        ├── [deployment.yaml]  PersistentVolumeClaim mysql-pv-claim
        ├── [deployment.yaml]  Deployment wordpress-mysql
        └── [deployment.yaml]  Service wordpress-mysql
    

    Paket ini berisi dua paket, satu wordpress tingkat atas dan sub-paket wordpress/mysql. Kedua paket ini berisi file metadata Kptfile. Kptfile hanya digunakan oleh kpt itu sendiri dan memiliki data mengenai sumber upstream, penyesuaian, dan validasi paket

  4. Update label paket

    Penulis paket menambahkan pipeline rendering yang sering digunakan untuk memberikan penyesuaian yang diharapkan.

    less wordpress/Kptfile
    

    Kontennya kurang lebih akan seperti ini:

    apiVersion: kpt.dev/v1
    kind: Kptfile
    metadata:
      name: wordpress
    upstream:
      type: git
      git:
        repo: https://github.com/GoogleContainerTools/kpt
        directory: /package-examples/wordpress
        ref: v0.9
      updateStrategy: resource-merge
    upstreamLock:
      type: git
      git:
        repo: https://github.com/GoogleContainerTools/kpt
        directory: /package-examples/wordpress
        ref: package-examples/wordpress/v0.9
        commit: b9ea0bca019dafa9f9f91fd428385597c708518c
    info:
      emails:
        - kpt-team@google.com
      description: This is an example wordpress package with mysql subpackage.
    pipeline:
      mutators:
        - image: gcr.io/kpt-fn/set-labels:v0.1
          configMap:
            app: wordpress
      validators:
        - image: gcr.io/kpt-fn/kubeval:v0.3
    

    Anda dapat menggunakan editor pilihan Anda untuk mengubah parameter fungsi set-label dari app: wordpress menjadi app: my-wordpress.

  5. Edit deployment MySQL wordpress/mysql/deployment.yaml menggunakan editor kode pilihan Anda untuk mengubah versi MySQL. Selain itu, untuk lebih memperkuat keamanan, ubah variabel MYSQL_ROOT_PASSWORD menjadi MYSQL_PASSWORD, dan tambahkan variabel berikut:

    • MYSQL_USER
    • MYSQL_RANDOM_ROOT_PASSWORD
    • MYSQL_DATABASE

    Sebelum:

    [...]
      containers:
        - name: mysql
          image: mysql:5.6
          ports:
            - name: mysql
              protocol: TCP
              containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
    [...]
    

    Sesudah:

    [...]
      containers:
        - name: mysql
          image: mysql:8.0
          ports:
            - name: mysql
              protocol: TCP
              containerPort: 3306
          env:
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            - name: MYSQL_RANDOM_ROOT_PASSWORD
              value: '1'
            - name: MYSQL_USER
              value: wordpress
            - name: MYSQL_DATABASE
              value: wordpress
    [...]
    
  6. Edit deployment Wordpress wordpress/deployment/deployment.yaml menggunakan editor kode pilihan Anda untuk mengubah versi Wordpress dan menambahkan variabel WORDPRESS_DB_USER.

    Sebelum:

    [...]
      containers:
        - name: wordpress
          image: wordpress:6.1-apache
          ports:
            - name: wordpress
              protocol: TCP
              containerPort: 80
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
    [...]
    

    Sesudah:

    [...]
      containers:
        - name: wordpress
          image: wordpress:4.8-apache
          ports:
            - name: wordpress
              protocol: TCP
              containerPort: 80
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            - name: WORDPRESS_DB_USER
              value: wordpress
    [...]
    

    Tidak seperti alat yang beroperasi melalui parameter saja, kpt memungkinkan Anda mengedit file menggunakan editor dan selanjutnya akan tetap menggabungkan update upstream. Anda dapat mengedit deployment.yaml secara langsung tanpa harus membuat patch atau membuat fungsi di pipeline.

  7. Anotasikan konfigurasi dengan sample-annotation: sample-value.

    kpt fn eval wordpress --image gcr.io/kpt-fn/set-annotations:v0.1 \
      -- sample-annotation=sample-value
    

    Outputnya kurang lebih akan seperti ini:

    [RUNNING] "gcr.io/kpt-fn/set-annotations:v0.1"
    [PASS] "gcr.io/kpt-fn/set-annotations:v0.1"
    

    Untuk melihat anotasi baru, Anda dapat periksa nilai konfigurasi apa saja, yang mudah dilihat adalah wordpress/service.yaml

    Dalam contoh ini, kita melakukan penyesuaian menggunakan fungsi dengan cara yang tidak terpikirkan oleh penulis paket. kpt dapat mendukung eksekusi fungsi deklaratif dan imperatif untuk memungkinkan berbagai skenario.

    Jika paket ini dikembangkan menggunakan infrastruktur sebagai kode, kita harus membuka sumber paket dan mengedit kode di sana.

  8. Jalankan pipeline dan validasi perubahan menggunakan kubeval melalui kpt.

    kpt fn render wordpress
    

    Penulis paket telah menyertakan langkah validasi dalam pipeline:

    ...
    validators:
        - image: gcr.io/kpt-fn/kubeval:v0.3
    

    Output yang berhasil dari pipeline rendering ini akan tampak seperti ini:

    Package "wordpress/mysql":
    [RUNNING] "gcr.io/kpt-fn/set-labels:v0.1"
    [PASS] "gcr.io/kpt-fn/set-labels:v0.1" in 1.3s
    
    Package "wordpress":
    [RUNNING] "gcr.io/kpt-fn/set-labels:v0.1"
    [PASS] "gcr.io/kpt-fn/set-labels:v0.1" in 1.3s
    [RUNNING] "gcr.io/kpt-fn/kubeval:v0.3"
    [PASS] "gcr.io/kpt-fn/kubeval:v0.3" in 3.7s
    
    Successfully executed 3 function(s) in 2 package(s).
    

    Langkah ini merupakan contoh manfaat dari model resource Kubernetes: karena konfigurasi Anda direpresentasikan dalam model yang sudah dikenal ini, Anda dapat menggunakan alat Kubernetes yang sudah ada, seperti kubeval.

  9. Periksa perbedaan antara konfigurasi versi lokal dan konfigurasi upstream:

    kpt pkg diff wordpress
    
  10. Lakukan inisialisasi paket untuk deployment:

    kpt live init wordpress
    

    Perintah sebelumnya mem-build inventaris konfigurasi yang ada dalam paket. Di antara hal lainnya, kpt menggunakan inventaris untuk pruning konfigurasi saat Anda menghapusnya dari paket. Untuk informasi selengkapnya, lihat kpt live.

  11. Buat secret yang berisi sandi MySQL:

    kubectl create secret generic mysql-pass --from-literal=password=foobar
    
  12. Terapkan konfigurasi ke cluster GKE Anda:

    kpt live apply wordpress
    

    Outputnya akan terlihat seperti berikut:

    installing inventory ResourceGroup CRD.
    inventory update started
    inventory update finished
    apply phase started
    service/wordpress apply successful
    service/wordpress-mysql apply successful
    deployment.apps/wordpress apply successful
    deployment.apps/wordpress-mysql apply successful
    persistentvolumeclaim/mysql-pv-claim apply successful
    persistentvolumeclaim/wp-pv-claim apply successful
    apply phase finished
    reconcile phase started
    service/wordpress reconcile successful
    service/wordpress-mysql reconcile successful
    deployment.apps/wordpress reconcile pending
    deployment.apps/wordpress-mysql reconcile pending
    persistentvolumeclaim/mysql-pv-claim reconcile pending
    persistentvolumeclaim/wp-pv-claim reconcile pending
    persistentvolumeclaim/wp-pv-claim reconcile successful
    persistentvolumeclaim/mysql-pv-claim reconcile successful
    deployment.apps/wordpress-mysql reconcile successful
    deployment.apps/wordpress reconcile successful
    reconcile phase finished
    inventory update started
    inventory update finished
    apply result: 6 attempted, 6 successful, 0 skipped, 0 failed
    reconcile result: 6 attempted, 6 successful, 0 skipped, 0 failed, 0 timed out
    
  13. Tunggu beberapa menit, lalu pastikan semuanya berjalan seperti yang diharapkan:

    kpt live status wordpress
    

    Outputnya akan terlihat seperti berikut:

    inventory-88521939/deployment.apps/default/wordpress is Current: Deployment is available. Replicas: 1
    inventory-88521939/persistentvolumeclaim/default/wp-pv-claim is Current: PVC is Bound
    inventory-88521939/service/default/wordpress-mysql is Current: Service is ready
    inventory-88521939/persistentvolumeclaim/default/mysql-pv-claim is Current: PVC is Bound
    inventory-88521939/deployment.apps/default/wordpress-mysql is Current: Deployment is available. Replicas: 1
    inventory-88521939/service/default/wordpress is Current: Service is ready
    

Mengupdate paket lokal Anda

Di bagian ini, Anda akan mengupdate versi lokal paket dengan beberapa perubahan dari paket upstream.

  1. Buat repositori Git untuk konfigurasi Anda serta konfigurasikan email dan nama Anda. Anda memerlukan repositori Git lokal agar dapat mengupdate paket. Ganti YOUR_EMAIL dengan alamat email Anda dan ganti YOUR_NAME dengan nama Anda.

    cd wordpress/
    git init -b main
    git config user.email "YOUR_EMAIL"
    git config user.name "YOUR_NAME"
    
  2. Commit konfigurasi Anda:

    git add .
    git commit -m "First version of Wordpress package"
    cd ..
    
  3. Update paket lokal Anda. Pada langkah ini, Anda akan menarik versi v0.10 dari upstream.

    kpt pkg update wordpress@v0.10
    
  4. Perhatikan bahwa update dari upstream diterapkan ke paket lokal Anda:

    cd wordpress/
    git diff
    

    Dalam hal ini, update telah mengubah volume deployment wordpress dari 3Gi menjadi 4Gi. Anda juga dapat melihat perubahan yang Anda buat sendiri.

  5. Commit perubahan Anda:

    git commit -am "Update to package version v0.10"
    
  6. Terapkan versi baru paket:

    kpt live apply .
    

Menghapus resource dan paket

Karena kpt melacak resource yang dibuatnya, kpt dapat melakukan pruning resource dari cluster saat Anda menghapus resource dari paket. Juga bisa benar-benar menghapus paket dari cluster. Di bagian ini, Anda akan menghapus resource dari paket, lalu menghapus paket tersebut.

  1. Hapus file service.yaml dari paket:

    git rm service.yaml
    git commit -m "Remove service"
    
  2. Terapkan perubahan, lalu pastikan bahwa kpt telah melakukan pruning pada layanan wordpress:

    kpt live apply .
    kubectl get svc
    
  3. Hapus paket lainnya dari cluster, lalu pastikan bahwa Anda tidak memiliki sisa paket di cluster:

    kpt live destroy .
    kubectl get deployment
    

Menggunakan kpt untuk hardening GKE Anda

Perintah kpt live bukan satu-satunya cara agar Anda dapat menerapkan paket ke cluster Kubernetes. Di bagian ini, Anda akan menggunakan kpt dengan Config Sync dalam skenario dasar tetapi realistis. Dengan alat Config Sync, Anda dapat mengelola konfigurasi secara terpusat, seragam, dan deklaratif untuk semua cluster Kubernetes dari repositori Git. GKE Enterprise (yang Anda gunakan dalam tutorial ini) mencakup Config Sync.

Blueprint keamanan GKE Enterprise memberi Anda berbagai setelan keamanan dalam bentuk paket untuk workload berbasis GKE Enterprise. Di bagian ini, Anda akan menggunakan blueprint membatasi traffic dan direktorinya di repositori GitHub). Anda menggunakan kpt untuk mendownload paket default-deny. Paket ini menggunakan kebijakan jaringan Kubernetes untuk menolak traffic apa pun di cluster GKE secara default (kecuali untuk resolusi DNS). Untuk menerapkan konfigurasi, Anda kemudian meng-commit konfigurasi ke repositori Git Config Sync.

Menginstal Config Sync

Di bagian ini, Anda akan membuat repositori Git yang diperlukan Config Sync, lalu menginstal Config Sync pada cluster GKE.

  1. Di Cloud Shell, gunakan Cloud Source Repositories untuk membuat repositori Git untuk Config Sync:

    cd ~
    gcloud source repos create config-management
    
  2. Buat pasangan kunci SSH untuk melakukan autentikasi pada repositori Git:

    cd ~
    ssh-keygen -t rsa -b 4096  -N '' \
       -f cloud_source_repositories_key
    
  3. Buat Secret Kubernetes yang berisi kunci pribadi SSH untuk mengakses repositori Git:

    kubectl create ns config-management-system && \
    kubectl create secret generic git-creds \
      --namespace=config-management-system \
      --from-file=ssh=cloud_source_repositories_key
    
  4. Tampilkan kunci publik, lalu salin:

    cat cloud_source_repositories_key.pub
    
  5. Buka Cloud Source Repositories

    Halaman Mengelola Kunci SSH.

  6. Pada dialog Daftarkan SSH Key yang muncul, masukkan nilai berikut:

    1. Di kolom Nama Kunci, masukkan config-management.
    2. Tempelkan kunci publik pada kolom Kunci.
    3. Klik Daftar.
  7. Buat clone repositori Git ke Cloud Shell:

    gcloud source repos clone config-management
    cd config-management
    git checkout -b main
    
  8. Download alat command line Config Sync yang disebut nomos. nomos harus diinstal di dalam lingkungan Cloud Shell Anda. Jika belum, instal dengan perintah berikut:

    sudo apt update && sudo apt-get install google-cloud-sdk-nomos
    
  9. Lakukan inisialisasi repositori Config Sync:

    nomos init
    git add .
    git commit -m "Config Management directory structure"
    git push -u origin main
    
  10. Deploy operator Config Sync:

    gsutil cp gs://config-management-release/released/latest/config-management-operator.yaml /tmp/config-management-operator.yaml
    kubectl apply -f /tmp/config-management-operator.yaml
    

Mengonfigurasi Config Sync

  1. Buat resource khusus ConfigManagement untuk mengonfigurasi Config Sync:

    PROJECT=$(gcloud config get-value project)
    EMAIL=$(gcloud config get-value account)
    cat <<EOF > /tmp/config-management.yaml
    apiVersion: configmanagement.gke.io/v1
    kind: ConfigManagement
    metadata:
      name: config-management
    spec:
      clusterName: kpt-tutorial
      git:
        syncRepo: ssh://${EMAIL}@source.developers.google.com:2022/p/${PROJECT}/r/config-management
        syncBranch: main
        secretType: ssh
    EOF
    kubectl -n config-management-system \
        apply -f /tmp/config-management.yaml
    

    Untuk opsi penginstalan lainnya, lihat dokumentasi penginstalan Config Sync.

  2. Di Cloud Shell, pastikan Config Sync berfungsi dengan benar:

    nomos status --contexts=$(kubectl config current-context)
    

    Perintah ini akan menampilkan status sebagai SYNCED. Config Sync mungkin memerlukan beberapa saat untuk diinisialisasi. Jika statusnya belum diupdate, tunggu beberapa menit, lalu jalankan kembali perintah.

Terapkan blueprint keamanan GKE Enterprise

Di bagian ini, Anda akan menggunakan kpt untuk mendownload paket default-deny dari blueprint keamanan GKE Enterprise yang membatasi traffic. Kemudian, Anda menggunakan Config Sync untuk menerapkan paket hanya ke namespace default.

  1. Download paket default-deny:

    cd ~
    kpt pkg get https://github.com/GoogleCloudPlatform/anthos-security-blueprints.git/restricting-traffic/default-deny ./
    

    Anda dapat mempelajari konten paket: file default-deny/Kptfile berisi metadata paket, dan file default-deny/default-deny.yaml berisi Kubernetes NetworkPolicy, yang merupakan satu-satunya konfigurasi dari blueprint ini.

  2. Gunakan kpt untuk menyalin konten paket di repositori Config Sync, lalu tambahkan label untuk menyesuaikannya:

    kpt fn source default-deny/ | \
        kpt fn eval - --image=gcr.io/kpt-fn/set-annotations:v0.1 -- \
        anthos-security-blueprint=restricting-traffic | \
        kpt fn sink ~/config-management/namespaces/default/
    

    Seperti yang ditunjukkan dalam contoh ini, Anda dapat menggunakan pipe untuk merangkai perintah kpt fn secara bersamaan. Membuat rantai perintah kpt fn memungkinkan Anda membaca konfigurasi, mengubahnya sesuai keinginan, dan menulis hasilnya. Anda dapat merangkai perintah kpt fn sebanyak yang Anda inginkan.

  3. Buat file namespace.yaml di repositori Config Sync:

    cat >> ~/config-management/namespaces/default/namespace.yaml <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: default
    EOF
    

    Namespace default ada di cluster GKE, tetapi Config Sync tidak mengelolanya. Saat Anda membuat direktori dan file pada langkah ini, Anda membuat Config Sync mengelola namespace. Untuk menerapkan paket ke beberapa namespace sekaligus, Anda dapat membuat namespace abstrak.

  4. Pastikan bahwa NetworkPolicies Kubernetes ditulis ke repositori Config Sync, dan dianotasi dengan anthos-security-blueprint: restricting-traffic:

    cat config-management/namespaces/default/default-deny.yaml
    

    Outputnya akan terlihat seperti berikut:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata: # kpt-merge: /default-deny
      name: default-deny
      annotations:
        internal.kpt.dev/upstream-identifier: 'networking.k8s.io|NetworkPolicy|default|default-deny'
        anthos-security-blueprint: restricting-traffic
    spec:
      policyTypes:
      - Ingress
      - Egress
      podSelector: {}
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              k8s-namespace: kube-system
          podSelector:
            matchExpressions:
            - key: k8s-app
              operator: In
              values: ["kube-dns", "node-local-dns"]
        ports:
        - protocol: TCP
          port: 53
        - protocol: UDP
          port: 53
    
  5. Commit dan kirim perubahan:

    cd ~/config-management/
    git add namespaces/default/
    git commit -m "Default deny"
    git push
    
  6. Pastikan kebijakan baru diterapkan:

    kubectl get networkpolicies
    

    Jika kebijakan baru muncul, tunggu beberapa detik, lalu jalankan perintah kembali. Config Sync mengupdate konfigurasi setiap 15 detik secara default. Jika Anda perlu melakukan beberapa pemecahan masalah tambahan, jalankan perintah berikut untuk mendapatkan informasi tentang potensi error Config Sync:

    nomos status --contexts=$(kubectl config current-context)
    
  7. Untuk menguji kebijakan baru, dapatkan shell di pod yang berjalan di dalam namespace default:

    kubectl -n default run -i --tty --rm test \
            --image=busybox --restart=Never -- sh
    
  8. Coba ping 8.8.8.8, dan lihat apakah URL tersebut memang tidak berfungsi seperti yang diharapkan:

    ping -c 3 -W 1 8.8.8.8
    

    Outputnya akan terlihat seperti berikut:

    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    
    --- 8.8.8.8 ping statistics ---
    3 packets transmitted, 0 packets received, 100% packet loss
    
  9. Coba buat kueri server Kubernetes API, dan lihat apakah server tersebut memang tidak berfungsi seperti yang diharapkan:

    wget --timeout=3 https://${KUBERNETES_SERVICE_HOST}
    

    Outputnya akan terlihat seperti berikut:

    Connecting to 10.3.240.1 (10.3.240.1:443)
    wget: download timed out
    
  10. Keluar dari pod:

    exit
    

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

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource

Jika ingin menyimpan project Google Cloud yang telah Anda gunakan dalam tutorial ini, Anda dapat menghapus repositori Git dan cluster GKE. Pada Cloud Shell, jalankan perintah berikut:

gcloud source repos delete config-management --quiet
gcloud container clusters delete kpt-tutorial \
    --async --quiet --zone=us-central1-a

Langkah selanjutnya