Một Pod có thể có nhiều container chạy ứng dụng bên trong nó và về mặt kỹ thuật, đây được gọi là pod đa container. Nhưng pod cũng có thể có một hoặc nhiều container init. Các container này được chạy trước khi container ứng dụng được khởi động. Container init luôn chạy đến khi hoàn tất và mỗi container init phải hoàn tất thành công trước khi container tiếp theo bắt đầu.
Sự khác biệt giữa container thông thường và InitContainer là InitContainer không hỗ trợ lifecycle, livenessProbe, readyinessProbe hoặc startupProbe vì chúng phải chạy đến khi hoàn tất trước khi Pod có thể sẵn sàng. Nếu có nhiều init container trong một Pod, Kubelet sẽ chạy từng init container theo trình tự.
Init container được sử dụng để thiết lập mã tùy chỉnh không có trong hình ảnh ứng dụng. Init container có thể được sử dụng để cung cấp cơ chế chặn hoặc trì hoãn khởi động container ứng dụng cho đến khi đáp ứng được một tập hợp các điều kiện tiên quyết. Bằng cách giữ các công cụ không cần thiết tách biệt với các vùng chứa ứng dụng chính, InitContainer có thể được sử dụng để hạn chế bề mặt tấn công của ảnh vùng chứa ứng dụng.
Mỗi InitContainer phải hoàn tất thành công trước khi vùng chứa tiếp theo được khởi động. Theo cách này, Init Container cung cấp một cách để chặn hoặc trì hoãn việc khởi động các vùng chứa ứng dụng cho đến khi một số điều kiện tiên quyết được đáp ứng.
Để biết thêm về InitContainer, hãy nhấp vàođây để truy cập tài liệu chính thức của Kubernetes.
Trong bài viết này, chúng ta sẽ xem bản trình diễn về InitContainer khởi động trước vùng chứa chính.
\
Trong ví dụ này, 2 InitContainer sẽ chạy trong 2 giây mỗi cái và khi chúng hoàn tất thành công, container chính sẽ khởi động và sẽ hoạt động trong 36000 giây.
Ví dụ này minh họa cách sử dụng chức năng InitContainer và bạn có thể có trường hợp sử dụng riêng của mình
Lấy danh sách các cổng hiện có trong cụm và tạo một pod init-container bằng các lệnh sau.
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng phần thân là đang được tạo.
Chúng ta có thể kiểm tra nhật ký của cả init-container và main container để hiểu quá trình thực thi và luồng mà các container được tạo và thực thi.
Từ ảnh chụp màn hình ở trên, chúng ta có thể hiểu rằng bạn cần container được thực thi trước theo trình tự chúng được xác định trong định nghĩa file. Sau khi thực thi init-containers xong thì container chính sẽ bắt đầu.
Init-containers luôn được bắt đầu theo trình tự được định nghĩa trong tệp định nghĩa.
Chúng ta có thể biết thêm chi tiết về pod bằng lệnh sau.
Trong ảnh chụp màn hình ở trên, chúng ta có thể thấy trạng thái của cả hai init-containers đã bị chấm dứt và lý do đã hoàn tất.
Điều đó có nghĩa là init-containers đã thực hiện thành công thao tác của chúng và chúng đã bị chấm dứt.
Trong ảnh chụp màn hình ở trên, bạn có thể thấy trạng thái của vùng chứa chính đang chạy.
Khi bạn không cần pod này nữa, bạn có thể xóa nó bằng lệnh sau.
Sự khác biệt giữa container thông thường và InitContainer là InitContainer không hỗ trợ lifecycle, livenessProbe, readyinessProbe hoặc startupProbe vì chúng phải chạy đến khi hoàn tất trước khi Pod có thể sẵn sàng. Nếu có nhiều init container trong một Pod, Kubelet sẽ chạy từng init container theo trình tự.
Init container được sử dụng để thiết lập mã tùy chỉnh không có trong hình ảnh ứng dụng. Init container có thể được sử dụng để cung cấp cơ chế chặn hoặc trì hoãn khởi động container ứng dụng cho đến khi đáp ứng được một tập hợp các điều kiện tiên quyết. Bằng cách giữ các công cụ không cần thiết tách biệt với các vùng chứa ứng dụng chính, InitContainer có thể được sử dụng để hạn chế bề mặt tấn công của ảnh vùng chứa ứng dụng.
Mỗi InitContainer phải hoàn tất thành công trước khi vùng chứa tiếp theo được khởi động. Theo cách này, Init Container cung cấp một cách để chặn hoặc trì hoãn việc khởi động các vùng chứa ứng dụng cho đến khi một số điều kiện tiên quyết được đáp ứng.
Để biết thêm về InitContainer, hãy nhấp vàođây để truy cập tài liệu chính thức của Kubernetes.
Trong bài viết này, chúng ta sẽ xem bản trình diễn về InitContainer khởi động trước vùng chứa chính.
Đ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ì?
- Tạo Pod với InitContainers
Tạo Pod với InitContainers
Tạo tệp đối tượng cho InitContainers bằng nội dung sau.
Mã:
vimpod-with-initcontainer.yml
Mã:
apiVersion: v1kind: Podmetadata: name: pod-with-initcontainer labels: app: myappspec: containers: - name: main-container image: busybox command: ['sh', '-c', 'echo Inside the main-container! && sleep 36000'] initContainers: - tên: init-container-1 hình ảnh: busybox lệnh: ['sh', '-c', 'echo Bên trong init-container-1 bắt đầu; sleep 2;echo init-container-1 đã hoàn thành;'] - tên: init-container-2 hình ảnh: busybox lệnh: ['sh', '-c', 'echo Bên trong init-container-2 bắt đầu; sleep 2;echo init-container-2 completed;']
Trong ví dụ này, 2 InitContainer sẽ chạy trong 2 giây mỗi cái và khi chúng hoàn tất thành công, container chính sẽ khởi động và sẽ hoạt động trong 36000 giây.
Ví dụ này minh họa cách sử dụng chức năng InitContainer và bạn có thể có trường hợp sử dụng riêng của mình
Lấy danh sách các cổng hiện có trong cụm và tạo một pod init-container bằng các lệnh sau.
Mã:
kubectl get pods #Lấy danh sách các pod hiện có
Mã:
kubectl apply -f pod-with-initcontainer.yml #Tạo một pod bằng InitContainer
Mã:
kubectl get pods #Kiểm tra pod đã được tạo
Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng phần thân là đang được tạo.
Chúng ta có thể kiểm tra nhật ký của cả init-container và main container để hiểu quá trình thực thi và luồng mà các container được tạo và thực thi.
Mã:
kubectl get pods
Mã:
kubectl logs pod-with-initcontainer -c init-container-1 --timestamps=true #Kiểm tra nhật ký của InitContainer đầu tiên
Mã:
kubectl logs pod-with-initcontainer -c init-container-2 --timestamps=true#Kiểm tra nhật ký của InitContainer thứ 2
Mã:
kubectl logs pod-with-initcontainer --timestamps=true#Kiểm tra nhật ký của main container
Từ ảnh chụp màn hình ở trên, chúng ta có thể hiểu rằng bạn cần container được thực thi trước theo trình tự chúng được xác định trong định nghĩa file. Sau khi thực thi init-containers xong thì container chính sẽ bắt đầu.
Init-containers luôn được bắt đầu theo trình tự được định nghĩa trong tệp định nghĩa.
Chúng ta có thể biết thêm chi tiết về pod bằng lệnh sau.
Mã:
kubectl get pods #Lấy danh sách Pod
Mã:
kubectl describe pod pod-with-initcontainer #Lấy chi tiết về Pod
Trong ảnh chụp màn hình ở trên, chúng ta có thể thấy trạng thái của cả hai init-containers đã bị chấm dứt và lý do đã hoàn tất.
Điều đó có nghĩa là init-containers đã thực hiện thành công thao tác của chúng và chúng đã bị chấm dứt.
Trong ảnh chụp màn hình ở trên, bạn có thể thấy trạng thái của vùng chứa chính đang chạy.
Khi bạn không cần pod này nữa, bạn có thể xóa nó bằng lệnh sau.
Mã:
kubectl get pods
Mã:
kubectl delete pod pod-with-initcontainer #Xóa Pod