Halaman ini menjelaskan cara menggunakan Config Sync untuk mengelola namespace dan memilih objek yang akan disinkronkan Config Sync ke namespace Anda.
Objek resource Kubernetes dapat berupa 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 lebih memfilter 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 tepercaya Anda ke cluster dengan Config Sync yang diinstal atau semua cluster dalam fleet. Namun, dengan menentukan cakupan 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 fleet (Pratinjau)
- Mengonfigurasi objek cakupan namespace dengan pemilih namespace (halaman ini)
Menggunakan namespace eksplisit
Sebaiknya gunakan deklarasi namespace eksplisit saat mengonfigurasi Config Sync karena hal ini 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 menetapkan kolom namespaceStrategy ke explicit. Untuk 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 indirection tambahan.
Karena Anda tidak dapat menambahkan kolom kustom ke jenis resource yang ada, Anda dapat menentukan pemilih dalam objek NamespaceSelector. Kemudian, Anda mereferensikan pemilih tersebut
dengan 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 Anda. Config Sync tidak menyinkronkan objekNamespaceSelectorke cluster Anda. - Untuk setiap objek yang ingin disinkronkan ke satu atau beberapa namespace, ubah konfigurasi objek
untuk menghapus kolom
metadata.namespacedan tambahkan 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 untuk resource. 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 dalam 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 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 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 akan diterapkan ke semua namespace kecuali namespace dengan 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"Kuota 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 sewa fleet menjelaskan secara lebih mendetail cara menggunakan pemilih namespace dengan cakupan tim dan fleet 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 menentukan cakupan 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
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 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, tetapi tidak di direktori namespace.
Contoh arsitektur repositori 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 apa pun yang pada 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