kubectl áp dụng vs kubectl tạo ra?


266

Những gì tôi hiểu bởi các tài liệu là:

  • kubectl tạo = Tạo tài nguyên k8s mới trong cụm
  • kubectl thay thế = Cập nhật tài nguyên trong cụm trực tiếp
  • kubectl áp dụng = Nếu tôi muốn tạo + thay thế ( Tham khảo )

Câu hỏi của tôi là

  1. Tại sao có ba thao tác để thực hiện cùng một nhiệm vụ trong một cụm?
  2. Các trường hợp sử dụng cho các hoạt động này là gì?
  3. Làm thế nào để họ khác nhau dưới mui xe?

Câu trả lời:


315

Đó là hai cách tiếp cận khác nhau:

Quản lý mệnh lệnh

kubectl createlà những gì chúng ta gọi là Quản lý mệnh lệnh . Theo cách tiếp cận này, bạn nói với API Kubernetes những gì bạn muốn tạo, thay thế hoặc xóa, chứ không phải cách bạn muốn thế giới cụm K8 của bạn trông như thế nào.

Quản lý khai báo

kubectl applylà một phần của phương pháp Quản lý khai báo , trong đó những thay đổi mà bạn có thể đã áp dụng cho một đối tượng sống (tức là thông qua scale) được " duy trì " ngay cả khi bạn applythay đổi đối tượng khác.

Bạn có thể đọc thêm về quản lý mệnh lệnh và khai báo trong tài liệu Quản lý đối tượng Kubernetes .


24
Cái nào sẽ được sử dụng trong sản xuất?
Yogesh Jilhawar

11
@YogeshJilhawar cả hai đều là những cách hợp lệ để làm việc trong sản xuất.
guival

2
Vì vậy, về bản chất, nó giống như sửa đổi toàn bộ đối tượng so với một bản vá một phần?
Ryall

12
Câu trả lời này đã không xác nhận cho dù hai hoạt động này kubectl createkubectl applycó hiệu lực thi hành giống hệt nhau hay không.
Nawaz

61
@Nawaz - Họ làm những việc khác nhau. kubectl createsẽ đưa ra một lỗi nếu tài nguyên đã tồn tại. kubectl applysẽ không Sự khác biệt là kubectl createcụ thể nói "tạo ra thứ này" trong khi kubectl applynói "làm bất cứ điều gì cần thiết (tạo, cập nhật, v.v.) để làm cho nó trông như thế này".
Ông Llama

44

Khi chạy trong tập lệnh CI, bạn sẽ gặp rắc rối với các lệnh bắt buộc vì tạo sẽ gây ra lỗi nếu tài nguyên đã tồn tại.

Những gì bạn có thể làm là áp dụng (mẫu khai báo) đầu ra của lệnh bắt buộc, bằng cách sử dụng --dry-run=true-o yamlcác tùy chọn:

kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -

Lệnh trên sẽ không gây ra lỗi nếu tài nguyên đã tồn tại (và sẽ cập nhật tài nguyên nếu cần).

Điều này rất hữu ích trong một số trường hợp bạn không thể sử dụng mẫu khai báo (ví dụ: khi tạo một bí mật đăng ký docker).


Hoặc, xóa tài nguyên trước khi tạo nó, với cờ --ignore-not- find. Điều này sẽ không gây ra lỗi HasExists . Ví dụ:kubectl delete deployment nginx --ignore-not-found; kubectl create deployment nginx --image=nginx
Noam Manos

33

Chỉ cần đưa ra một câu trả lời thẳng thắn hơn, từ sự hiểu biết của tôi:

apply- thực hiện các thay đổi gia tăng đối với một đối tượng hiện có
create- tạo ra một đối tượng hoàn toàn mới (trước đây không tồn tại / đã bị xóa)


Lấy điều này từ một bài viết DigitalOcean được liên kết bởi trang web Kubernetes:

Chúng tôi sử dụng áp dụng thay vì tạo ở đây để trong tương lai chúng tôi có thể tăng dần áp dụng các thay đổi cho các đối tượng Bộ điều khiển Ingress thay vì ghi đè hoàn toàn chúng.


Là nó? thích khi chúng ta sử dụng docker-compose: + sử dụng applylike docker-compose up -d+ sử dụng createnhư thế docker-compose up -d --buildnào?
Whoiskp

8

Đây là các lệnh bắt buộc :

kubectl run = = kubectl create deployment

