Cập nhật Rolling NGINX trên Kubernetes
Bài viết này hướng dẫn quy trình thực hiện cập nhật rolling cho một deployment NGINX trên Kubernetes để nâng cấp máy chủ web NGINX lên phiên bản 1.18. Deployment có tên là nginx-deployment đã được cập nhật để phản ánh những thay đổi gần đây từ nhóm phát triển ứng dụng.
1. Khởi động Cập nhật Rolling
Để bắt đầu quá trình cập nhật rolling, lệnh kubectl set image được sử dụng. Lệnh này thông báo cho Kubernetes cập nhật nginx-container trong nginx-deployment để sử dụng hình ảnh mới nginx:1.18. Kubernetes sau đó bắt đầu quy trình cập nhật rolling, tạo ra các pod mới với hình ảnh đã cập nhật trong khi vẫn duy trì các pod cũ, đảm bảo ứng dụng luôn sẵn sàng phục vụ.
bash
thor@jumphost ~$ kubectl set image deployment/nginx-deployment nginx-container=nginx:1.18
deployment.apps/nginx-deployment image updated
2. Kiểm tra Trạng thái Rollout
Sau khi khởi động cập nhật, lệnh kubectl rollout status được sử dụng để theo dõi tiến trình. Lệnh này xác nhận rằng các pod mới đã được tạo thành công và sẵn sàng phục vụ lưu lượng truy cập.
bash
thor@jumphost ~$ kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out
3. Kiểm tra Pod trong Namespace Đúng
Ban đầu, việc kiểm tra các pod bằng nhãn app=nginx không hiển thị tài nguyên nào. Điều này xảy ra vì các pod của deployment nằm trong namespace mặc định, trong khi lệnh ban đầu có thể đã tìm kiếm trong một namespace khác hoặc không xác định. Để giải quyết vấn đề này, lệnh kubectl get pods đã được chạy với tham số --all-namespaces. Lệnh này đã xác định đúng các pod và cho thấy chúng đang chạy trong namespace default.
bash
thor@jumphost ~$ kubectl get pods -l app=nginx
No resources found in default namespace.
thor@jumphost ~$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default nginx-deployment-58cf54c7f6-hzwvn 1/1 Running 0 2m43s
default nginx-deployment-58cf54c7f6-w4wh4 1/1 Running 0 2m51s
default nginx-deployment-58cf54c7f6-wznkx 1/1 Running 0 2m41s
kube-system coredns-5d78c9869d-bn6v4 1/1 Running 0 13m
kube-system coredns-5d78c9869d-g75tz 1/1 Running 0 13m
kube-system etcd-kodekloud-control-plane 1/1 Running 0 13m
kube-system kindnet-grrg5 1/1 Running 0 13m
kube-system kube-apiserver-kodekloud-control-plane 1/1 Running 0 13m
kube-system kube-controller-manager-kodekloud-control-plane 1/1 Running 0 13m
kube-system kube-proxy-jtxjl 1/1 Running 0 13m
kube-system kube-scheduler-kodekloud-control-plane 1/1 Running 0 13m
local-path-storage local-path-provisioner-6bc4bddd6b-54lws 1/1 Running 0 13m
4. Xác minh Cuối cùng
Bước cuối cùng là xác nhận rằng các pod mới thực sự đang sử dụng hình ảnh nginx:1.18 đúng. Điều này được thực hiện bằng cách sử dụng lệnh kubectl describe pod trên một trong các pod mới, nginx-deployment-58cf54c7f6-hzwvn. Kết quả hiển thị rõ ràng rằng hình ảnh của nginx-container đã được cập nhật lên phiên bản mong muốn.
bash
thor@jumphost ~$ kubectl describe pod nginx-deployment-58cf54c7f6-hzwvn
Name: nginx-deployment-58cf54c7f6-hzwvn
Namespace: default
Priority: 0
Service Account: default
Node: kodekloud-control-plane/172.17.0.2
Start Time: Tue, 23 Sep 2025 05:17:44 +0000
Labels: app=nginx-app
pod-template-hash=58cf54c7f6
Annotations: <none>
Status: Running
IP: 10.244.0.9
IPs:
IP: 10.244.0.9
Controlled By: ReplicaSet/nginx-deployment-58cf54c7f6
Containers:
nginx-container:
Container ID: containerd://df902a1d0ebdef8caad17cab31cddec1af4a4c5f6152b0933e6e460c8b7a9fbd
Image: nginx:1.18
Image ID: docker.io/library/nginx@sha256:e90ac5331fe095cea01b121a3627174b2e33e06e83720e9a934c7b8ccc9c55a0
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 23 Sep 2025 05:17:45 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-smr26 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-smr26:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 7m41s default-scheduler Successfully assigned default/nginx-deployment-58cf54c7f6-hzwvn to kodekloud-control-plane
Normal Pulled 7m41s kubelet Container image "nginx:1.18" already present on machine
Normal Created 7m41s kubelet Created container nginx-container
Normal Started 7m40s kubelet Started container nginx-container
Kết quả xác nhận việc cập nhật thành công và cho thấy các pod mới đang chạy và khỏe mạnh. Điều này hoàn thành quy trình cập nhật rolling cho ứng dụng NGINX.
Thực hành tốt nhất
- Luôn kiểm tra trạng thái pod sau khi cập nhật: Duy trì việc kiểm tra thường xuyên sau mỗi cập nhật để đảm bảo rằng các pod đang hoạt động bình thường.
- Sao lưu cấu hình: Trước khi thực hiện bất kỳ cập nhật nào, hãy đảm bảo bạn đã sao lưu cấu hình hiện tại.
Những cạm bẫy thường gặp
- Không kiểm tra namespace: Nhiều người dùng thường quên kiểm tra namespace khi tìm kiếm các pod, dẫn đến việc không tìm thấy tài nguyên.
- Thiếu giám sát sau cập nhật: Không theo dõi tình trạng của các pod sau khi cập nhật có thể dẫn đến việc bỏ lỡ các lỗi tiềm ẩn.
Mẹo Hiệu suất
- Sử dụng Horizontal Pod Autoscaler để tự động điều chỉnh số lượng pod dựa trên lưu lượng truy cập.
- Xem xét cấu hình resource requests và limits cho các container để tối ưu hóa hiệu năng.
Hỏi đáp (FAQ)
Q: Có cần phải dừng dịch vụ NGINX trước khi cập nhật không?
A: Không, với cập nhật rolling, NGINX sẽ tự động chuyển giao lưu lượng từ các pod cũ sang các pod mới mà không cần dừng dịch vụ.
Q: Làm thế nào để quay lại phiên bản cũ nếu có sự cố?
A: Bạn có thể sử dụng lệnh kubectl rollout undo deployment/nginx-deployment để quay lại phiên bản trước đó nếu cần.
Kết luận
Cập nhật rolling cho deployment NGINX trên Kubernetes là một quy trình đơn giản nhưng mạnh mẽ, giúp duy trì tính khả dụng của ứng dụng trong khi cập nhật. Đừng quên kiểm tra trạng thái và thực hiện các bước bảo trì cần thiết sau khi cập nhật để đảm bảo mọi thứ hoạt động trơn tru. Hãy thử nghiệm và áp dụng trong môi trường của bạn ngay hôm nay để nâng cao khả năng của ứng dụng!
Ghi chú quan trọng: Đảm bảo bạn đã hiểu rõ về cấu hình mạng và namespace trước khi thực hiện cập nhật để tránh những sự cố không mong muốn.