Halaman ini menjelaskan cara menggunakan Config Sync untuk mengelola namespace dan memilih objek yang disinkronkan Config Sync ke namespace Anda.
Objek resource Kubernetes dapat memiliki cakupan cluster atau cakupan 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 menyempurnakan lebih lanjut objek yang disinkronkan.
Sebelum membaca halaman ini, Anda harus sudah memahami konsep Kubernetes berikut:
Tentang objek cakupan 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 tepercaya ke cluster dengan Config Sync terinstal atau semua cluster dalam fleet. Namun, dengan mencakup objek ke cluster atau namespace, Anda dapat mengontrol objek yang disinkronkan ke cluster atau namespace.
Config Sync menawarkan metode berikut untuk mencakup objek Anda:
- Mengonfigurasi objek cakupan cluster dengan pemilih cluster
- Mengonfigurasi objek cakupan cluster dengan label paket fleet (Pratinjau)
- Mengonfigurasi objek cakupan namespace dengan pemilih namespace (halaman ini)
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 default adalah implicit, tetapi Anda dapat mengubah strategi namespace di objek RootSync atau RepoSync dengan menetapkan 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.
Menggunakan pemilih namespace mirip dengan menggunakan
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 menggunakan pemilih tersebut.
Untuk menggunakan pemilih namespace:
- Tambahkan atau pilih label yang ada di namespace tempat Anda ingin men-deploy.
- Tentukan objek resource
NamespaceSelectordi sumber tepercaya. Config Sync tidak menyinkronkan objekNamespaceSelectorke cluster Anda. - Untuk setiap objek yang ingin Anda sinkronkan ke satu atau beberapa namespace, ubah konfigurasi objek
untuk menghapus kolom
metadata.namespacedan menambahkan anotasiconfigmanagement.gke.io/namespace-selectordengan nilai yang cocok denganmetadata.namedariNamespaceSelectorAnda.
Contoh di bagian berikutnya memberikan detail selengkapnya tentang cara menentukan objek NamespaceSelector dan menganotasi objek lain untuk menggunakan NamespaceSelector.
Sebelum memulai
- Instal Config Sync.
- Buat, atau miliki akses ke, sumber tepercaya tempat Anda menyimpan file konfigurasi.
- Jika Anda belum memiliki satu atau beberapa namespace, buat namespace yang ingin Anda cakupkan resource-nya. Anda dapat membuat namespace langsung di cluster atau di sumber tepercaya.
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 diterapkan konfigurasi:
Tambahkan label ke satu atau beberapa namespace:
kubectl label namespace NAMESPACE app=gamestoreGanti
NAMESPACEdengan nama namespace Anda.Jalankan perintah ini untuk setiap namespace yang ingin Anda beri label.
Buat pemilih namespace bernama
gamestore-selector.kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: gamestore-selector spec: selector: matchLabels: app: gamestoreJika konfigurasi objek lain mereferensikan pemilih namespace ini, konfigurasi tersebut hanya dapat diterapkan ke objek di namespace yang memiliki label
app: gamestore.Pemilih namespace tidak akan berpengaruh hingga Anda mereferensikannya dalam konfigurasi lain. Buat kuota objek contoh 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"Kouta resource hanya dibuat di namespace yang memiliki label
app: gamestore.
Contoh pemilih label berbasis set
Contoh berikut menunjukkan cara menggunakan pemilih berbasis set untuk mengecualikan namespace dari objek turunan:
Tambahkan label ke satu atau beberapa namespace:
kubectl label namespace NAMESPACE quota-exempt=exemptGanti
NAMESPACEdengan nama namespace Anda.Jalankan perintah ini untuk setiap namespace yang ingin Anda beri label.
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: - exemptJika konfigurasi objek lain mereferensikan pemilih namespace ini, konfigurasi tersebut akan diterapkan ke semua namespace kecuali yang memiliki pasangan nilai kunci
quota-exempt: exempt.Pemilih namespace tidak akan berpengaruh hingga Anda mereferensikannya dalam konfigurasi lain. Buat kuota objek contoh 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 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 pemilih namespace guna memilih namespace fleet.
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 untuk 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 cakupan namespace dalam
namespaces/direktori repositori hierarkis dan direktori turunannya. - Anda harus menentukan konfigurasi namespace secara eksplisit di
subdirektori
namespaces/NAMESPACE, denganNAMESPACEcocok dengan nama namespace. Semua objek cakupan 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 direktori
namespaces/.
Lokasi pemilih namespace
Dalam 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 mewakili namespace abstrak, Anda dapat menempatkan pemilih di dalamnya. Namun, karena direktori gamestore dan incubator-1 mewakili namespace sebenarnya, Anda tidak dapat menempatkan pemilih namespace di dalamnya.
Mengonfigurasi namespace abstrak
Dengan repositori hierarkis, Anda dapat menggunakan namespace abstrak secara opsional.
Contoh berikut menunjukkan cara memindahkan direktori namespace ke namespace abstrak yang berisi konfigurasi tambahan yang diwarisi oleh namespace:
Di repositori Anda, buat direktori namespace abstrak. Direktori namespace abstrak tidak berisi konfigurasi apa pun untuk namespace, tetapi direktori namespace turunan berisi konfigurasi.
Di direktori namespace abstrak yang Anda buat, buat konfigurasi untuk Peran yang memberikan izin
getdanlistpada 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_NAMEdengan nama peran.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.ioGanti
ROLEBINDING_NAMEdengan nama Peran.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 menetapkan 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