Mengonfigurasi namespace dan objek cakupan namespace
Halaman ini mengilustrasikan cara menggunakan Config Sync untuk mengelola namespace dan objek cakupan namespace.
Mengonfigurasi namespace
Mengonfigurasi namespace berfungsi secara berbeda untuk repositori tidak terstruktur dan hierarkis. Contoh berikut menyoroti perbedaannya.
Repositori tidak terstruktur
Konfigurasi untuk namespace dan objek cakupan namespace dapat ditempatkan di mana saja dalam direktori atau subdirektori repositori.
Selesaikan langkah-langkah berikut untuk mengonfigurasi namespace bernama 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
, lalu 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 repositori jarak jauh Anda.BRANCH_NAME
: cabang yang ingin Anda tetapkan.
Contoh ini akan menambahkan file ke direktori utama, tetapi Anda dapat memindahkan file ini ke salah satu subdirektori repositori.
Repositori hierarkis
Semua konfigurasi untuk namespace dan objek cakupan namespace terletak dalam
direktori namespaces/
repositori hierarkis dan
direktori turunannya.
Ikuti langkah-langkah berikut untuk mengonfigurasi namespace yang disebut gamestore
di setiap cluster
yang terdaftar:
Di clone lokal repositori Anda, buat direktori namespace. Direktori namespace berisi konfigurasi untuk namespace. Nama direktori namespace harus sama dengan nama namespace. Dalam contoh ini, direktori disebut
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 cocok dengan nama direktori namespace.Buat commit yang menyertakan konfigurasi
gamestore.yaml
, lalu kirim commit ke 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 repositori jarak jauh Anda.BRANCH_NAME
: cabang yang ingin Anda tetapkan.
Setelah beberapa saat, namespace gamestore
akan dibuat di setiap cluster yang terdaftar.
Untuk memverifikasi, jelaskan namespace:
kubectl describe namespace gamestore
Untuk menghapus konfigurasi dan menghapus namespace gamestore
dari cluster terdaftar,
buat commit baru yang menghapus file, lalu kirim ke repositori
jarak jauh. Jangan hapus konfigurasi jika Anda ingin mengonfigurasi namespace abstrak untuk repositori hierarkis.
Mengonfigurasi objek cakupan namespace
Dalam repositori tidak terstruktur, Anda dapat menyimpan objek dengan cakupan namespace di direktori atau subdirektori mana pun tanpa memerlukan konfigurasi Namespace. Jika konfigurasi Namespace tidak ada, Config Sync akan otomatis membuat objek Namespace implisit, dan menerapkan semua konfigurasi ke namespace tersebut.
Perilaku ini dapat diubah menggunakan kolom namespaceStrategy
. Jika namespaceStrategy
ditetapkan ke explicit
, Config Sync tidak akan otomatis membuat objek Namespace implisit. Untuk mengetahui informasi selengkapnya, lihat
strategi namespace.
Dalam repositori hierarkis, Anda harus secara eksplisit menentukan konfigurasi Namespace di subdirektori namespaces/NAMESPACE
, di mana NAMESPACE
harus cocok dengan nama namespace. Semua konfigurasi cakupan namespace lainnya juga harus disimpan di subdirektori yang sama. Jika konfigurasi Namespace tidak ada,
Config Sync akan 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
yang berisi konfigurasi tambahan yang diwarisi oleh namespace gamestore
.
Di clone lokal repositori, buat direktori namespace abstrak yang disebut
eng
:mkdir namespaces/eng
Direktori namespace abstrak tidak berisi konfigurasi untuk namespace, tetapi direktori namespace turunannya memilikinya.
Dalam direktori namespace abstrak
eng
, buat konfigurasi untuk Peran yang disebuteng-viewer
, yang memberikanget
danlist
pada semua resource di namespace apa pun yang pada akhirnya mewarisi Peran tersebut:# 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 mengikat Peraneng-viewer
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 mengetahui perubahan tersebut dan menerapkan Role dan RoleBinding baru ke namespace gamestore
di semua cluster yang terdaftar.
Untuk menghapus konfigurasi dan menghapus namespace gamestore
dari cluster yang terdaftar,
Anda dapat membuat commit baru yang menghapus seluruh namespace abstrak
eng
, lalu mengirimnya ke repositori jarak jauh.
Membatasi cluster mana yang terpengaruh oleh konfigurasi
Biasanya, Config Sync menerapkan konfigurasi ke setiap cluster yang terdaftar. Namun, jika konfigurasi berada dalam subdirektori namespaces/
dari repositori hierarkis, Config Sync akan membuat namespace dalam setiap cluster terlebih dahulu, lalu menerapkan semua konfigurasi yang diwarisi ke namespace tersebut. Untuk membatasi cluster mana yang terpengaruh oleh konfigurasi tertentu berdasarkan
label setiap cluster, gunakan ClusterSelector. Untuk mempelajari lebih lanjut, lihat
Menggunakan ClusterSelectors.
Membatasi namespace yang terpengaruh oleh konfigurasi
Untuk membatasi namespace yang terpengaruh oleh konfigurasi, gunakan NamespaceSelector. NamespaceSelector adalah jenis konfigurasi khusus yang menggunakan labelSelectors Kubernetes. Anda dapat mendeklarasikan NamespaceSelectors bersama konfigurasi untuk objek yang tercakup namespace dalam repositori tidak terstruktur atau repositori hierarkis untuk membatasi namespace mana yang dapat mewarisi konfigurasi tersebut. NamespaceSelectors mirip, tetapi tidak identik, dengan ClusterSelectors. NamespaceSelector mempersempit kumpulan namespace tempat konfigurasi diterapkan.
Untuk mendeklarasikan NamespaceSelector, tambahkan anotasi metadata.namespace
atau
NamespaceSelector
. Mendeklarasikan kedua anotasi tidak valid. Jika resource cakupan namespace tidak mendeklarasikan metadata.namespace
atau anotasi NamespaceSelector
, Config Sync akan menggunakan namespace "default" cluster.
NamespaceSelector di repositori tidak terstruktur
Repositori tidak terstruktur tidak harus mendeklarasikan
semua namespace untuk objek cakupan namespace di repositori. Objek dapat
menentukan metadata.namespace
tanpa memiliki objek namespace yang cocok dalam
repositori tidak terstruktur. Jika namespace sudah ada di cluster,
Config Sync akan membuat objek dalam namespace tersebut. Jika namespace belum ada di cluster, Config Sync akan membuat namespace secara implisit.
Sebelum Anda membuat repositori tidak terstruktur dengan objek
yang sebelumnya digunakan dalam repositori hierarkis, pastikan
NamespaceSelectors
Anda tidak berlaku untuk resource tambahan.
Saat Anda menghapus objek cakupan namespace dari repositori tidak terstruktur, Config Sync akan menghapus objek tersebut, tetapi tidak menghapus namespace yang mungkin telah dibuat secara implisit untuk objek tersebut. Perilaku ini terjadi karena Config Sync tidak dapat menyimpulkan kapan waktu yang aman untuk menghapus namespace yang dibuat secara implisit, sehingga selalu ditinggalkan di cluster.
Mode Pemilih Namespace
Dalam repositori tidak terstruktur, objek yang mendeklarasikan anotasi NamespaceSelector
diterapkan ke semua Namespace yang memenuhi kondisi
NamespaceSelector
. Pada versi Config Sync sebelum 1.17.0, anotasi NamespaceSelector
hanya berlaku untuk Namespace yang cocok yang dideklarasikan secara statis dalam sumber tepercaya. Pada versi 1.17.0 dan yang lebih baru, objek NamespaceSelector
mendukung mode dinamis dengan menetapkan spec.mode
ke
dynamic
. Dalam mode dinamis, pilihan mencakup namespace yang dideklarasikan secara statis dan yang ada secara dinamis di cluster. Namespace yang dipilih
secara dinamis sudah ada di cluster sehingga tidak dikelola oleh
Config Sync. Mode default-nya adalah static
.
NamespaceSelectors dalam repositori hierarkis
Dalam repositori hierarkis, objek yang mendeklarasikan anotasi NamespaceSelector
diterapkan ke Namespace yang mewarisi konfigurasi tertentu dari
Namespace abstrak, terlepas dari struktur direktori direktori
namespaces/
. ClusterSelector mempersempit kumpulan cluster tempat konfigurasi diterapkan,
baik konfigurasi tersebut menargetkan objek cakupan cluster maupun cakupan namespace.
Lokasi NamespaceSelector
Dalam repositori tidak terstruktur, Anda dapat menempatkan NamespaceSelectors di direktori atau subdirektori mana pun.
Dalam repositori hierarkis, Anda dapat menempatkan NamespaceSelectors di direktori namespace abstrak mana pun, tetapi bukan di direktori namespace.
Contoh arsitektur repositori berikut menunjukkan lokasi 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 namespace
abstrak, Anda dapat menempatkan pemilih di dalamnya. Namun, karena direktori gamestore
dan
incubator-1
merepresentasikan namespace yang sebenarnya, Anda tidak dapat menempatkan
NamespaceSelector di dalamnya.
Contoh NamespaceSelector
Anda dapat menggunakan NamespaceSelector
dengan pemilih label untuk menyertakan atau mengecualikan
namespace. Kubernetes mendukung 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 yang disebut gamestore-selector
. Jika
konfigurasi lain mereferensikan NamespaceSelector ini, konfigurasi tersebut 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, tetapkan
anotasi configmanagement.gke.io/namespace-selector
ke nama
NamespaceSelector.
NamespaceSelector tidak berpengaruh sampai Anda mereferensikannya dalam konfigurasi lain.
Jika NamespaceSelector gamestore-selector
berada dalam hierarki yang sama dengan
ResourceQuota, quota
berikut, 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, penggunaan NamespaceSelector adalah proses tiga langkah:
- Menambahkan label ke Namespace.
- Membuat konfigurasi NamespaceSelector.
- Mereferensikan objek NamespaceSelector dalam konfigurasi lain.
Pemilih label berbasis penetapan
Anda dapat menggunakan pemilih namespace untuk mengecualikan namespace tertentu agar tidak mewarisi resource dalam hierarki menggunakan pemilih label berbasis set.
Dalam contoh ini, saat ResourceQuota
dianotasi dengan NamespaceSelector
dengan menetapkan anotasi configmanagement.gke.io/namespace-selector: excludes-exempt-namespaces
,
ResourceQuota
akan dibuat di setiap namespace kecuali namespace 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 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 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 konfigurasi apa pun dengan menyetel kolom
hierarchyMode
ke none
. HierarchyConfigs disimpan di direktori
system/
repositori. 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