Menyinkronkan objek ke beberapa namespace

Halaman ini menjelaskan cara menggunakan Config Sync untuk mengelola namespace dan memilih objek yang disinkronkan Config Sync ke namespace Anda.

Objek resource Kubernetes dapat dicakup ke cluster atau namespace, bergantung pada jenis resource. Anda memilih cluster dengan mengonfigurasi klien untuk berkomunikasi dengan cluster tertentu. Anda memilih namespace dengan mengonfigurasi kolom metadata.namespace dalam manifes objek. Config Sync menambahkan kemampuan tambahan: pemilih cluster dan pemilih namespace, yang memungkinkan Anda lebih menyempurnakan objek yang disinkronkan.

Sebelum membaca halaman ini, Anda harus sudah memahami konsep Kubernetes berikut:

Tentang cakupan objek dengan Config Sync

Secara default, saat Anda menginstal Config Sync di cluster atau sebagai default fleet, Config Sync akan menyinkronkan semua objek Kubernetes di sumber kebenaran Anda ke cluster dengan Config Sync yang diinstal atau semua cluster dalam fleet. Namun, dengan mencakup objek ke cluster atau namespace, Anda dapat mengontrol objek mana yang disinkronkan ke cluster atau namespace.

Config Sync menawarkan metode berikut untuk menentukan cakupan objek Anda:

Menggunakan namespace eksplisit

Sebaiknya gunakan deklarasi namespace eksplisit saat mengonfigurasi Config Sync karena memungkinkan Anda mengelola metadata namespace dan menghapus namespace nanti, jika diperlukan.

Setelan defaultnya adalah implicit, tetapi Anda dapat mengubah strategi namespace di objek RootSync atau RepoSync dengan menyetel kolom namespaceStrategy ke explicit. Untuk mengetahui informasi selengkapnya, lihat strategi namespace.

Tentang pemilih namespace

Pemilih namespace adalah fitur Config Sync yang memungkinkan Anda men-deploy objek resource yang identik ke beberapa namespace.

Penggunaan pemilih namespace mirip dengan penggunaan pemilih label Kubernetes untuk memetakan Layanan ke sekumpulan Pod, tetapi dengan lapisan pengalihan tambahan. Karena Anda tidak dapat menambahkan kolom kustom ke jenis resource yang ada, Anda harus menentukan pemilih di objek NamespaceSelector. Kemudian, Anda mereferensikan pemilih tersebut berdasarkan nama dalam anotasi pada objek yang ingin Anda gunakan pemilih tersebut.

Untuk menggunakan pemilih namespace:

  1. Tambahkan atau pilih label yang ada di namespace tempat Anda ingin men-deploy.
  2. Tentukan objek resource NamespaceSelector di sumber kebenaran Anda. Config Sync tidak menyinkronkan objek NamespaceSelector ke cluster Anda.
  3. Untuk setiap objek yang ingin Anda sinkronkan ke satu atau beberapa namespace, ubah konfigurasi objek untuk menghapus kolom metadata.namespace dan menambahkan anotasi configmanagement.gke.io/namespace-selector dengan nilai yang cocok dengan metadata.name NamespaceSelector Anda.

Contoh di bagian berikutnya memberikan detail selengkapnya tentang cara menentukan objek NamespaceSelector dan menganotasi objek lain untuk menggunakan NamespaceSelector.

Sebelum memulai

Menggunakan pemilih namespace

Pemilih namespace ditentukan dengan persyaratan berbasis kesetaraan atau persyaratan berbasis set. Anda dapat menggabungkan beberapa persyaratan.

Contoh pemilih label berbasis kesetaraan

Contoh berikut menunjukkan cara menggunakan pemilih berbasis kesetaraan untuk memilih namespace yang akan diterapkan konfigurasi:

  1. Tambahkan label ke satu atau beberapa namespace:

    kubectl label namespace NAMESPACE app=gamestore
    

    Ganti NAMESPACE dengan nama namespace Anda.

    Jalankan perintah ini untuk setiap namespace yang ingin Anda beri label.

  2. Buat pemilih namespace bernama gamestore-selector.

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

    Jika konfigurasi objek lain mereferensikan pemilih namespace ini, konfigurasi tersebut hanya dapat diterapkan ke objek di namespace yang memiliki label app: gamestore.

  3. Pemilih namespace tidak akan berpengaruh hingga Anda mereferensikannya dalam konfigurasi lain. Buat contoh kuota objek yang mereferensikan pemilih namespace:

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

    Kuota resource dibuat hanya di namespace yang memiliki label app: gamestore.

Contoh pemilih label berbasis set

