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:
- Mengonfigurasi objek cakupan cluster dengan pemilih cluster
- Mengonfigurasi objek cakupan cluster dengan label paket armada (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 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:
- Tambahkan atau pilih label yang ada di namespace tempat Anda ingin men-deploy.
- Tentukan objek resource
NamespaceSelectordi sumber kebenaran Anda. 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.nameNamespaceSelectorAnda.
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. Anda dapat membuat namespace secara langsung di cluster atau di sumber tepercaya Anda.
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:
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 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:
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 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 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, denganNAMESPACEcocok 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:
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 Role.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