Bài viết thuộc series Kubernetes cơ bản
Giới thiệu
Ở bài trước ta đã tìm hiểu cách dùng Pod để chạy ứng dụng. Nhưng trong thực tế ta không tạo Pod trực tiếp mà thông qua các resource khác là Replication Controllers hoặc ReplicaSets. Trong bài này ta tìm hiểu về Replication Controllers và tại sao lại dùng nó mà không tạo Pod trực tiếp.
ReplicationControllers là gì?
ReplicationControllers (RC) đã được thay thế bởi ReplicaSets trong phiên bản Kubernetes 1.9. Tuy nhiên để hiểu về cách hoạt động của ReplicaSets thì ta cần tìm hiểu về ReplicationControllers.
ReplicationControllers (RCs) là một phần quan trọng trong Kubernetes, nó được sử dụng để tạo và quản lý Pod, đảm bảo rằng một số lượng Pod luôn hoạt động.
Các đặc điểm chính của ReplicationControllers:
- Desired Replica Count: số lượng Pod ta muốn duy trì, RC đảm bảo số lượng Pod hiện tại luôn bằng với số lượng ta mong muốn
- Pod Template
- Selector: RC sử dụng một selector để xác định các pods mà nó quản lý
- Self-healing: RC tự động thay thế các Pod bị lỗi hoặc tắt để đảm bảo số lượng Pod mong muốn luôn được duy trì
Tại sao ta không chạy Pod trực tiếp?
Pod đóng vai trò giám sát Container và tự động restart lại Container khi nó chết.
Vậy trong trường hợp Worker Node mà Pod đang chạy chết thì chuyện gì xảy ra? Pod đang nằm trong Worker Node đó cũng chết theo.
Nếu ta chạy Kubernetes với hơn 1 Worker Node, RC sẽ giúp chúng ta giải quyết vấn đề này. Vì RC luôn đảm bảo rằng số lượng Pod mà nó tạo ra luôn bằng với số lượng ta mong muốn.
Nên khi ta tạo RC với số lượng replicas = 1
thì RC luôn đảm bảo có 1 Pod đang được chạy. Khi một thằng Worker Node chết và nếu Pod được RC quản lý nằm trong Worker Node đó. Thì lúc này RC phát hiện ra số lượng Pod của nó bằng 0 và nó sẽ tạo ra lại 1 Pod ở Worker Node khác để đảm bảo số lượng Pod là 1.
Hình minh họa cách hoạt động của RC.
Do đó thay vì chạy Pod trực tiếp thì ta nên dùng các resource cấp cao hơn để quản lý và tạo Pod.
Bên cạnh việc đảm bảo số lượng Pod luôn bằng với số replicas
thì việc chạy nhiều Pod cũng giúp ta cải thiện hiệu suất của ứng dụng phần nào.
Ví dụ ta chạy một ứng dụng Web đơn giản, thay vì triển khai 1 Pod để chạy ứng dụng thì ta có thể chạy 3 Pod, lúc này request của user được gửi tới cả 3 Pod giúp quá trình xử lý nhanh hơn.
Thực hành
Tiếp theo ta thực hành tạo Pod với RC. Tạo tệp tin tên là hello-rc.yaml
:
apiVersion: v1
kind: ReplicationController
metadata:
name: hello-rc
spec:
replicas: 2 # number of the pod
selector: # The pod selector determining what pods the RC is operating on
app: hello-kube # label value
template: # pod template
metadata:
labels:
app: hello-kube # label value
spec:
containers:
- image: 080196/hello-kube # image used to run container
name: hello-kube # name of the container
ports:
- containerPort: 3000 # pod of the container
Cấu trúc cấu hình RC sẽ gồm 3 phần chính như sau:
- selector: chỉ định Pod nào được RC giám sát
- replicas: số lượng Pod được tạo
- template: cấu hình của Pod
Tạo RC:
kubectl apply -f hello-rc.yaml
Kiểm tra xem RC chạy thành công hay chưa:
kubectl get rc
Nếu số lượng ở cột READY
bằng với số lượng DESIRED
thì ta đã chạy RC thành công. Kiểm tra số lượng Pod được tạo ra bởi RC có đúng với số lượng chỉ định ở replicas như lý thuyết hay không.
kubectl get pod
Nếu bạn thấy số lượng Pod là hai thì đã đúng, tên của Pod được tạo ra bởi RC theo định dạng như sau <replicationcontroller-name>-<random>
. Ta xóa thử một thằng Pod để xem RC có tạo lại một thằng Pod khác như lý thuyết không.
kubectl delete pod hello-rc-c6l8k
Mở cửa sổ Terminal khác và gõ câu lệnh
kubectl get pod
Bạn sẽ thấy số lượng Pod vẫn là 2. Quá trình RC phát hiện và tạo lại Pod như sau:
Thay đổi template của pod
Bạn có thể thay đổi template của Pod và cập nhật lại RC. Nhưng nó sẽ không áp dụng cho những thằng Pod hiện tại. Muốn cập nhật template của Pod ta có hai cách sau:
- Xóa Pod để RC tạo ra Pod mới với template mới
- Xóa RC và tạo lại
Để xóa RC thì ta dùng câu lệnh sau:
kubectl delete rc hello-rc
Khi bạn xóa RC thì Pod nó quản lý cũng bị xóa theo.
Kết luận
Như bạn thấy thì ReplicationController là một resource rất hữu ích để chúng ta triển khai Pod. Tuy nhiên ở phiên bản mới RC đã được thay thế bằng ReplicaSets. Ta sẽ tìm hiểu về ReplicaSets ở bài sau.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?