Hộp chứa Init Kubernetes là gì và khi nào bạn nên sử dụng

Vùng chứa Init là một cơ chế Kubernetes để khởi tạo các Pod mới. Các vùng chứa Init bắt đầu và thoát ra trước các vùng chứa ứng dụng chính của Pod, tạo cơ hội để chạy các tập lệnh bootstrap theo thứ tự tuần tự.

Trong bài viết này, chúng tôi sẽ hướng dẫn cách thêm vùng chứa init vào Pod và xem xét một số trường hợp sử dụng phổ biến. Mặc dù các vùng chứa init được cấu hình tương tự như các vùng chứa thông thường, chúng có một số khác biệt vì mục đích chuyên biệt của chúng.

Bạn Đang Xem: Hộp chứa Init Kubernetes là gì và khi nào bạn nên sử dụng

Vai trò của Init Container

Init container giải quyết các thách thức liên quan đến việc khởi chạy ứng dụng lần đầu. Thông thường các dịch vụ phụ thuộc vào việc hoàn thành thành công tập lệnh thiết lập trước khi chúng có thể khởi động hoàn toàn.

Trong các hệ thống nhỏ hơn, bạn có thể thêm tập lệnh vào hình ảnh vùng chứa ứng dụng hiện có của mình. Tuy nhiên, điều này không lý tưởng vì nó thêm một trách nhiệm khác cho hình ảnh. Bạn thậm chí có thể có một số giai đoạn riêng biệt để hoàn thành, mỗi giai đoạn có các mối quan hệ và phụ thuộc riêng của chúng. Việc thêm tất cả các thao tác sử dụng một lần này vào hình ảnh vùng chứa chính của bạn có thể nhanh chóng tạo ra sự phức tạp khó duy trì.

Các vùng chứa Init giải quyết vấn đề này bằng cách cho phép bạn chạy các vùng chứa chuyên dụng trước khi các vùng chứa ứng dụng của Pod bắt đầu. Mỗi Pod có thể có nhiều vùng chứa init; chúng được đảm bảo chạy tuần tự, chỉ sau khi quá trình trước đó đã hoàn thành bằng cách thoát thành công.

Kubernetes bắt đầu các vùng chứa thông thường của Pod sau khi tất cả các vùng chứa init đã hoàn thành. Nếu một vùng chứa init không thành công, nó sẽ được khởi động lại cho đến khi hoàn tất. Khi Pod’s restartPolicy được đặt thành NeverPod được đánh dấu là không thành công.

Thêm Init Containers vào một Pod

Vùng chứa Init được xác định trong spec.initContainers trường của tệp kê khai Pod. Điều này rất giống với một spec.containers Định nghĩa.

Xem Thêm : Cách chuyển ảnh từ Google Drive sang Google Photos

Dưới đây là một ví dụ về một Pod có gắn hai vùng chứa init:

apiVersion: v1
kind: Pod
metadata:
  name: init-containers-pod
spec:
  containers:
    - name: app-container
      image: busybox:latest
      command: ["echo", "Started app"]
  initContainers:
    - name: first-init-container
      image: busybox:latest
      command: ["echo", "This is the first init container"]
    - name: second-init-container
      image: busybox:latest
      command: ["echo", "This is the second init container"]

Sử dụng Kubectl để thêm Pod vào cụm của bạn:

$ kubectl apply -f pod.yaml
pod/init-containers-pod created

Bây giờ truy xuất các nhật ký được liên kết với từng vùng chứa init để xác nhận rằng chúng đã được chạy:

$ kubectl logs init-containers-pod -c first-init-container
This is the first init container

$ kubectl logs init-containers-pod -c second-init-container
This is the second init container

Bạn có thể sử dụng hầu hết các thuộc tính có sẵn cho các tệp kê khai vùng chứa Kubernetes trong một initContainers đồng ruộng. Chúng bao gồm khối lượng, cổng, biến môi trường và bối cảnh bảo mật.

Vùng chứa Init cũng hỗ trợ các giới hạn tài nguyên nhưng chúng được xử lý khác với các vùng chứa thông thường. Giá trị cao nhất của các giới hạn tài nguyên được khai báo bởi tất cả các vùng chứa init được chọn làm giới hạn hiệu dụng của Pod, trừ khi nó thấp hơn tổng các giới hạn trên các vùng chứa ứng dụng của Pod. Giá trị được tính toán này sẽ được sử dụng cho mục đích lập lịch trình.

Một hạn chế của các thùng chứa init là thiếu hỗ trợ cho các đầu dò. Bạn không thể chỉ định livenessProbe, readinessProbehoặc startupProbe các trường để chứa các đối tượng trong initContainers đồng ruộng. Vùng chứa Init là một cơ chế riêng biệt mà bạn có thể sử dụng thay thế hoặc cùng với các đầu dò được gắn vào vùng chứa ứng dụng chính của bạn.