Contoh berikut menunjukkan cara menggunakan pemilih berbasis set untuk mengecualikan namespace dari mewarisi objek:

  1. Tambahkan label ke satu atau beberapa namespace:

    kubectl label namespace NAMESPACE quota-exempt=exempt
    

    Ganti NAMESPACE dengan nama namespace Anda.

    Jalankan perintah ini untuk setiap namespace yang ingin Anda beri label.

  2. Buat pemilih namespace bernama exclude-exempt-namespaces:

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

    Jika konfigurasi objek lain mereferensikan pemilih namespace ini, konfigurasi tersebut diterapkan ke semua namespace kecuali yang memiliki pasangan nilai kunci quota-exempt: exempt.

  3. Pemilih namespace tidak akan berpengaruh hingga Anda mereferensikannya dalam konfigurasi lain. Buat contoh kuota objek yang mereferensikan pemilih namespace:

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

    Kouta resource dibuat di semua namespace, kecuali yang memiliki pasangan nilai kunci quota-exempt: exempt.

Integrasi dengan cakupan tim dan namespace fleet

Namespace fleet yang dibuat di Google Cloud 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 pemilih namespace guna memilih namespace armada.

Tutorial kepemilikan fleet menjelaskan secara lebih mendetail cara menggunakan pemilih namespace dengan fleet dan cakupan tim untuk mengelola objek secara selektif bagi tim yang berbeda.

Objek cakupan namespace dengan mode hierarkis

Meskipun repositori tidak terstruktur direkomendasikan untuk sebagian besar kasus penggunaan, Anda dapat menggunakan pemilih namespace untuk mencakup objek dengan repositori hierarkis. Penggunaan pemilih namespace sama, tetapi ada batasan dan persyaratan tambahan tentang cara Anda mengatur konfigurasi namespace di sumber tepercaya.

Batasan

Saat Anda menggunakan konfigurasi pemilih namespace dengan repositori hierarkis, perhatikan batasan dan persyaratan berikut:

  • Anda harus menyimpan semua file konfigurasi untuk namespace dan objek yang tercakup dalam namespace di direktori namespaces/ dari repositori hierarkis dan direktori turunannya.
  • Anda harus menentukan konfigurasi namespace secara eksplisit di subdirektori namespaces/NAMESPACE, dengan NAMESPACE cocok dengan nama namespace. Semua objek yang tercakup dalam namespace lainnya harus disimpan di subdirektori yang sama. Jika konfigurasi namespace tidak ada, Config Sync akan menampilkan error KNV1044.
  • Resource yang mereferensikan pemilih namespace diterapkan ke namespace yang mewarisi konfigurasi tertentu dari namespace abstrak, terlepas dari struktur direktori namespaces/.

Lokasi pemilih namespace

Di repositori hierarkis, Anda dapat menempatkan konfigurasi pemilih namespace di direktori namespace abstrak mana pun, tetapi tidak di direktori namespace.

Arsitektur repositori contoh berikut menunjukkan lokasi yang valid dan tidak valid untuk pemilih namespace:

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 merepresentasikan namespace abstrak, Anda dapat menempatkan pemilih di dalamnya. Namun, karena direktori gamestore dan incubator-1 merepresentasikan namespace sebenarnya, Anda tidak dapat menempatkan pemilih namespace di dalamnya.

Mengonfigurasi namespace abstrak

Dengan repositori hierarkis, Anda dapat secara opsional menggunakan namespace abstrak.

Contoh berikut menunjukkan cara memindahkan direktori namespace ke namespace abstrak yang berisi konfigurasi tambahan yang diwarisi oleh namespace:

  1. Di repositori Anda, buat direktori namespace abstrak. Direktori namespace abstrak tidak berisi konfigurasi apa pun untuk namespace, tetapi direktori namespace turunan berisi konfigurasi.

  2. Di direktori namespace abstrak yang Anda buat, buat konfigurasi untuk Peran yang memberikan izin get dan list pada semua objek di namespace mana pun yang akhirnya mewarisi Peran:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: ROLE_NAME
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    

    Ganti ROLE_NAME dengan nama peran.

  3. Buat konfigurasi untuk binding peran yang mengikat peran ke grup email:

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ROLE_NAME
    subjects:
    - kind: Group
      name: group@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name:  ROLEBINDING_NAME
      apiGroup: rbac.authorization.k8s.io
    

    Ganti ROLEBINDING_NAME dengan nama Role.

  4. Pindahkan konfigurasi namespace yang Anda buat di bagian sebelumnya dari direktori namespaces/ ke direktori namespace abstrak yang Anda buat di bagian ini.

Menonaktifkan pewarisan untuk objek

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

# 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