Mengonfigurasi namespace dan objek cakupan namespace

Halaman ini menggambarkan cara menggunakan Config Sync untuk mengelola namespace dan objek cakupan namespace.

Mengonfigurasi namespace

Konfigurasi namespace berfungsi secara berbeda untuk repositori tidak terstruktur dan hierarkis. Contoh berikut menyoroti perbedaannya.

Repositori tidak terstruktur

Konfigurasi untuk namespace dan objek cakupan namespace dapat ditempatkan di mana saja dalam direktori atau subdirektori repositori.

Selesaikan langkah-langkah berikut untuk mengonfigurasi namespace bernama gamestore di setiap cluster yang terdaftar:

  1. Buat file namespace-gamestore.yaml dengan konten berikut:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

    Anda hanya perlu membuat satu file YAML yang berisi konfigurasi namespace.

  2. Buat commit yang menyertakan konfigurasi namespace-gamestore.yaml, dan dorong commit ke repositori jarak jauh:

    git add multirepo/root/namespace-gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push REMOTE_NAME BRANCH_NAME
    

    Ganti kode berikut:

    • REMOTE_NAME: nama repositori jarak jauh Anda.
    • BRANCH_NAME: cabang yang ingin Anda commit.

    Contoh ini menambahkan file ke direktori utama, tetapi Anda dapat memindahkan file ini ke subdirektori repositori mana pun.

Repositori hierarkis

Semua konfigurasi untuk namespace dan objek cakupan namespace berada dalam direktori namespaces/ dari repositori hierarkis dan direktori turunannya.

Ikuti langkah-langkah berikut untuk mengonfigurasi namespace bernama gamestore di setiap cluster yang terdaftar:

  1. Di clone lokal repositori Anda, buat direktori namespace. Direktori namespace berisi konfigurasi untuk namespace. Nama direktori namespace harus cocok dengan nama namespace. Dalam contoh ini, direktori disebut namespaces/gamestore:

    mkdir namespaces/gamestore
    
  2. Di direktori namespace, buat file gamestore.yaml, dengan konten berikut:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

    metadata.name harus cocok dengan nama direktori namespace.

  3. Buat commit yang menyertakan konfigurasi gamestore.yaml, dan kirimkan commit ke repositori jarak jauh:

    git add namespaces/gamestore/gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push REMOTE_NAME BRANCH_NAME
    

    Ganti kode berikut:

    • REMOTE_NAME: nama repositori jarak jauh Anda.
    • BRANCH_NAME: cabang yang ingin Anda commit.

Setelah beberapa saat, namespace gamestore akan dibuat di setiap cluster yang terdaftar. Untuk memverifikasi, jelaskan namespace:

kubectl describe namespace gamestore

Untuk menghapus konfigurasi dan menghapus namespace gamestore dari cluster terdaftar, buat commit baru yang menghapus file, dan kirimkan ke repositori jarak jauh. Jangan hapus konfigurasi jika Anda ingin mengonfigurasi namespace abstrak untuk repositori hierarkis.

Mengonfigurasi objek cakupan namespace

Di repositori tidak terstruktur, Anda dapat menyimpan objek cakupan namespace di direktori atau subdirektori apa pun tanpa memerlukan konfigurasi Namespace. Jika konfigurasi Namespace tidak ada, Config Sync akan otomatis membuat objek Namespace implisit, dan menerapkan semua konfigurasi ke namespace tersebut.

Perilaku ini dapat diubah menggunakan kolom namespaceStrategy. Jika namespaceStrategy ditetapkan ke explicit, Config Sync tidak akan otomatis membuat objek Namespace implisit. Untuk informasi selengkapnya, lihat strategi namespace.

Dalam repositori hierarkis, Anda harus menentukan konfigurasi Namespace secara eksplisit di subdirektori namespaces/NAMESPACE, dengan NAMESPACE harus cocok dengan nama namespace. Semua konfigurasi cakupan namespace lainnya juga harus disimpan di subdirektori yang sama. Jika konfigurasi Namespace tidak ada, Config Sync akan menampilkan error KNV1044, yang menunjukkan konfigurasi Namespace tidak ada.

Mengonfigurasi namespace abstrak

Bagian ini hanya berlaku untuk repositori hierarkis karena namespace abstrak tidak didukung di repositori tidak terstruktur.

Contoh ini memperluas contoh dalam mengonfigurasi namespace dengan memindahkan direktori namespace gamestore ke namespace abstrak yang berisi konfigurasi tambahan yang diwarisi oleh namespace gamestore.

  1. Di clone lokal repositori, buat direktori namespace abstrak yang disebut eng:

    mkdir namespaces/eng
    

    Direktori namespace abstrak tidak berisi konfigurasi untuk namespace, tetapi direktori namespace turunannya berisi.

  2. Di direktori namespace abstrak eng, buat konfigurasi untuk Peran yang disebut eng-viewer, yang memberikan get dan list pada semua resource di namespace apa pun yang pada akhirnya mewarisi Peran:

    # namespaces/eng/eng-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: eng-viewer
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    
  3. Buat konfigurasi untuk RoleBinding yang disebut eng-admin yang mengikat Peran eng-viewer ke grup eng@example.com:

    # namespaces/eng/eng-rolebinding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: eng-admin
    subjects:
    - kind: Group
      name: eng@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: eng-viewer
      apiGroup: rbac.authorization.k8s.io
    
  4. Pindahkan direktori namespace gamestore dari namespaces/ ke direktori namespaces/eng/:

    mv namespaces/gamestore /namespaces/eng/
    
  5. Lakukan commit pada semua perubahan dan kirimkan ke repositori jarak jauh.