Gotchas thông thường

Có một số lỗi thường gặp khi sử dụng init container. Dưới đây là một số chi tiết cần nhớ:

  • Các vùng chứa Init chạy mỗi khi Pod của chúng khởi động lại. Điều này có nghĩa là các hoạt động của init container của bạn phải được thiết kế đơn giản để chúng có khả năng phục hồi để chạy hai lần trong cùng một Pod. Nếu Pod được khởi động lại, tất cả các vùng chứa init của nó sẽ được thực thi lại.
  • Các thay đổi đối với Pod’s initContainers trường không được hỗ trợ, với một ngoại lệ. Bạn có thể sửa đổi image đồng ruộng. Điều này sẽ khiến Pod khởi động lại và chạy các vùng chứa init mới của bạn.
  • Tên vùng chứa Init cần phải là duy nhất trên tất cả các vùng chứa trong Pod. Điều này bao gồm các vùng chứa init khác và các vùng chứa ứng dụng của bạn. Bạn sẽ thấy lỗi xác thực YAML trong bảng điều khiển của mình nếu bạn cố gắng áp dụng tệp kê khai vi phạm quy tắc này.
  • Pods có một Initialized: False điều kiện khi vùng chứa init đang chạy. Điều này được hiển thị trong Conditions hướng tới khi bạn chạy kubectl describe my-pod.

Xem Thêm : Khắc phục sự cố bằng 4 cách đơn giản

Bạn cũng có thể kiểm tra xem các vùng chứa init của Pod đã hoàn thành hay chưa bằng cách sử dụng kubectl get yêu cầu:

$ kubectl get init-containers-pod
NAME                   READY     STATUS    RESTARTS    AGE
init-containers-pod    0/1       Init:1/2  0           1m

Trong trường hợp này, STATUS cho thấy Pod có hai vùng chứa init, một trong số đó đã hoàn tất thành công. Khi tất cả các vùng chứa init kết thúc, Kubernetes sẽ khởi động các vùng chứa ứng dụng và trạng thái của Pod sẽ thay đổi thành Running.

Khi nào sử dụng hộp chứa Init

Các vùng chứa Init là lý tưởng bất cứ khi nào các triển khai mới của ứng dụng của bạn cần được khởi tạo theo một cách nào đó. Chúng phục vụ cho các tác vụ chuyên dụng chạy trước phụ thuộc vào công cụ bên ngoài hình ảnh vùng chứa chính của bạn.

Dưới đây là một số tình huống mà bạn có thể sử dụng vùng chứa init:

  • Tạo tệp cấu hình từ các biến môi trường.
  • Điền trước bộ đệm được ứng dụng của bạn sử dụng.
  • Di chuyển và khởi tạo một phiên bản cơ sở dữ liệu.
  • Tải xuống và cài đặt các plugin ứng dụng thành một ổ đĩa.
  • Chặn khởi động ứng dụng cho đến khi có sẵn các phần phụ thuộc (chẳng hạn như cơ sở dữ liệu hoặc API bên ngoài).

Một cách khác để đạt được một số nhiệm vụ này là kiểm tra sự sẵn sàng hoặc khởi động. Tuy nhiên, có sự khác biệt về mục đích: các đầu dò chủ yếu được thiết kế để truyền đạt trạng thái của một vùng chứa tới Kubernetes trong khi các vùng chứa init được chỉ định như một cách để thực hiện hành động trong quá trình khởi tạo Pod.

Bản tóm tắt

Init container là một cách để thực hiện các quy trình khởi tạo chạy lần đầu tiên trong Kubernetes Pod. Chúng có thể được sử dụng để chặn hoặc trì hoãn khởi động vùng chứa ứng dụng trong khi bạn đợi các phần phụ thuộc trở nên khả dụng hoặc các tập lệnh bootstrap hoàn tất.

Chức năng của vùng chứa init đôi khi chồng chéo lên các đầu dò khởi động và sẵn sàng. Bạn có thể sử dụng một đầu dò khi hoạt động bạn muốn thực hiện chủ yếu liên quan đến việc chặn khởi động ứng dụng cho đến khi một điều kiện được đáp ứng. Chúng dựa vào tập lệnh của bạn đã tồn tại trong hình ảnh vùng chứa ứng dụng của bạn. Hộp chứa init là lựa chọn tốt hơn khi bạn muốn thực hiện các hành động chuyên môn mà không làm ảnh hưởng đến hình ảnh chính của bạn với các tiện ích sử dụng một lần.


Nguồn: https://maytinhvang.com
Danh mục: TIN HỌC

Bài viết liên quan

0903064855
chat-active-icon