Một trong những lợi ích của việc sử dụng Deployment là khả năng thực hiện các bản cập nhật liên tục và tạo ra một rollingupdatestrategy. Rolling updates cho phép chúng ta cập nhật cấu hình của các pod một cách dần dần.
Một chiến lược cập nhật (k8s rollingupdate, k8s update strategy) là tùy chọn quan trọng nhất để cấu hình các bản cập nhật liên tục. Trong định nghĩa Triển khai, spec.strategy.type có hai giá trị khả thi:
Khi ứng dụng gặp lỗi do hình ảnh không chính xác hoặc triển khai không ổn định, chúng ta có thể muốn khôi phục Triển khai (k8s rollback). Theo mặc định, toàn bộ lịch sử triển khai của Triển khai được lưu trong hệ thống, có thể sử dụng để khôi phục sau trong trường hợp triển khai không ổn định. Chúng ta có thể sử dụng lịch sử này để khôi phục bất cứ lúc nào chúng ta muốn.
Để biết thêm về Cập nhật lăn và Khôi phục, hãy truy cập tài liệu chính thức của Kubernetes tại đây.
Trong bài viết này, chúng ta sẽ cập nhật triển khai bằng chiến lược Cập nhật lăn mặc định và khôi phục triển khai. Để khôi phục triển khai, chúng ta sẽ sử dụng hình ảnh không chính xác trong một trong các bản cập nhật cho triển khai.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22556%22%3E%3C/svg%3E
Hãy kiểm tra các pod hiện có và tạo một triển khai.
Nhận thông tin chi tiết về triển khai mà chúng tôi vừa tạo. Triển khai này đã tạo 4 pod và được kiểm soát bởi bộ bản sao.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22407%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng chúng ta có 1 triển khai trong đó chúng ta có 1 replicaset và 4 pod được kiểm soát bởi replicaset.
Bây giờ, hãy thay đổi phiên bản Nginx từ "nginx:1.14.2" thành "nginx:1.61.1"
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22160%22%3E%3C/svg%3E
Áp dụng thay đổi cho triển khai và lấy thông tin chi tiết về pod, replicaset và triển khai.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22551%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, có thể thấy một replicaset mới đã được tạo và có 4 pod bên dưới. Nhưng chúng ta vẫn thấy replicaset cũ hơn có 0 pod.
Bây giờ, nếu chúng ta lại thay đổi phiên bản Nginx nhưng lần này chúng ta đưa ra Phiên bản Nginx sai, thì việc triển khai sẽ không thành công vì Nginx Image không tồn tại cho phiên bản sai.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22186%22%3E%3C/svg%3E
Hãy áp dụng thay đổi cho triển khai.
Bây giờ, hãy thử lấy thông tin chi tiết về replicaset.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22502%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, có thể thấy rằng các Pod mới đang gặp lỗi "ErrImagePull". Các pod đang gặp lỗi vì Nginx Image không tồn tại cho phiên bản "ngin:1.1.1".
Bây giờ, nếu chúng ta muốn quay lại các image đang hoạt động trước đó, chúng ta có thể khôi phục về bản sửa đổi trước đó nếu trạng thái triển khai không ổn.
Để khôi phục, trước tiên chúng ta có thể lấy lịch sử triển khai của bản triển khai triển khai bằng lệnh sau.
Bây giờ, sử dụng lệnh sau với "--revision=2", chúng ta có thể kiểm tra thông tin chi tiết về bản triển khai havein"--revision=2"
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22422%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng bản sửa đổi-2 có phiên bản Nginx Image "nginx:1.16.1" đang hoạt động trước khi chúng tôi cập nhật triển khai của mình với phiên bản Nginx "ngin:1.1.1" không thành công.
Bây giờ, hãy quay lại bản triển khai về bản sửa đổi cuối cùng mà chúng ta có trước khi triển khai không thành công hiện tại.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22333%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng chúng tôi đã khôi phục lại bản triển khai mới nhất và hiện tại chúng tôi có bản sửa đổi triển khai đã hoạt động trước bản cập nhật cuối cùng.
Để biết thêm về bản triển khai, bạn có thể mô tả bằng cách sử dụng thông tin sau lệnh.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22490%22%3E%3C/svg%3E
Một chiến lược cập nhật (k8s rollingupdate, k8s update strategy) là tùy chọn quan trọng nhất để cấu hình các bản cập nhật liên tục. Trong định nghĩa Triển khai, spec.strategy.type có hai giá trị khả thi:
- RollingUpdate: Các pod mới được thêm dần dần và các pod cũ bị chấm dứt dần dần.
- Recreate: Tất cả các pod cũ bị chấm dứt cùng một lúc trước khi bất kỳ pod mới nào được thêm vào.
- maxSurge: Số lượng pod có thể được tạo trên số lượng pod mong muốn trong một cập nhật.
- maxUnavailable: Số lượng pod có thể không khả dụng trong quá trình cập nhật.
Khi ứng dụng gặp lỗi do hình ảnh không chính xác hoặc triển khai không ổn định, chúng ta có thể muốn khôi phục Triển khai (k8s rollback). Theo mặc định, toàn bộ lịch sử triển khai của Triển khai được lưu trong hệ thống, có thể sử dụng để khôi phục sau trong trường hợp triển khai không ổn định. Chúng ta có thể sử dụng lịch sử này để khôi phục bất cứ lúc nào chúng ta muốn.
Để biết thêm về Cập nhật lăn và Khôi phục, hãy truy cập tài liệu chính thức của Kubernetes tại đây.
Trong bài viết này, chúng ta sẽ cập nhật triển khai bằng chiến lược Cập nhật lăn mặc định và khôi phục triển khai. Để khôi phục triển khai, chúng ta sẽ sử dụng hình ảnh không chính xác trong một trong các bản cập nhật cho triển khai.
Điều kiện tiên quyết
- Cụm Kubernetes có ít nhất 1 nút công nhân.
Nếu bạn muốn tìm hiểu cách tạo Cụm Kubernetes, hãy nhấp vào đây. Hướng dẫn này sẽ giúp bạn tạo cụm Kubernetes với 1 Master và 2 Node trên AWS Ubuntu 18.04 EC2 Instances.
Chúng ta sẽ làm gì?
- Cập nhật và khôi phục liên tục
Cập nhật và khôi phục liên tục
Tạo tệp định nghĩa triển khai cho Nginx với mẫu pod triển khai. Trong đó, chúng tôi đã chỉ định phiên bản Nginx là "nginx:1.14.2".
Mã:
vim my-deployment.yml
Mã:
apiVersion: apps/v1
kind: Deployment
metadata: name: rolling-update-demo labels: app: nginx
spec: replicas: 4 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22556%22%3E%3C/svg%3E
Hãy kiểm tra các pod hiện có và tạo một triển khai.
Mã:
kubectl get pods
Mã:
kubectl create -f my-deployment.yml
Mã:
kubectl get deployments
Mã:
kubectl get replicaset
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22407%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng chúng ta có 1 triển khai trong đó chúng ta có 1 replicaset và 4 pod được kiểm soát bởi replicaset.
Bây giờ, hãy thay đổi phiên bản Nginx từ "nginx:1.14.2" thành "nginx:1.61.1"
Mã:
vim my-deployment.yml
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22160%22%3E%3C/svg%3E
Áp dụng thay đổi cho triển khai và lấy thông tin chi tiết về pod, replicaset và triển khai.
Mã:
kubectl apply -f my-deployment.yml
Mã:
kubectl get deployments
Mã:
kubectl get replicaset
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22551%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, có thể thấy một replicaset mới đã được tạo và có 4 pod bên dưới. Nhưng chúng ta vẫn thấy replicaset cũ hơn có 0 pod.
Bây giờ, nếu chúng ta lại thay đổi phiên bản Nginx nhưng lần này chúng ta đưa ra Phiên bản Nginx sai, thì việc triển khai sẽ không thành công vì Nginx Image không tồn tại cho phiên bản sai.
Mã:
vim my-deployment.yml
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22186%22%3E%3C/svg%3E
Hãy áp dụng thay đổi cho triển khai.
Mã:
kubectl apply -f my-deployment.yml
Mã:
kubectl get deployments
Mã:
kubectl get replicaset
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22502%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, có thể thấy rằng các Pod mới đang gặp lỗi "ErrImagePull". Các pod đang gặp lỗi vì Nginx Image không tồn tại cho phiên bản "ngin:1.1.1".
Bây giờ, nếu chúng ta muốn quay lại các image đang hoạt động trước đó, chúng ta có thể khôi phục về bản sửa đổi trước đó nếu trạng thái triển khai không ổn.
Để khôi phục, trước tiên chúng ta có thể lấy lịch sử triển khai của bản triển khai triển khai bằng lệnh sau.
Mã:
kubectl rollout history deployments rolling-update-demo
Mã:
kubectl rollout history deployments rolling-update-demo --revision=2
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22422%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng bản sửa đổi-2 có phiên bản Nginx Image "nginx:1.16.1" đang hoạt động trước khi chúng tôi cập nhật triển khai của mình với phiên bản Nginx "ngin:1.1.1" không thành công.
Bây giờ, hãy quay lại bản triển khai về bản sửa đổi cuối cùng mà chúng ta có trước khi triển khai không thành công hiện tại.
Mã:
kubectl get deployments
Mã:
kubectl get pods
Mã:
kubectl get replicaset
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22333%22%3E%3C/svg%3E
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng chúng tôi đã khôi phục lại bản triển khai mới nhất và hiện tại chúng tôi có bản sửa đổi triển khai đã hoạt động trước bản cập nhật cuối cùng.
Để biết thêm về bản triển khai, bạn có thể mô tả bằng cách sử dụng thông tin sau lệnh.
Mã:
kubectl get deployments
Mã:
kubectl describe deployment rolling-update-demo
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22490%22%3E%3C/svg%3E