Di episode ini kita akan coba bahas modern replacement untuk ReplicationController yaitu ReplicaSet. Kita akan mempelajari tentang set-based selector, matchLabels, matchExpressions, dan bagaimana ReplicaSet digunakan oleh Deployment.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 11 di bawah ini
Di episode sebelumnya kita sudah belajar tentang ReplicationController, legacy controller untuk mengelola Pod replica. Selanjutnya di episode 12 kali ini, kita akan coba bahas modern replacement nya yaitu ReplicaSet.
Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.
ReplicaSet adalah next-generation ReplicationController dengan selector support yang lebih flexible. Sementara kalian bisa menggunakan ReplicaSet secara langsung, biasanya digunakan sebagai underlying mechanism untuk Deployment, yang menyediakan fitur tambahan seperti rolling update dan rollback capability.
ReplicaSet memastikan bahwa jumlah Pod replica yang di-specify berjalan pada waktu tertentu. Ini adalah successor dari ReplicationController dan menyediakan core functionality yang sama dengan enhanced selector capability.
Fitur kunci ReplicaSet:
matchLabels dan matchExpressionsPerbedaan utama antara ReplicaSet dan ReplicationController adalah selector support:
ReplicationController - Equality-based selector saja:
selector:
app: nginx
tier: frontendReplicaSet - Set-based selector dengan lebih flexible:
selector:
matchLabels:
app: nginx
matchExpressions:
- key: tier
operator: In
values:
- frontend
- backendReplicaSet menyediakan beberapa keuntungan dibanding ReplicationController:
apps/v1 API groupImportant
Best Practice: Sementara kalian bisa menggunakan ReplicaSet secara langsung, direkomendasikan untuk menggunakan Deployment. Deployment mengelola ReplicaSet dan menyediakan fitur tambahan seperti rolling update, rollback, dan declarative update.
ReplicaSet terdiri dari tiga komponen utama:
Jumlah Pod replica yang ingin kalian jalankan:
spec:
replicas: 3Label yang digunakan untuk mengidentifikasi Pod mana yang dikelola ReplicaSet. ReplicaSet support dua tipe:
matchLabels - Equality-based matching:
selector:
matchLabels:
app: nginx
environment: productionmatchExpressions - Set-based matching:
selector:
matchExpressions:
- key: tier
operator: In
values:
- frontend
- backendTemplate yang digunakan untuk membuat Pod baru:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25Mari kita buat basic ReplicaSet:
Buat file bernama replicaset-basic.yml:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
labels:
app: nginx
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
app: nginx
tier: frontend
template:
metadata:
labels:
app: nginx
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80Important
Penting: Label di Pod template harus match dengan selector. Jika tidak match, ReplicaSet akan gagal dibuat.
Apply konfigurasi:
sudo kubectl apply -f replicaset-basic.ymlVerifikasi ReplicaSet dibuat:
sudo kubectl get replicasetAtau gunakan shorthand:
sudo kubectl get rsOutput:
NAME DESIRED CURRENT READY AGE
nginx-replicaset 3 3 3 30sCek Pod:
sudo kubectl get podsOutput:
NAME READY STATUS RESTARTS AGE
nginx-replicaset-abc12 1/1 Running 0 30s
nginx-replicaset-def34 1/1 Running 0 30s
nginx-replicaset-ghi56 1/1 Running 0 30sFitur paling powerful dari ReplicaSet adalah set-based selector menggunakan matchExpressions. Mari kita explore operator nya:
Memilih Pod dimana label value ada di set yang di-specify:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: web-app-rs
spec:
replicas: 3
selector:
matchExpressions:
- key: environment
operator: In
values:
- production
- staging
template:
metadata:
labels:
app: web-app
environment: production
spec:
containers:
- name: web-app
image: nginx:1.25ReplicaSet ini mengelola Pod dengan environment: production ATAU environment: staging.
Memilih Pod dimana label value TIDAK ada di set yang di-specify:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: non-dev-rs
spec:
replicas: 2
selector:
matchExpressions:
- key: environment
operator: NotIn
values:
- development
template:
metadata:
labels:
app: myapp
environment: production
spec:
containers:
- name: myapp
image: nginx:1.25ReplicaSet ini mengelola Pod dimana environment BUKAN development.
Memilih Pod yang punya label key yang di-specify (regardless of value):
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: labeled-rs
spec:
replicas: 2
selector:
matchExpressions:
- key: tier
operator: Exists
template:
metadata:
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: nginx:1.25ReplicaSet ini mengelola Pod yang punya label tier, regardless of value nya.
Memilih Pod yang TIDAK punya label key yang di-specify:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: unlabeled-rs
spec:
replicas: 2
selector:
matchExpressions:
- key: deprecated
operator: DoesNotExist
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:1.25ReplicaSet ini mengelola Pod yang TIDAK punya label deprecated.
Kalian bisa kombinasikan keduanya untuk selection yang lebih complex:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: complex-selector-rs
spec:
replicas: 3
selector:
matchLabels:
app: web-app
matchExpressions:
- key: environment
operator: In
values:
- production
- staging
- key: tier
operator: NotIn
values:
- deprecated
template:
metadata:
labels:
app: web-app
environment: production
tier: frontend
spec:
containers:
- name: web-app
image: nginx:1.25ReplicaSet ini memilih Pod yang:
app: web-app (matchLabels)environment sebagai production atau stagingtier: deprecatedUntuk melihat informasi detail tentang ReplicaSet:
sudo kubectl describe rs nginx-replicasetOutput:
Name: nginx-replicaset
Namespace: default
Selector: app=nginx,tier=frontend
Labels: app=nginx
tier=frontend
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
tier=frontend
Containers:
nginx:
Image: nginx:1.25
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m replicaset-controller Created pod: nginx-replicaset-abc12
Normal SuccessfulCreate 2m replicaset-controller Created pod: nginx-replicaset-def34
Normal SuccessfulCreate 2m replicaset-controller Created pod: nginx-replicaset-ghi56ReplicaSet otomatis replace failed Pod, sama seperti ReplicationController:
sudo kubectl get pods -l app=nginxsudo kubectl delete pod nginx-replicaset-abc12sudo kubectl get pods -l app=nginx -wKalian akan melihat ReplicaSet segera membuat Pod baru untuk maintain desired count.
Scaling ReplicaSet bekerja sama seperti ReplicationController:
# Scale up ke 5 replica
sudo kubectl scale rs nginx-replicaset --replicas=5
# Scale down ke 2 replica
sudo kubectl scale rs nginx-replicaset --replicas=2sudo kubectl edit rs nginx-replicasetUbah field replicas dan save.
Update file YAML kalian dan apply:
sudo kubectl apply -f replicaset-basic.ymlapiVersion: apps/v1
kind: ReplicaSet
metadata:
name: web-app-rs
labels:
app: web-app
tier: frontend
spec:
replicas: 5
selector:
matchLabels:
app: web-app
tier: frontend
template:
metadata:
labels:
app: web-app
tier: frontend
spec:
containers:
- name: web-app
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: multi-env-rs
spec:
replicas: 4
selector:
matchLabels:
app: myapp
matchExpressions:
- key: environment
operator: In
values:
- production
- staging
- key: version
operator: Exists
template:
metadata:
labels:
app: myapp
environment: production
version: v2.0
spec:
containers:
- name: myapp
image: nginx:1.25
env:
- name: ENVIRONMENT
value: "production"
- name: VERSION
value: "v2.0"apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: affinity-rs
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: myapp
image: nginx:1.25ReplicaSet ini schedule Pod hanya di node dengan label disktype: ssd.
Dalam praktik, kalian jarang membuat ReplicaSet secara langsung. Sebaliknya, kalian membuat Deployment, yang mengelola ReplicaSet untuk kalian.
Saat kalian membuat Deployment:
Contoh Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25Saat kalian apply Deployment ini:
sudo kubectl apply -f deployment-example.ymlCek ReplicaSet yang dibuat oleh Deployment:
sudo kubectl get rsOutput:
NAME DESIRED CURRENT READY AGE
nginx-deployment-5d59d67564 3 3 3 30sNama ReplicaSet include nama Deployment dan hash.
Deployment menyediakan fitur tambahan:
Tip
Rekomendasi: Selalu gunakan Deployment untuk stateless application daripada membuat ReplicaSet secara langsung. Gunakan ReplicaSet hanya saat kalian butuh fine-grained control atau punya requirement spesifik yang Deployment tidak support.
sudo kubectl delete rs nginx-replicasetIni menghapus ReplicaSet dan semua Pod nya.
sudo kubectl delete rs nginx-replicaset --cascade=orphanIni hanya menghapus ReplicaSet, membiarkan Pod berjalan sebagai orphan.
Pod template label harus match dengan selector:
Salah:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: web # Tidak match!Benar:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx # Match!Membuat ReplicaSet secara langsung saat seharusnya menggunakan Deployment.
Solusi: Gunakan Deployment untuk most use case. Deployment mengelola ReplicaSet dan menyediakan rolling update.
Membuat selector yang terlalu complex yang tidak match Pod apapun.
Solusi: Mulai simple, test selector kalian, kemudian tambahkan complexity jika diperlukan.
Solusi: Selalu set resource request dan limit:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"Untuk most use case, gunakan Deployment:
apiVersion: apps/v1
kind: Deployment # Gunakan Deployment, bukan ReplicaSet
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25Untuk simple equality-based selection, gunakan matchLabels:
selector:
matchLabels:
app: nginx
tier: frontendUntuk complex selection logic, gunakan matchExpressions:
selector:
matchExpressions:
- key: environment
operator: In
values:
- production
- staging
- key: deprecated
operator: DoesNotExistGunakan descriptive label untuk organisasi yang lebih baik:
labels:
app: web-app
tier: frontend
environment: production
version: v2.0
team: platformSelalu tambahkan Probe:
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080Selalu define resource request dan limit:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"sudo kubectl get rssudo kubectl get events --sort-by='.lastTimestamp' | grep ReplicaSetsudo kubectl get pods -l app=nginx -wsudo kubectl top pods -l app=nginxPada episode 12 ini, kita telah membahas ReplicaSet di Kubernetes secara mendalam. Kita sudah belajar apa itu ReplicaSet, bagaimana dia improve ReplicationController, dan cara menggunakan set-based selector untuk flexible Pod management.
Key takeaway:
matchLabels dan matchExpressionsapps/v1 API groupSementara ReplicaSet lebih powerful daripada ReplicationController, dalam praktik kalian harus menggunakan Deployment untuk mengelola stateless application. Deployment menyediakan semua benefit dari ReplicaSet plus rolling update, rollback capability, dan declarative update management.
Bagaimana, makin jelas kan tentang ReplicaSet di Kubernetes? Di episode 13 berikutnya, kita akan membahas DaemonSet, tipe controller yang berbeda yang memastikan Pod berjalan di setiap node di cluster kalian. Jadi, pastikan tetap semangat belajar dan nantikan episode selanjutnya!