Cách sử dụng kubernetes-client để thực thi “kubectl apply”
Tôi có một tập lệnh python về cơ bản chạy ba lệnh sau:
kubectl apply -f class.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml
Tôi muốn sử dụng kubernetes-client được viết bằng python để thay thế nó. Mã hiện tại của tôi, tải các tệp yaml ở đó (bằng cách sử dụng pyyaml), chỉnh sửa chúng một chút, chèn vào tệp và sử dụng dòng lệnh kubectl để thực hiện ba lệnh đó. Một số mã:
# load files, edit them and dump into new files, part ...
result = run(['kubectl', 'apply', '-f', class_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', rbac_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', deployment_file_path])
# status check part ...
Điều tôi muốn làm: Thay thế ba lệnh đó bằng ứng dụng khách python kubernetes. Đọc tài liệu và xem chủ đề , tôi đã tìm ra create_namespaced_deploymentphương pháp mà tôi nghĩ tôi cần sử dụng cho deployment_file_pathtệp. Nhưng tôi dường như không thể tìm ra những gì tôi cần làm với hai tệp khác.
Giả sử rằng tôi đã nạp ba file YAML (sử dụng pyyaml) và chỉnh sửa chúng (không bán phá giá vào các tập tin mới) và bây giờ bạn có dicts yaml miễn phí deployment_dict, class_dictvà rbac_dict, Làm thế nào tôi có thể sử dụng cho khách hàng để thực hiện ba trên phương pháp?
CHỈNH SỬA : BTW nếu không thể vượt qua ba phần, tôi chỉ có thể kết xuất chúng vào các tệp một lần nữa nhưng tôi muốn sử dụng ứng dụng khách python thay vì kubectl. Làm thế nào để làm nó?
Trả lời
Có một chức năng riêng biệt cho mọi đối tượng và hành động:
from kubernetes import client, config
import yaml
body = yaml.safe_load("my_deployment.yml")
config.load_kube_config()
apps_api = client.AppsV1Api()
apps_api.create_namespaced_deployment(body=body, namespace="default")
apps_api.replace_namespaced_deployment(body=body, namespace="default")
apps_api.patch_namespaced_deployment(body=body, namespace="default")
apps_api.delete_namespaced_deployment(body=body, namespace="default")
body = yaml.safe_load("my_cluster_role.yml")
rbac_api = client.RbacAuthorizationV1Api()
rbac_api.create_cluster_role(body=body)
rbac_api.patch_cluster_role(body=body)
rbac_api.replace_cluster_role(body=body)
rbac_api.delete_cluster_role(body=body)
# And so on
Khi sử dụng kubectl applybạn không quan tâm đối tượng đã tồn tại chưa, sử dụng API nào, áp dụng phương pháp nào, nhưng với client thì bạn sẽ phải làm như vậy. Như bạn thấy từ ví dụ, bạn cần:
- Tải kube-config.
- Chọn API phù hợp để sử dụng (chỉ tạo một đối tượng sau khi bạn đã tải cấu hình).
- Chọn phương pháp bạn muốn sử dụng. Lưu ý rằng
create_somethingsẽ không hoạt động nếusomethingđã tồn tại.
Nhờ mô hình đặt tên nghiêm ngặt, dễ dàng nhận được chức năng cần thiết từ khách hàng bằng cách sử dụng
getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")
Tôi khuyên bạn nên xem qua các ví dụ mà thư viện cung cấp, chúng thực sự rất tuyệt vời để tìm hiểu điều đó.
Tôi không biết, nhưng ở đâu đó tôi đã thấy điều này:
cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF
Và lấy đó làm việc, điều này có hiệu quả không?
cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -