Replication Controller là gì? So sánh với ReplicaSet

Replication Controller giúp duy trì một số lượng bản sao của pod trong k8s. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về Replication Controller là gì, cách hoạt động. Bắt đầu thôi

Xem thêm:

Containerd là gì ? So sánh Docker và Containerd

Container runtime là gì ? 2 loại phổ biến

1. Replication Controller là gì?

Replication Controller là một resource có trách nhiệm tạo và quản lý các pod. Số lượng các pod bằng với số lượng ta chỉ định ở replicas và quản lý các pod thông qua labels của pod.

Nói cách khác, Kubernetes Replication Controller là cấu trúc cho phép chúng ta tạo nhiều pod, và đảm bảo rằng luôn có một pod khả dụng. Nếu một pod gặp sự cố, Replication Controller sẽ thay thế pod đó bằng một pod mới. Replication Controller cung cấp các lợi ích khác như khả năng mở rộng số lượng pod và cập nhật hoặc xóa nhiều nhóm bằng một lệnh duy nhất.

apiVersion: v1
kind: ReplicationController
metadata: 
  name: nginx
spec:
  replicas: 3
  template: 
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        name: nginx
        image: nginx
        ports:
          containerPort: 80

1.1 Tại sao cần Replication Controller?

– Vấn đề:

  • Giả sử có một pod đang chạy ứng dụng.
  • Nếu ứng dụng gặp lỗi, người dùng sẽ không thể truy cập được.

– Giải pháp:

Sử dụng Replication Controller để chạy nhiều phiên bản ứng dụng cùng lúc.

Replication Controller sẽ giám sát các pod và sẽ tự động tạo ra pod mới khi phát hiện một pod bị lỗi, đảm bảo ứng dụng luôn sẵn sàng.

Replication Controller

– Ví dụ:

Bạn có một website với một pod duy nhất để xử lý yêu cầu từ người dùng. Nếu bạn sử dụng Replication Controller với 3 bản sao (replicas=3), bạn sẽ có 3 pod chạy ứng dụng, giúp tăng khả năng xử lý gấp 3 lần. Nếu replicas = 1, Replication Controller sẽ tạo 1 pod và giám sát nó. Khi một pod gặp sự cố, Replication Controller sẽ tạo 1 pod khác để đạt lại số lượng 1.

controlplane ~ ➜  kubectl get pods
NAME                    READY   STATUS             RESTARTS   AGE
new-replica-set-bsc9j   0/1     ImagePullBackOff   0          4m7s
new-replica-set-kq2sr   0/1     ImagePullBackOff   0          4m7s
new-replica-set-hx77w   0/1     ImagePullBackOff   0          4m7s
new-replica-set-qtzvd   0/1     ImagePullBackOff   0          4m7s

controlplane ~ ➜  kubectl delete pod new-replica-set-bsc9j 
pod "new-replica-set-bsc9j" deleted

controlplane ~ ➜  kubectl get pods
NAME                    READY   STATUS             RESTARTS   AGE
new-replica-set-kq2sr   0/1     ImagePullBackOff   0          4m42s
new-replica-set-hx77w   0/1     ImagePullBackOff   0          4m42s
new-replica-set-qtzvd   0/1     ImagePullBackOff   0          4m42s
new-replica-set-f97ff   0/1     ImagePullBackOff   0          17s

1.2 Lợi ích của Replication Controller

  • Tính sẵn sàng: Luôn có ít nhất một phiên bản của ứng dụng hoạt động.
  • Cân bằng tải: Phân phối tải lượng công việc lên nhiều container, giúp tăng hiệu suất xử lý.
  • Mở rộng quy mô: Dễ dàng tăng số lượng container khi nhu cầu sử dụng tăng lên.

Replication Controller là một công cụ quan trọng trong Kubernetes, giúp đảm bảo tính sẵn sàng, cân bằng tải và mở rộng quy mô cho các ứng dụng.

2. ReplicaSet là gì