Ưu điểm:

  • Đơn giản, dễ học và dễ nhớ.
  • Chỉ yêu cầu một bước duy nhất để thực hiện thay đổi cho cụm.

Nhược điểm:

  • Không tích hợp với các quy trình xem xét thay đổi.
  • Không cung cấp một dấu vết kiểm toán liên quan đến những thay đổi.
  • Không cung cấp một nguồn hồ sơ ngoại trừ những gì đang sống.
  • Không cung cấp một mẫu để tạo các đối tượng mới.

Đây là cấu hình đối tượng bắt buộc :

kubectl create -f your-object-config.yaml

kubectl delete -f your-object-config.yaml

kubectl replace -f your-object-config.yaml

Ưu điểm so với các lệnh bắt buộc:

  • Có thể được lưu trữ trong một hệ thống kiểm soát nguồn như Git.
  • Có thể tích hợp với các quy trình như xem xét các thay đổi trước khi đẩy và kiểm tra các đường mòn.
  • Cung cấp một mẫu để tạo các đối tượng mới.

Nhược điểm so với các mệnh lệnh bắt buộc:

  • Yêu cầu hiểu biết cơ bản về lược đồ đối tượng.
  • Yêu cầu bước bổ sung để viết một tệp YAML.

Ưu điểm so với cấu hình đối tượng khai báo:

  • Đơn giản và dễ hiểu hơn.
  • Trưởng thành hơn sau phiên bản Kubernetes 1.5.

Nhược điểm so với cấu hình đối tượng khai báo:

  • Hoạt động tốt nhất trên các tập tin, không phải thư mục.
  • Các cập nhật cho các đối tượng sống phải được phản ánh trong các tệp cấu hình, nếu không chúng sẽ bị mất trong lần thay thế tiếp theo.

Đây là cấu hình đối tượng khai báo

kubectl diff -f configs/

kubectl apply -f configs/

Ưu điểm so với cấu hình đối tượng bắt buộc:

  • Các thay đổi được thực hiện trực tiếp cho các đối tượng sống được giữ lại, ngay cả khi chúng không được hợp nhất trở lại vào các tệp cấu hình.
  • Hỗ trợ tốt hơn để vận hành trên các thư mục và tự động phát hiện các loại hoạt động (tạo, vá, xóa) cho mỗi đối tượng.

Nhược điểm so với cấu hình đối tượng bắt buộc:

  • Khó gỡ lỗi hơn và hiểu kết quả khi chúng bất ngờ.
  • Cập nhật một phần bằng cách sử dụng diff tạo ra các hoạt động hợp nhất và vá lỗi phức tạp.

3

Các giải thích dưới đây từ các tài liệu chính thức đã giúp tôi hiểu kubectl apply.

Lệnh này sẽ so sánh phiên bản cấu hình mà bạn đang đẩy với phiên bản trước và áp dụng các thay đổi bạn đã thực hiện mà không ghi đè bất kỳ thay đổi tự động nào đối với các thuộc tính bạn chưa chỉ định.

kubectl create mặt khác sẽ tạo ra các tài nguyên (nên không tồn tại).


1

Tạo kubectl có thể làm việc với một tệp cấu hình đối tượng tại một thời điểm. Điều này còn được gọi là quản lý mệnh lệnh

kubectl tạo tên tệp -f | url

kubectl áp dụng hoạt động với các thư mục và thư mục con của nó chứa các tệp yaml cấu hình đối tượng. Điều này còn được gọi là quản lý khai báo. Nhiều tập tin cấu hình đối tượng từ các thư mục có thể được chọn. kubectl áp dụng thư mục -f /

Chi tiết:
https://kubernetes.io/docs/t Nhiệm/manage-kubernetes-objects/declarative-config/ https://kubernetes.io/docs/t Nhiệm/manage-kubernetes-objects/imperative-config/


0

Chúng tôi yêu Kubernetes là bởi vì một khi chúng tôi cung cấp cho họ những gì chúng tôi muốn thì sẽ tìm ra cách để đạt được nó mà không cần bất kỳ sự tham gia nào của chúng tôi.

"Tạo" giống như chơi THIÊN CHÚA bằng cách lấy mọi thứ vào tay chúng ta. Nó tốt cho gỡ lỗi cục bộ khi bạn chỉ muốn làm việc với POD và không quan tâm đến Bộ điều khiển triển khai / nhân rộng abt.

"áp dụng" là chơi theo luật. "Áp dụng" giống như một công cụ chính giúp bạn tạo và sửa đổi và không yêu cầu gì từ bạn để quản lý các nhóm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.