Di episode ini kita akan coba bahas konsep penting di Kubernetes yaitu ReplicationController. Kita akan mempelajari bagaimana ReplicationController memastikan jumlah Pod replica yang di-specify berjalan pada waktu tertentu.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 10 di bawah ini
Di episode sebelumnya kita sudah belajar tentang Probe di Kubernetes untuk memastikan kesehatan dan ketersediaan aplikasi. Selanjutnya di episode 11 kali ini, kita akan coba bahas konsep penting untuk mengelola Pod replica yaitu ReplicationController.
Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.
ReplicationController adalah salah satu controller fundamental di Kubernetes yang memastikan jumlah Pod replica yang di-specify berjalan pada waktu tertentu. Sementara ReplicationController sudah sebagian besar digantikan oleh ReplicaSet dan Deployment di modern Kubernetes, memahaminya penting karena memperkenalkan core concept yang digunakan di seluruh Kubernetes.
Important
Catatan Penting: ReplicationController dianggap legacy. Di modern Kubernetes, kalian harus menggunakan ReplicaSet (yang akan kita bahas di episode berikutnya) atau Deployment. Namun, memahami ReplicationController membantu kalian memahami fundamental concept dari replica management di Kubernetes.
ReplicationController memastikan bahwa jumlah Pod replica yang di-specify berjalan pada waktu tertentu. Jika ada terlalu banyak Pod, dia akan kill beberapa. Jika terlalu sedikit, dia akan start lebih banyak. Bayangkan seperti supervisor yang terus-menerus memonitor Pod kalian dan maintain desired state.
Tanggung jawab kunci ReplicationController:
ReplicationController terus-menerus memonitor cluster dan membandingkan actual state dengan desired state:
Tanpa ReplicationController, jika kalian manually membuat Pod:
Dengan ReplicationController:
ReplicationController terdiri dari tiga komponen utama:
Jumlah Pod replica yang ingin kalian jalankan:
spec:
replicas: 3 # Jalankan 3 PodLabel yang digunakan untuk mengidentifikasi Pod mana yang dikelola ReplicationController:
spec:
selector:
app: nginx
environment: productionTemplate yang digunakan untuk membuat Pod baru:
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25Mari kita buat basic ReplicationController:
Buat file bernama replication-controller.yml:
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-rc
labels:
app: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80ReplicationController ini:
app: nginxApply konfigurasi:
sudo kubectl apply -f replication-controller.ymlVerifikasi ReplicationController dibuat:
sudo kubectl get replicationcontrollerAtau gunakan shorthand:
sudo kubectl get rcOutput:
NAME DESIRED CURRENT READY AGE
nginx-rc 3 3 3 30sCek Pod yang dibuat oleh ReplicationController:
sudo kubectl get podsOutput:
NAME READY STATUS RESTARTS AGE
nginx-rc-abc12 1/1 Running 0 30s
nginx-rc-def34 1/1 Running 0 30s
nginx-rc-ghi56 1/1 Running 0 30sPerhatikan bahwa nama Pod otomatis di-generate dengan nama ReplicationController sebagai prefix.
Untuk melihat informasi detail tentang ReplicationController:
sudo kubectl describe rc nginx-rcOutput:
Name: nginx-rc
Namespace: default
Selector: app=nginx
Labels: app=nginx
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
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 replication-controller Created pod: nginx-rc-abc12
Normal SuccessfulCreate 2m replication-controller Created pod: nginx-rc-def34
Normal SuccessfulCreate 2m replication-controller Created pod: nginx-rc-ghi56Mari kita demonstrasikan bagaimana ReplicationController otomatis replace failed Pod:
sudo kubectl get podsOutput:
NAME READY STATUS RESTARTS AGE
nginx-rc-abc12 1/1 Running 0 5m
nginx-rc-def34 1/1 Running 0 5m
nginx-rc-ghi56 1/1 Running 0 5msudo kubectl delete pod nginx-rc-abc12sudo kubectl get pods -wKalian akan melihat:
NAME READY STATUS RESTARTS AGE
nginx-rc-abc12 1/1 Terminating 0 5m
nginx-rc-def34 1/1 Running 0 5m
nginx-rc-ghi56 1/1 Running 0 5m
nginx-rc-xyz78 0/1 ContainerCreating 0 1s
nginx-rc-xyz78 1/1 Running 0 3sReplicationController segera membuat Pod baru (nginx-rc-xyz78) untuk maintain desired count 3 replica.
sudo kubectl get rc nginx-rcOutput:
NAME DESIRED CURRENT READY AGE
nginx-rc 3 3 3 6mReplica count tetap di 3, sesuai yang diharapkan.
Kalian bisa scale ReplicationController up atau down dengan beberapa cara:
Scale up ke 5 replica:
sudo kubectl scale rc nginx-rc --replicas=5Verifikasi:
sudo kubectl get podsOutput:
NAME READY STATUS RESTARTS AGE
nginx-rc-def34 1/1 Running 0 10m
nginx-rc-ghi56 1/1 Running 0 10m
nginx-rc-xyz78 1/1 Running 0 5m
nginx-rc-jkl90 1/1 Running 0 10s
nginx-rc-mno12 1/1 Running 0 10sScale down ke 2 replica:
sudo kubectl scale rc nginx-rc --replicas=2ReplicationController akan terminate 3 Pod untuk maintain 2 replica.
Edit ReplicationController secara langsung:
sudo kubectl edit rc nginx-rcUbah field replicas:
spec:
replicas: 4 # Ubah dari 3 ke 4Save dan exit. Kubernetes akan otomatis membuat satu Pod lagi.
Update file replication-controller.yml kalian:
spec:
replicas: 6 # Ubah dari 3 ke 6Apply perubahan:
sudo kubectl apply -f replication-controller.ymlReplicationController menggunakan label selector untuk mengidentifikasi Pod mana yang dikelola. Mari kita explore ini:
Buat Pod secara manual dengan label yang sama:
apiVersion: v1
kind: Pod
metadata:
name: manual-nginx
labels:
app: nginx # Label yang sama dengan ReplicationController selector
spec:
containers:
- name: nginx
image: nginx:1.25Apply:
sudo kubectl apply -f manual-pod.ymlCek Pod:
sudo kubectl get podsKalian akan notice bahwa ReplicationController akan menghapus salah satu Pod nya sendiri karena total count (termasuk manual Pod kalian) melebihi desired replica count.
Dapatkan Pod yang dikelola ReplicationController:
sudo kubectl get pods -l app=nginxHapus label dari satu Pod:
sudo kubectl label pod nginx-rc-def34 app-Pod tidak lagi dikelola oleh ReplicationController. ReplicationController akan membuat Pod baru untuk maintain desired count.
Cek Pod:
sudo kubectl get podsKalian akan melihat:
Saat kalian update Pod template di ReplicationController, hanya mempengaruhi Pod baru. Existing Pod tidak di-update.
Edit ReplicationController:
sudo kubectl edit rc nginx-rcUbah image version:
spec:
template:
spec:
containers:
- name: nginx
image: nginx:1.26 # Ubah dari 1.25 ke 1.26Save dan exit.
Cek existing Pod:
sudo kubectl get pods -o wideExisting Pod masih menggunakan old image (nginx:1.25).
Untuk apply template baru, kalian perlu menghapus existing Pod:
# Hapus semua Pod (ReplicationController akan recreate dengan template baru)
sudo kubectl delete pods -l app=nginxAtau scale down ke 0 dan back up:
sudo kubectl scale rc nginx-rc --replicas=0
sudo kubectl scale rc nginx-rc --replicas=3Tip
Limitasi ini adalah salah satu alasan kenapa Deployment lebih disukai daripada ReplicationController. Deployment handle rolling update secara otomatis.
Ada dua cara untuk menghapus ReplicationController:
Ini menghapus ReplicationController dan semua Pod nya:
sudo kubectl delete rc nginx-rcSemua Pod yang dikelola ReplicationController akan di-terminate.
Ini hanya menghapus ReplicationController, membiarkan Pod berjalan:
sudo kubectl delete rc nginx-rc --cascade=orphanPod akan terus berjalan tapi tidak lagi dikelola controller apapun.
Verifikasi:
sudo kubectl get rcTidak ada ReplicationController.
sudo kubectl get podsPod masih berjalan.
Warning
Orphaned Pod tidak akan otomatis di-replace jika mereka fail. Kalian perlu manage mereka secara manual atau buat ReplicationController baru untuk adopt mereka.
Buat ReplicationController untuk web application:
apiVersion: v1
kind: ReplicationController
metadata:
name: web-app-rc
labels:
app: web-app
tier: frontend
spec:
replicas: 5
selector:
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"apiVersion: v1
kind: ReplicationController
metadata:
name: app-with-env-rc
spec:
replicas: 3
selector:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: nginx:1.25
env:
- name: ENVIRONMENT
value: "production"
- name: LOG_LEVEL
value: "info"
ports:
- containerPort: 80apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-with-probes-rc
spec:
replicas: 3
selector:
app: nginx-probes
template:
metadata:
labels:
app: nginx-probes
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5Sementara ReplicationController masih di-support, ReplicaSet adalah modern replacement. Berikut perbedaan kunci:
| Fitur | ReplicationController | ReplicaSet |
|---|---|---|
| Selector | Equality-based only | Set-based selector |
| API Version | v1 | apps/v1 |
| Status | Legacy | Current standard |
| Digunakan oleh | Standalone | Digunakan oleh Deployment |
| Selector flexibility | Limited | Lebih flexible |
Equality-based selector (ReplicationController):
selector:
app: nginx
tier: frontendSet-based selector (ReplicaSet):
selector:
matchLabels:
app: nginx
matchExpressions:
- key: tier
operator: In
values:
- frontend
- backendImportant
Rekomendasi: Gunakan ReplicaSet atau Deployment daripada ReplicationController untuk aplikasi baru. ReplicationController di-maintain untuk backward compatibility tapi kurang modern feature.
Pod template label harus match dengan selector:
Salah:
spec:
selector:
app: nginx # Selector
template:
metadata:
labels:
app: web # Tidak match!Benar:
spec:
selector:
app: nginx
template:
metadata:
labels:
app: nginx # Match dengan selectorUpdate Pod template tidak update existing Pod secara otomatis.
Solusi: Gunakan Deployment untuk rolling update, atau manually delete Pod untuk force recreation.
Tanpa resource limit, Pod bisa mengkonsumsi semua node resource.
Solusi: Selalu set resource request dan limit:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"ReplicationController dirancang untuk stateless application.
Solusi: Gunakan StatefulSet untuk stateful application (database, dll).
Tanpa Probe, ReplicationController tidak bisa mendeteksi unhealthy Pod.
Solusi: Selalu tambahkan Liveness dan Readiness Probe.
Gunakan nama deskriptif untuk ReplicationController:
metadata:
name: web-app-frontend-rc # Clear dan descriptiveTambahkan label untuk organisasi yang lebih baik:
metadata:
labels:
app: web-app
tier: frontend
environment: production
version: v1.0Pertimbangkan kebutuhan aplikasi kalian:
Selalu set resource request dan limit:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"Selalu tambahkan Probe:
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080Untuk aplikasi baru, gunakan ReplicaSet atau Deployment:
# Modern approach - gunakan 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.25sudo kubectl get rcsudo kubectl get events --sort-by='.lastTimestamp' | grep ReplicationControllersudo kubectl get pods -l app=nginx -wsudo kubectl top pods -l app=nginxPada episode 11 ini, kita telah membahas ReplicationController di Kubernetes secara mendalam. Kita sudah belajar apa itu ReplicationController, cara kerjanya, dan cara menggunakannya untuk manage Pod replica.
Key takeaway:
Sementara ReplicationController masih di-support, dia dianggap legacy. Modern Kubernetes application harus menggunakan ReplicaSet (yang akan kita bahas di episode berikutnya) atau Deployment untuk fitur yang lebih baik seperti rolling update, rollback capability, dan selector yang lebih flexible.
Bagaimana, makin jelas kan tentang ReplicationController di Kubernetes? Di episode 12 berikutnya, kita akan membahas ReplicaSet, modern replacement untuk ReplicationController dengan enhanced feature dan better selector support. Jadi, pastikan tetap semangat belajar dan nantikan episode selanjutnya!
Catatan
Untuk kalian yang ingin lanjut ke episode berikutnya, bisa click thumbnail episode 12 di bawah ini