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
NamespaceSelector
di sumber kebenaran Anda. Config Sync tidak menyinkronkan objekNamespaceSelector
ke cluster Anda. - Untuk setiap objek yang ingin Anda sinkronkan ke satu atau beberapa namespace, ubah konfigurasi objek untuk menghapus kolom
metadata.namespace
dan menambahkan anotasiconfigmanagement.gke.io/namespace-selector
dengan nilai yang cocok denganmetadata.name
NamespaceSelector
Anda.
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=gamestore
Ganti
NAMESPACE
dengan 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: gamestore
Jika 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=exempt
Ganti
NAMESPACE
dengan 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: - exempt
Jika 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
, denganNAMESPACE
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:
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
get
danlist
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.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.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