ReplicaSet là một resource tương tự Replication Controller nhưng nó là một phiên bản mới hơn  và được sử dụng để thay thế Replication Controller. Chúng ta sẽ dùng ReplicaSets để deploy pod thay vì dùng Replication Controller.

ReplicaSet

ReplicaSet và Replication Controller hoạt động tương tự nhau. Nhưng ReplicaSet linh hoạt hơn ở phần label selector, trong khi label selector của Replication Controller chỉ có thể chọn pod hoàn toàn giống với label nó chỉ định, thì ReplicaSet sẽ cho phép dùng một số expressions hoặc matching để chọn pod nó quản lý.

Ví dụ, Replication Controller không thể nào match với pod mà có env=production và env=testing cùng lúc được, trong khi thằng Replication Controller có thể, bằng cách chỉ định label selector như env=* . Ngoài ra, ta có thể dùng operators với thuộc tính matchExpressions như sau:

selector:
  matchExpressions:
    - key: app
      operator: In
      values:
        - kubia
apiVersion: apps/v1
kind: ReplicaSet
metadata: 
  name: nginx
spec:
  replicas: 3
  selector:
    matchExpressions:
      {key: app, operator: In, value: [nginx, fronted]}
      {key: environment, operator: Notin, value: [production]}
  template: 
    metadata:
      name: nginx
      labels:
        app: nginx
        environment: dev
    spec:
      containers:
        name: nginx
        image: nginx
        ports:
          containerPort: 80

3. So sánh Replication Controller và ReplicaSet

Replication Controller ReplicaSet
Replication Controller là hình thức nhân bản ban đầu trong Kubernetes ReplicaSets cao cấp hơn cung cấp khả năng dễ dàng chạy nhiều phiên bản của một pod nhất định
Sử dụng equality-based selector để quản lý các pod Sử dụng set-based selectors
Rolling-update hoạt động với Replication Controller Rolling-update không hoạt động với ReplicaSet
Không còn được hỗ trợ Khuyến khích sử dụng
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels: #<-- This was added
      tier: nginx

So sánh Replication Controller và ReplicaSet

4. Các thao tác với ReplicaSet

– Liệt kê các ReplicaSet trong hệ thống:

controlplane ~ ➜  kubectl get replicaset
NAME              DESIRED   CURRENT   READY   AGE
new-replica-set   4         4         0       13s

– Xem thông tin ReplicaSet:

controlplane ~ ✖ kubectl describe replicaset
Name:         new-replica-set
Namespace:    default
Selector:     name=busybox-pod
Labels:       <none>
Annotations:  <none>
Replicas:     4 current / 4 desired
Pods Status:  0 Running / 4 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  name=busybox-pod
  Containers:
   busybox-container:
    Image:      busybox777
    Port:       <none>
    Host Port:  <none>
    Command:
      sh
      -c
      echo Hello Kubernetes! && sleep 3600
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  105s  replicaset-controller  Created pod: new-replica-set-qtzvd
  Normal  SuccessfulCreate  105s  replicaset-controller  Created pod: new-replica-set-kq2sr
  Normal  SuccessfulCreate  105s  replicaset-controller  Created pod: new-replica-set-hx77w
  Normal  SuccessfulCreate  105s  replicaset-controller  Created pod: new-replica-set-bsc9j

– Xóa một ReplicaSet:

controlplane ~ ✖ kubectl delete replicaset replicaset-1
replicaset.apps "replicaset-1" deleted

– Chỉnh sửa một ReplicaSet:

controlplane ~ ➜  kubectl edit replicaset new-replica-set 
replicaset.apps/new-replica-set edited

– Scale ReplicaSet lên 5:

controlplane ~ ➜  kubectl scale replicaset new-replica-set --replicas=5
replicaset.apps/new-replica-set scaled

Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về Replication Controller và tầm quan trọng của nó trong quản lý container. Cảm ơn bạn đã tham khảo kubernetes cơ bản trên ttnguyen.net.

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em