Cập nhật ConfigMap hoặc Secret của k8s mà không xóa cái hiện có


100

Tôi đã sử dụng K8S ConfigMap và Secret để quản lý tài sản của chúng tôi. Thiết kế của tôi khá đơn giản, giữ các tệp thuộc tính trong git repo và sử dụng máy chủ xây dựng như Thoughtworks GO để tự động triển khai chúng thành Bản đồ cấu hình hoặc Bí mật (với điều kiện lựa chọn) cho cụm k8s của tôi.

Hiện tại, tôi thấy nó không thực sự hiệu quả khi tôi phải xóa luôn ConfigMap và Secret hiện có và tạo một cái mới để cập nhật như bên dưới:

  1. kubectl delete configmap foo

  2. kubectl create configmap foo --from-file foo.properties

Có cách nào hay và đơn giản để thực hiện ở trên một bước và hiệu quả hơn việc xóa hiện tại không? Có khả năng những gì tôi đang làm bây giờ có thể làm ảnh hưởng đến vùng chứa sử dụng các bản đồ cấu hình này nếu nó cố gắng gắn kết trong khi bản đồ cấu hình cũ bị xóa và bản đồ mới chưa được tạo.

Cảm ơn trước.


Tôi vừa tạo một dự án để ánh xạ cấu hình thành các giá trị môi trường một cách tự động, nó có thể hữu ích cho ai đó. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Câu trả lời:


160

Bạn có thể lấy YAML từ kubectl create configmaplệnh và chuyển nó đến kubectl replace, như sau:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

3
Đưa lệnh là cách để đi, không nghĩ đến --dry-run có vẻ là phần quan trọng của lệnh!
James Jiang

5
Đối với giá trị của nó, mẫu tương tự này có thể hoạt động cho Secrets ngoài ví dụ về Bản đồ cấu hình được hiển thị ở đây.
rwehner

2
cố gắng này với kubernetes 1.10 nhưng tôi tiếp tục nhận được lỗierror: error validating "STDIN": error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
yee379

2
đó là một lỗi trong 1.10 đã được giải quyết trong 1.10.1 - xem github.com/kubernetes/kubernetes/issues/61780github.com/kubernetes/kubernetes/pull/61808
Jordan Liggitt

2
Câu trả lời chính xác. sử dụng kubectl applythay vì kubectl replace, sẽ làm việc cho cả hai mới và hiện configMap
nahsh

33

Để tham khảo trong tương lai, kubectl replacebây giờ là một cách rất hữu ích để đạt được điều này

kubectl replace -f some_spec.yaml Cho phép bạn cập nhật một Bản đồ cấu hình hoàn chỉnh (hoặc các đối tượng khác)

Xem tài liệu và ví dụ trực tiếp tại đây

Sao chép / dán từ trợ giúp:

# Replace a pod using the data in pod.json.
kubectl replace -f ./pod.json

# Replace a pod based on the JSON passed into stdin.
cat pod.json | kubectl replace -f -

# Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json

2
Điều này đã bỏ lỡ --from-fileyêu cầu. Sơ đồ cấu hình có thể được tạo từ một tệp tùy ý, không chỉ yaml.
Dave Hillier

@ sébastien-portebois cảm ơn! Tôi không biết --forcetùy chọn, điều gì sẽ cho phép chúng tôi sử dụng <dry-run ConfigMap creation> | kubectl replace --force -f -lệnh tiếp cận ngay cả lần đầu tiên, khi Bản đồ cấu hình chưa tồn tại. Nhưng tôi không chắc liệu xóa ConfigMap có an toàn hay không vì các Pods có thể bị hỏng khi thiếu do không tìm thấy. Có lẽ đó là cách tiếp cận tốt hơn <dry-run ConfigMap creation> | kubectl apply -f -? Điểm này được giới thiệu bởi @ karthic-c, bạn nghĩ sao? Ngoài ra @ jordan-liggitt, bạn nghĩ sao?
Alex MM

18

Đối với những thay đổi nhỏ trong configMap, hãy sử dụngedit

kubectl edit configmap <cfg-name>

Thao tác này sẽ mở configMap trong vitrình soạn thảo. Thực hiện các thay đổi và lưu nó.


1
Mát mẻ. Tuy nhiên, như OP đã đề cập, đây là về cách đạt được mục tiêu với các quy trình tự động, ví dụ. với ThoughtWorks Go làm máy chủ xây dựng trong kịch bản của tôi.
James Jiang

5

kubectl replace không thành công nếu một sơ đồ cấu hình đã tồn tại:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

Error from server (NotFound): error when replacing "STDIN": configmaps "falco-config" not found

Giải pháp tốt nhất là sử dụng kubectl applysẽ tạo bản đồ cấu hình nếu không có. Cập nhật bản đồ cấu hình nếu có:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl apply -f -

configmap/falco-config configured


6
Tôi nghĩ bạn có nghĩa là " kubectl replacekhông thành công nếu một bản đồ cấu hình chưa tồn tại".
David Dooling
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.