Trong bài trước, mình có giới thiệu chạy các câu lệnh K8S bằng Command Line Để tạo 1 deloyment đơn giản chỉ cần chạy lệnh
kubectl create deployment hello-app --image=nginx:latest
Trong câu lệnh trên đã lược bỏ hầu như hết các thuộc tính không bắt buộc, nó chạy được, nhưng muốn mở rộng thì khó hơn nhiều. Khi đó phải truyền thêm các điều kiện vào command line khiến nó rất rồi mắt.
Chính vì vậy deployment sinh ra để giải quyết vấn đề này, nó cũng giống như việc chạy Docker trên command line và sử dụng docker-compose vậy.
1. K8S deployment là gì
Theo định nghĩa nó là 1 Object để quản lý resource của K8S giúp khai báo và update thông tin cho ứng dụng: Image sử dụng để chạy, số lượng Pods ... Và giúp việc cập nhật ứng dụng nhanh chóng và hiệu quả hơn.
A Kubernetes deployment is a resource object in Kubernetes that provides declarative updates to applications. A deployment allows you to describe an application’s life cycle, such as which images to use for the app, the number of pods there should be, and the way in which they should be updated.
2. Ưu điểm của deployment
- Giảm thiểu nhàm chán khi phải updating 1 ứng dụng một cách thủ công (stop ứng dụng cũ, chạy câu lệnh chạy ứng dụng với version mới, chờ và kiểm tra version mới chạy thành công, hay rollback nếu có lỗi ...).
- Thao tác thủ công dễ dấn đến nhầm lẫn khi số lượng pod nhiều.
Tóm lại K8S deployment object giúp bạn làm những việc sau:
- Deploy cho replica set hay pod
- Update replica sets hay pods
- Rollback vesion cũ nếu có lỗi
- Scale deployment
- Dừng chạy hay tiếp tục 1 deployment
3. Những thuộc tính quan trọng của deployment
apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
name: deployment-name
spec:
selector:
matchLabels:
app: app-labels
tier: frontend
replicas: 2
template:
metadata:
labels:
app: app-labels
tier: frontend
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
File deployment được lưu dưới định dạng *.yaml
- kind: Vì mình đang tạo deployment nên giá trị là Deployment
- metadata.name: Tên của deployment dùng để tương tác với deployment. ví dụ khi delete deployment.
kubectl delete deployment deployment-name
-
spec.replicas: Số lượng replicated pods. trong ví dụ này mình tạo ra 2 replicated pods.
-
.spec.selector: Định nghĩa cash Deployment tìm Pods để quản lý (scale up, scale down, delete ...) trong trường hơp này giá trị nó bằng giá trị trong spec.template.metadata. Có 2 cặp {key, value} dùng để lựa chọn (app:app-labels) và (tier: frontend).
-
template: Chứa thông tin của container sẽ chạy trên pod. template.metadata.labels giúp deployment match với pod để quản lý các thông số còn lại tương tự như thông tin của container. name: Tên của container. image: Image của container resources: maximum resource cho mỗi container .....
4. Ví dụ thực tế
Tạo 1 file test-deployment.yaml
apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
name: deployment-name
spec:
selector:
matchLabels:
app: app-labels
tier: frontend
replicas: 2
template:
metadata:
labels:
app: app-labels
tier: frontend
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
Chạy deployment
kubectl apply -f test-deployment.yaml
kết quả
deployment.apps/deployment-name created
Kiểm tra thông tin Deployment mới tạo
kubectl get deployments
->
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-name 1/1 1 1 84s
Ở bài viết tiếp theo mình sẽ giải thích thi tiết về service trong k8s, tác dụng của nó và cách publish ra bên ngoài.