Config Sync akan melihat perubahan tersebut dan menerapkan Peran dan RoleBinding baru ke namespace gamestore di semua cluster yang terdaftar.

Untuk menghapus konfigurasi dan menghapus namespace gamestore dari cluster terdaftar, Anda dapat membuat commit baru yang menghapus seluruh namespace abstrak eng, dan mendorongnya ke repositori jarak jauh.

Membatasi cluster yang terpengaruh oleh konfigurasi

Biasanya, Config Sync menerapkan konfigurasi ke setiap cluster yang terdaftar. Namun, jika konfigurasi berada dalam subdirektori namespaces/ dari repositori hierarkis, Config Sync akan membuat namespace dalam setiap cluster terlebih dahulu, lalu menerapkan semua konfigurasi yang diwarisi ke namespace tersebut. Untuk membatasi cluster yang terpengaruh oleh konfigurasi tertentu berdasarkan label setiap cluster, gunakan ClusterSelector. Untuk mempelajari lebih lanjut, lihat Menggunakan ClusterSelectors.

Membatasi namespace yang terpengaruh oleh konfigurasi

Untuk membatasi namespace yang terpengaruh oleh konfigurasi, gunakan NamespaceSelector. NamespaceSelector adalah jenis konfigurasi khusus yang menggunakan labelSelectors Kubernetes. Anda dapat mendeklarasikan NamespaceSelectors dalam kombinasi dengan konfigurasi untuk objek cakupan namespace dalam repositori tidak terstruktur atau repositori hierarkis untuk membatasi namespace mana yang dapat mewarisi konfigurasi tersebut. NamespaceSelectors mirip, tetapi tidak identik, dengan ClusterSelectors. NamespaceSelector mempersempit kumpulan namespace yang diterapkan konfigurasi.

Untuk mendeklarasikan NamespaceSelector, tambahkan anotasi metadata.namespace atau NamespaceSelector. Mendeklarasikan kedua anotasi tidak valid. Jika resource cakupan namespace tidak mendeklarasikan metadata.namespace atau anotasi NamespaceSelector, Config Sync akan menggunakan namespace "default" cluster.

NamespaceSelectors di repositori tidak terstruktur

Repositori tidak terstruktur tidak harus mendeklarasikan semua namespace untuk objek cakupan namespace di repositori. Objek dapat menentukan metadata.namespace tanpa memiliki objek namespace yang cocok di repositori yang tidak terstruktur. Jika namespace sudah ada di cluster, Config Sync akan membuat objek dalam namespace tersebut. Jika namespace belum ada di cluster, Config Sync akan membuat namespace secara implisit.

Sebelum membuat repositori tidak terstruktur dengan objek yang sebelumnya digunakan di repositori hierarkis, pastikan NamespaceSelectors Anda tidak berlaku untuk resource tambahan.

Saat Anda menghapus objek cakupan namespace dari repositori tidak terstruktur, Config Sync akan menghapus objek tersebut, tetapi tidak menghapus namespace apa pun yang mungkin telah dibuat secara implisit untuk objek tersebut. Perilaku ini terjadi karena Config Sync tidak dapat menyimpulkan kapan aman untuk menghapus namespace yang dibuat secara implisit, sehingga selalu dibiarkan di cluster.

Mode NamespaceSelector

Dalam repositori tidak terstruktur, objek yang mendeklarasikan anotasi NamespaceSelector diterapkan ke semua Namespace yang memenuhi kondisi NamespaceSelector. Namespace dapat dideklarasikan secara statis di sumber kebenaran, atau dapat bersifat dinamis. Untuk mengaktifkan pemilihan dinamis, tetapkan spec.mode ke dynamic. Dalam mode dinamis, pemilihan diperluas ke Namespace yang dideklarasikan secara statis dan yang ada secara dinamis di cluster. Namespace yang dipilih secara dinamis sudah ada di cluster sehingga tidak dikelola oleh Config Sync. Mode default-nya adalah static.

NamespaceSelectors di repositori hierarkis

Dalam repositori hierarkis, objek yang mendeklarasikan anotasi NamespaceSelector diterapkan ke Namespace yang mewarisi konfigurasi tertentu dari Namespace abstrak, terlepas dari struktur direktori direktori namespaces/. ClusterSelector mempersempit kumpulan cluster yang diterapkan konfigurasi, baik konfigurasi menargetkan objek cakupan cluster maupun cakupan namespace.

Lokasi NamespaceSelector

