Halaman ini mengilustrasikan cara menggunakan Config Sync untuk mengelola namespace dan objek dengan cakupan namespace.
Mengonfigurasi namespace
Mengonfigurasi fungsi namespace secara berbeda untuk tidak terstruktur dan repositori hierarkis. Contoh berikut menunjukkan perbedaannya.
Repositori tidak terstruktur
Konfigurasi untuk namespace dan objek cakupan namespace dapat ditempatkan di mana saja di direktori atau subdirektori repositori.
Selesaikan langkah-langkah berikut untuk mengonfigurasi namespace yang disebut gamestore
di
setiap cluster yang terdaftar:
Buat file
namespace-gamestore.yaml
dengan konten berikut:apiVersion: v1 kind: Namespace metadata: name: gamestore
Anda hanya perlu membuat satu file YAML yang berisi konfigurasi namespace.
Buat commit yang menyertakan konfigurasi
namespace-gamestore.yaml
, dan kirim commit ke repositori jarak jauh:git add multirepo/root/namespace-gamestore.yaml git commit -m "Created gamestore namespace config" git push REMOTE_NAME BRANCH_NAME
Ganti kode berikut:
REMOTE_NAME
: nama remote Anda repositori resource.BRANCH_NAME
: cabang yang ingin Anda commit tempat mesin terhubung.
Contoh ini menambahkan file ke direktori {i>root<i}, tetapi Anda dapat memindahkannya file ke subdirektori mana pun dari repositori.
Repositori hierarkis
Semua konfigurasi untuk namespace dan objek cakupan namespace terletak di dalam direktori
Direktori namespaces/
file
repositori hierarkis dan
direktori turunan.
Ikuti langkah-langkah berikut untuk mengonfigurasi namespace bernama gamestore
di setiap nama yang terdaftar
:
Dalam clone lokal repositori Anda, buat direktori namespace. Namespace berisi konfigurasi untuk namespace. Nama namespace harus sesuai dengan nama namespace. Dalam contoh ini, bernama
namespaces/gamestore
:mkdir namespaces/gamestore
Dalam direktori namespace, buat file
gamestore.yaml
, dengan konten berikut:apiVersion: v1 kind: Namespace metadata: name: gamestore
metadata.name
harus sama dengan nama namespace.Buat commit yang menyertakan konfigurasi
gamestore.yaml
, lalu kirim berkomitmen pada repositori jarak jauh:git add namespaces/gamestore/gamestore.yaml git commit -m "Created gamestore namespace config" git push REMOTE_NAME BRANCH_NAME
Ganti kode berikut:
REMOTE_NAME
: nama remote Anda repositori resource.BRANCH_NAME
: cabang yang ingin Anda commit tempat mesin terhubung.
Setelah beberapa saat, namespace gamestore
akan dibuat di setiap cluster yang terdaftar.
Untuk memverifikasi, deskripsikan namespace:
kubectl describe namespace gamestore
Untuk menghapus konfigurasi dan namespace gamestore
dari cluster terdaftar,
membuat commit baru yang menghapus file, dan mengirimnya ke remote
repositori resource. Jangan hapus konfigurasi jika Anda ingin
mengonfigurasi namespace abstrak untuk
repositori hierarkis.
Mengonfigurasi objek cakupan namespace
Dalam repositori yang tidak terstruktur, Anda dapat menyimpan objek cakupan namespace di jenis resource apa pun tanpa memerlukan konfigurasi Namespace. Jika Namespace tidak ada, Config Sync secara otomatis membuat Namespace implisit , dan menerapkan semua konfigurasi ke namespace tersebut.
Perilaku ini dapat diubah menggunakan kolom namespaceStrategy
. Jika
namespaceStrategy
disetel ke explicit
, maka Config Sync tidak akan
membuat objek Namespace implisit secara otomatis. Untuk informasi selengkapnya, lihat
strategi namespace.
Dalam repositori hierarkis, Anda harus secara eksplisit menentukan konfigurasi Namespace di
subdirektori namespaces/NAMESPACE
, dengan NAMESPACE
harus sama dengan nama namespace. Semua konfigurasi cakupan namespace lainnya harus
disimpan di subdirektori yang sama. Jika konfigurasi Namespace tidak ada,
Config Sync menampilkan error KNV1044, yang menunjukkan konfigurasi Namespace yang tidak ada.
Mengonfigurasi namespace abstrak
Bagian ini hanya berlaku untuk repositori hierarkis karena namespace abstrak tidak didukung di repositori tidak terstruktur.
Contoh ini memperluas contoh dalam mengonfigurasi namespace
dengan memindahkan direktori namespace gamestore
ke namespace abstrak
berisi konfigurasi tambahan yang diwarisi oleh namespace gamestore
.
Dalam clone lokal repositori, buat direktori namespace abstrak disebut
eng
:mkdir namespaces/eng
Direktori namespace abstrak tidak berisi untuk namespace, tetapi direktori namespace turunannya akan melakukannya.
Di direktori namespace abstrak
eng
, buat konfigurasi untuk Peran yang disebuteng-viewer
, yang memberikanget
danlist
pada semua resource dalam yang pada akhirnya mewarisi Peran:# namespaces/eng/eng-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: eng-viewer rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]
Buat konfigurasi untuk RoleBinding bernama
eng-admin
yang mengikateng-viewer
Peran ke grupeng@example.com
:# namespaces/eng/eng-rolebinding.yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: eng-admin subjects: - kind: Group name: eng@example.com apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: eng-viewer apiGroup: rbac.authorization.k8s.io
Pindahkan direktori namespace
gamestore
darinamespaces/
ke Direktorinamespaces/eng/
:mv namespaces/gamestore /namespaces/eng/
Commit semua perubahan Anda dan kirim ke remote untuk repositori.
Config Sync mendeteksi perubahan dan menerapkan RoleBinding dan RoleBinding baru ke
namespace gamestore
di semua cluster yang terdaftar.
Untuk menghapus konfigurasi dan namespace gamestore
dari cluster terdaftar,
Anda dapat membuat commit baru yang menghapus seluruh abstrak eng
namespace, dan mengirimnya ke repositori jarak jauh.
Membatasi cluster mana yang terpengaruh oleh konfigurasi
Biasanya, Config Sync menerapkan konfigurasi untuk setiap cluster yang terdaftar. Namun, jika
konfigurasi berada dalam subdirektori namespaces/
dari hierarkis
repositori, Config Sync terlebih dahulu
membuat namespace dalam setiap cluster lalu menerapkan semua konfigurasi yang diwarisi
ke namespace tersebut. Untuk membatasi cluster mana yang dipengaruhi oleh konfigurasi tertentu berdasarkan
setiap label cluster, gunakan
ClusterSelector. Untuk mempelajari lebih lanjut, lihat
Menggunakan ClusterSelectors.
Membatasi namespace mana yang terpengaruh oleh konfigurasi
Untuk membatasi namespace mana yang terpengaruh oleh konfigurasi, gunakan NamespaceSelector. J NamespaceSelector adalah jenis konfigurasi khusus yang menggunakan Kubernetes labelSelectors. Anda dapat mendeklarasikan Pemilih Namespace dalam kombinasi dengan konfigurasi untuk objek dengan cakupan namespace dalam repositori tidak terstruktur atau repositori hierarkis untuk membatasi namespace mana yang dapat mewarisi konfigurasi itu. NamespaceSelectors serupa, tetapi tidak sama, agar ClusterSelectors. NamespaceSelector mempersempit kumpulan namespace tempat konfigurasi diterapkan.
Untuk mendeklarasikan NamespaceSelector, tambahkan metadata.namespace
atau
anotasi NamespaceSelector
. Mendeklarasikan kedua anotasi tidak valid. Jika
resource cakupan namespace tidak mendeklarasikan metadata.namespace
atau
NamespaceSelector
, lalu Config Sync menggunakan
"default" namespace.
NamespaceSelector di repositori tidak terstruktur
Repositori tidak terstruktur tidak perlu mendeklarasikan
semua namespace untuk objek cakupan namespace dalam repositori. Sebuah objek dapat
menentukan metadata.namespace
tanpa memiliki objek namespace yang cocok dalam
repositori tak terstruktur. Jika namespace sudah ada di cluster,
Config Sync membuat objek dalam namespace tersebut. Jika
belum ada di cluster, Config Sync membuat
namespace secara implisit.
Sebelum Anda membuat repositori tidak terstruktur dengan objek
yang sebelumnya digunakan dalam repositori hierarkis, verifikasi bahwa
NamespaceSelectors
tidak berlaku untuk resource tambahan.
Saat Anda menghapus objek dengan cakupan namespace dari repositori yang tidak terstruktur, Config Sync menghapus objek tersebut, tetapi tidak menghapus namespace yang mungkin telah dibuat secara implisit untuk objek itu. Perilaku ini terjadi karena Config Sync tidak dapat menyimpulkan kapan aman untuk menghapus namespace yang dibuat secara implisit, sehingga selalu berada di cluster.
Mode NamespaceSelector
Dalam repositori tidak terstruktur, objek yang mendeklarasikan NamespaceSelector
diterapkan ke semua Namespace yang memenuhi kondisi
NamespaceSelector
. Pada versi Config Sync yang lebih lama dari 1.17.0,
Anotasi NamespaceSelector
hanya berlaku untuk Namespace yang cocok yang
dideklarasikan secara statis
di sumber kebenaran. Pada versi 1.17.0 dan yang lebih baru,
Objek NamespaceSelector
mendukung mode dinamis dengan menyetel spec.mode
ke
dynamic
. Dalam mode dinamis, pilihan akan diperluas ke elemen yang dideklarasikan secara statis
Namespace dan namespace yang ada secara dinamis di cluster. Namespace yang dipilih
secara dinamis sudah ada di cluster, sehingga tidak dikelola oleh
Sinkronisasi Konfigurasi. Mode default-nya adalah static
.
NamespaceSelectors di repositori hierarkis
Dalam repositori hierarkis, objek yang mendeklarasikan NamespaceSelector
diterapkan ke Namespace yang mewarisi konfigurasi tertentu dari
Namespace abstrak, terlepas dari struktur direktori namespaces/
saat ini. ClusterSelector mempersempit kumpulan cluster tempat konfigurasi diterapkan,
apakah konfigurasi menargetkan objek cakupan cluster atau cakupan namespace.
Lokasi Pemilih Namespace
Dalam repositori yang tidak terstruktur, Anda dapat menempatkan Pemilih Namespace di direktori atau subdirektori mana pun.
Dalam repositori hierarkis, Anda bisa menempatkan NamespaceSelector di direktori namespace abstrak apa pun, tetapi tidak di direktori namespace.
Contoh arsitektur repositori berikut menunjukkan arsitektur repositori yang valid dan tidak valid untuk NamespaceSelectors jika Anda menggunakan repositori hierarkis:
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 abstrak,
Anda dapat menempatkan pemilih di dalamnya. Namun, karena gamestore
dan
Direktori incubator-1
mewakili namespace sebenarnya, Anda tidak dapat menempatkan
NamespaceSelector di dalamnya.
Contoh NamespaceSelector
Anda dapat menggunakan NamespaceSelector
dengan pemilih label untuk menyertakan atau mengecualikan
namespace. Dukungan Kubernetes
pemilih berbasis kesetaraan dan berbasis set.
Anda dapat menggabungkan kedua jenis pemilih untuk lebih menyaring namespace mana yang
dipilih.
Pemilih label berbasis kesetaraan
Konfigurasi berikut membuat NamespaceSelector bernama gamestore-selector
. Jika
merujuk pada NamespaceSelector ini, konfigurasi itu hanya dapat
diterapkan pada objek dalam namespace yang memiliki label app: gamestore
.
kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
name: gamestore-selector
spec:
selector:
matchLabels:
app: gamestore
Untuk mereferensikan NamespaceSelector dalam konfigurasi, Anda mengatur
anotasi configmanagement.gke.io/namespace-selector
menjadi nama
Pemilih Namespace.
NamespaceSelector tidak berpengaruh hingga Anda mereferensikannya dalam konfigurasi lain.
Jika NamespaceSelector gamestore-selector
berada dalam hierarki yang sama dengan
setelah ResourceQuota, quota
, ResourceQuota hanya dibuat di
namespace yang memiliki label app: gamestore
:
kind: ResourceQuota
apiVersion: v1
metadata:
name: quota
annotations:
configmanagement.gke.io/namespace-selector: gamestore-selector
spec:
hard:
pods: "1"
cpu: "200m"
memory: "200Mi"
Ringkasnya, ada tiga langkah menggunakan NamespaceSelector:
- Menambahkan label ke Namespace.
- Membuat konfigurasi NamespaceSelector.
- Mereferensikan objek NamespaceSelector di konfigurasi lain.
Setel pemilih label berbasis
Anda dapat menggunakan pemilih namespace untuk mengecualikan namespace tertentu agar tidak mewarisi resource pada hierarki menggunakan pemilih label berbasis set.
Dalam contoh ini, saat ResourceQuota
dianotasi dengan NamespaceSelector
dengan menyetel anotasi configmanagement.gke.io/namespace-selector: excludes-exempt-namespaces
,
ResourceQuota
dibuat di setiap namespace kecuali namespace apa pun yang
berlabel quota-exempt: exempt
:
kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
name: excludes-exempt-namespaces
spec:
selector:
matchExpressions:
- key: quota-exempt
operator: NotIn
values:
- exempt
Integrasi dengan cakupan tim dan namespace fleet
Namespace perangkat yang dibuat di Google Cloud akan otomatis memiliki label
fleet.gke.io/fleet-scope: your-scope
. Semua namespace juga memiliki Kubernetes
Label kubernetes.io/metadata.name: your-namespace
. Anda dapat menggunakan opsi default
label untuk menyiapkan NamespaceSelector
guna memilih namespace fleet.
Menonaktifkan pewarisan untuk jenis objek
Objek Kubernetes HierarchyConfig tidak didukung di repositori tidak terstruktur. Contoh berikut hanya berlaku untuk repositori hierarkis.
Anda dapat menonaktifkan pewarisan secara selektif untuk setiap konfigurasi dengan mengatur
hierarchyMode
menjadi none
. HierarchyConfig disimpan di system/
repositori resource. Contoh ini menonaktifkan pewarisan untuk RoleBinding.
# 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
Langkah selanjutnya
- Pelajari cara mengonfigurasi cluster dan objek cakupan cluster