Memecahkan masalah GKE pada webhook AWS

Halaman ini menunjukkan cara menyelesaikan masalah terkait webhook bermasalah atau tidak aman di GKE di AWS.

Jika Anda memerlukan bantuan lainnya, hubungi Cloud Customer Care.

Jenis webhook bermasalah

Webhook penerimaan, atau webhook di Kubernetes, adalah jenis pengontrol penerimaan yang dapat digunakan di cluster Kubernetes untuk memvalidasi atau mengubah permintaan ke bidang kontrol sebelum permintaan dipertahankan. Umumnya aplikasi pihak ketiga menggunakan webhook yang beroperasi di resource dan namespace yang penting bagi sistem. Webhook yang tidak dikonfigurasi dengan benar dapat memengaruhi performa dan keandalan bidang kontrol. Misalnya, webhook yang tidak dikonfigurasi dengan benar yang dibuat oleh aplikasi pihak ketiga dapat mencegah GKE di AWS membuat dan mengubah resource di namespace kube-system terkelola, yang dapat menurunkan fungsi cluster.

Webhook bermasalah mencakup jenis berikut:

Webhook yang tidak memiliki endpoint yang tersedia

Jika webhook tidak memiliki endpoint yang tersedia, Layanan yang mendukung endpoint webhook memiliki satu atau beberapa Pod yang tidak berjalan. Untuk menyediakan endpoint webhook, ikuti petunjuk untuk menemukan dan memecahkan masalah Pod dari Layanan yang mendukung endpoint webhook ini:

  1. Menemukan Pod penayangan untuk Service yang terkait dengan webhook. Jalankan perintah berikut untuk mendeskripsikan Layanan:

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    Ganti kode berikut:

    • SERVICE_NAME dengan nama Layanan.
    • SERVICE_NAMESPACE dengan nama namespace.

    Jika Anda tidak dapat menemukan nama Layanan yang tercantum di webhook, endpoint yang tidak tersedia mungkin disebabkan oleh ketidakcocokan antara nama yang tercantum dalam konfigurasi dan nama Layanan yang sebenarnya. Untuk memperbaiki ketersediaan endpoint, perbarui nama Service di konfigurasi webhook agar cocok dengan objek Service yang benar.

  2. Periksa Pod yang aktif untuk Service ini. Identifikasi Pod mana yang tidak berjalan dengan mencantumkan Deployment:

    kubectl get deployment -n SERVICE_NAMESPACE
    

    Atau, jalankan perintah berikut untuk menampilkan Pod:

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    Untuk Pod yang tidak berjalan, periksa log Pod untuk mengetahui alasan Pod tidak berjalan.

Webhook yang dianggap tidak aman

Jika webhook mencegat resource apa pun di namespace yang dikelola sistem, sebaiknya perbarui webhook agar tidak disadap resource tersebut.

  1. Periksa konfigurasi webhook. Jalankan perintah kubectl berikut untuk mendapatkan konfigurasi webhook:

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    Ganti CONFIGURATION_NAME dengan nama konfigurasi webhook.

    Jika perintah ini tidak menampilkan apa pun, jalankan kembali perintah tersebut, dengan mengganti validatingwebhookconfigurations dengan mutatingwebhookconfigurations.

    Di bagian webhooks output, satu atau beberapa webhook dicantumkan.

  2. Edit konfigurasi, bergantung pada alasan webhook dianggap tidak aman:

    Mengecualikan namespace kube-system dan kube-node-lease

    Webhook dianggap tidak aman jika scope adalah *, atau jika cakupannya adalah Namespaced dan salah satu kondisi berikut berlaku:

    • Kondisi operator adalah NotIn dan values menghilangkan kube-system dan kube-node-lease, seperti dalam contoh berikut:

      webhooks:
      - admissionReviewVersions:
        ...
        namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: NotIn
            values:
            - blue-system # add 'kube-system' and 'kube-node-lease' if `NotIn`
        objectSelector: {}
        rules:
        - apiGroups:
          ...
          scope: '*' # 'Namespaced'
        sideEffects: None
        timeoutSeconds: 3
      

      Pastikan scope ditetapkan ke Namespaced, bukan *, sehingga webhook hanya beroperasi di namespace tertentu. Jika operator adalah NotIn, pastikan kube-system, dan kube-node-lease disertakan dalam values.

    • Kondisi operator adalah In dan values menyertakan kube-system dan kube-node-lease, seperti dalam contoh berikut:

      namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values:
            - blue-system
            - kube-system # remove as operator is `In`
            - kube-node-lease # remove as operator is `In`
      

      Pastikan scope ditetapkan ke Namespaced, bukan *, sehingga webhook hanya beroperasi di namespace tertentu. Jika operator adalah In, pastikan kube-system dan kube-node-lease tidak disertakan dalam values.

    Mengecualikan resource yang cocok

    Webhook juga dianggap tidak aman jika nodes, tokenreviews, subjectaccessreviews, atau certificatesigningrequests tercantum di bagian resource, seperti dalam contoh berikut:

    - admissionReviewVersions:
    ...
        resources:
        - 'pods' # keep, remove everything else
        - 'nodes'
        - 'tokenreviews'
        - 'subjectacessreviews'
        - 'certificatesigningrequests'
        scope: '*'
      sideEffects: None
      timeoutSeconds: 3
    

    Hapus nodes, tokenreviews, subjectaccessreviews, dan certificatesigningrequests dari bagian resource.

Langkah selanjutnya

Jika Anda memerlukan bantuan lainnya, hubungi Cloud Customer Care.