Dalam repositori tidak terstruktur, Anda dapat menempatkan NamespaceSelectors di direktori atau subdirektori mana pun.

Dalam repositori hierarkis, Anda dapat menempatkan NamespaceSelectors di direktori namespace abstrak, tetapi tidak di direktori namespace.

Contoh arsitektur repositori berikut menunjukkan lokasi yang valid dan tidak valid untuk NamespaceSelectors jika Anda menggunakan repositori hierarkis:

namespace-inheritance
...
├── namespaces
│   ├── eng
│   │   ├── gamestore
│   │   │   ├── namespace.yaml
│   │   │   └── ns_selector.yaml  # invalid
│   │   └── ns_selector.yaml  # valid
│   ├── ns_selector.yaml  # valid
│   ├── rnd
│   │   ├── incubator-1
│   │   │   ├── namespace.yaml
│   │   │   └── ns_selector.yaml  # invalid
│   │   └── ns_selector.yaml  # valid

Karena direktori namespaces, eng, dan rnd mewakili namespace abstrak, Anda dapat menempatkan pemilih di dalamnya. Namun, karena direktori gamestore dan incubator-1 mewakili namespace sebenarnya, Anda tidak dapat menempatkan NamespaceSelector di dalamnya.

Contoh NamespaceSelector

Anda dapat menggunakan NamespaceSelector dengan pemilih label untuk menyertakan atau mengecualikan namespace. Kubernetes mendukung pemilih berbasis kesetaraan dan berbasis set. Anda dapat menggabungkan kedua jenis pemilih untuk lebih menyaring namespace mana yang dipilih.

Pemilih label berbasis kesetaraan

Konfigurasi berikut membuat NamespaceSelector yang disebut gamestore-selector. Jika konfigurasi lain mereferensikan NamespaceSelector ini, konfigurasi tersebut hanya dapat diterapkan ke objek dalam namespace yang memiliki label app: gamestore.

kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: gamestore-selector
spec:
  selector:
    matchLabels:
      app: gamestore

Untuk mereferensikan NamespaceSelector dalam konfigurasi, Anda menetapkan anotasi configmanagement.gke.io/namespace-selector ke nama NamespaceSelector.

NamespaceSelector tidak akan berpengaruh hingga Anda mereferensikannya dalam konfigurasi lain. Jika NamespaceSelector gamestore-selector berada dalam hierarki yang sama dengan ResourceQuota berikut, quota, ResourceQuota hanya dibuat di namespace yang memiliki label app: gamestore:

kind: ResourceQuota
apiVersion: v1
metadata:
  name: quota
  annotations:
    configmanagement.gke.io/namespace-selector: gamestore-selector
spec:
  hard:
    pods: "1"
    cpu: "200m"
    memory: "200Mi"

Untuk meringkas, penggunaan NamespaceSelector adalah proses tiga langkah:

  1. Menambahkan label ke Namespace.
  2. Buat konfigurasi NamespaceSelector.
  3. Mereferensikan objek NamespaceSelector dalam konfigurasi lain.

Pemilih label berbasis set

Anda dapat menggunakan pemilih namespace untuk mengecualikan namespace tertentu agar tidak mewarisi resource dalam hierarki menggunakan pemilih label berbasis set.

Dalam contoh ini, saat ResourceQuota dianotasikan dengan NamespaceSelector dengan menetapkan anotasi configmanagement.gke.io/namespace-selector: excludes-exempt-namespaces, ResourceQuota akan dibuat di setiap namespace kecuali namespace yang diberi label quota-exempt: exempt:

kind: NamespaceSelector
 apiVersion: configmanagement.gke.io/v1
 metadata:
   name: excludes-exempt-namespaces
 spec:
   selector:
     matchExpressions:
       - key: quota-exempt
         operator: NotIn
          values:
            - exempt

Integrasi dengan cakupan tim dan namespace fleet

Namespace fleet yang dibuat di Google Cloud secara otomatis memiliki label fleet.gke.io/fleet-scope: your-scope. Semua namespace juga memiliki label kubernetes.io/metadata.name: your-namespace Kubernetes. Anda dapat menggunakan label default ini untuk menyiapkan NamespaceSelector guna memilih namespace armada.

Menonaktifkan pewarisan untuk jenis objek

Objek Kubernetes HierarchyConfig tidak didukung di repositori tidak terstruktur. Contoh berikut hanya berlaku untuk repositori hierarkis.

Anda dapat menonaktifkan pewarisan secara selektif untuk konfigurasi apa pun dengan menetapkan kolom hierarchyMode ke none. HierarchyConfigs disimpan di direktori system/ repositori. Contoh ini menonaktifkan pewarisan untuk RoleBinding.

# system/hierarchy-config.yaml
kind: HierarchyConfig
apiVersion: configmanagement.gke.io/v1
metadata:
  name: rbac
spec:
  resources:
  # Configure Role to only be allowed in leaf namespaces.
  - group: rbac.authorization.k8s.io
    kinds: [ "RoleBinding" ]
    hierarchyMode: none

Langkah selanjutnya