Kubernetes - chia sẻ bí mật trên các không gian tên


96

Có cách nào để chia sẻ bí mật giữa các không gian tên trong Kubernetes không?

Trường hợp sử dụng của tôi là: Tôi có cùng một sổ đăng ký riêng cho tất cả các vùng tên của mình và tôi muốn tránh tạo ra cùng một bí mật cho mỗi vùng.

Cảm ơn bạn đã giúp đỡ.


điều này tự động hóa việc chia sẻ bí mật: github.com/zakkg3/ClusterSecret
NicoKowe

Câu trả lời:


88

Các đối tượng API bí mật nằm trong một không gian tên. Chúng chỉ có thể được tham chiếu bởi các nhóm trong cùng không gian tên đó. Về cơ bản, bạn sẽ phải tạo bí mật cho mọi không gian tên.

https://kubernetes.io/docs/concept/configuration/secret/#details


3
Tương tự cho các bản đồ cấu hình. kubernetes.io/docs/tasks/configure-pod-container/…
Breedly

1
Đó là câu trả lời chính xác, đáng đề cập là bạn có thể sao chép sang không gian tên khác bằng kubectl + sed, tất cả trong một dòng, hãy xem câu trả lời của tôi bên dưới.
NicoKowe


70

Chúng chỉ có thể được tham chiếu bởi các nhóm trong cùng không gian tên đó. Nhưng bạn chỉ có thể sao chép bí mật từ không gian tên này sang không gian tên khác. Đây là một ví dụ về sao chép localdockerregbí mật từ defaultkhông gian tên sang dev:

 kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -

### UPDATE ### Trong Kubernetes v1.14, --exportcờ không được dùng nữa . Vì vậy, Lệnh có -oyamlcờ sau sẽ hoạt động mà không có cảnh báo trong các phiên bản sắp tới.

kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -

hoặc bên dưới nếu không gian tên nguồn không nhất thiết phải là mặc định

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -

1
Sẽ không làm việc này nếu những bí mật mà bạn đang xuất khẩu từ không nằm trong không gian tên mặc định
gerasalus

1
Công trình đối với tôi qua bất kỳ hai không gian tên trên v1.13
Kshitij Saraogi

4
Rất tiếc khi tôi sử dụng lệnh thứ hai (không có --exportcờ), tôi gặp lỗi nói rằng "không gian tên từ tùy chọn được cung cấp không khớp". kubectl phiên bản 1.15. Tôi nghĩ rằng bạn có thể cần phải sử dụng sedhoặc một cái gì đó ở giữa hai kubectllệnh để loại bỏ các không gian tên từ yaml đầu ra
Matt Dodge

6
Để được chính xác, bạn cần phải loại bỏ không gian tên nguồn từ YAML trung gian: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps chưa được thử nghiệm với các loại đối tượng khác, nhưng nên làm việc pps đừng quên nguồn xóa nếu bạn đang di chuyển
Costa Shapiro

16

Câu trả lời được chấp nhận là đúng, đây là một gợi ý nếu bạn đang muốn sao chép bí mật giữa các không gian tên.

kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -

/ chỉnh sửa tháng 4 năm 2020:

Bây giờ có một cách để chia sẻ hoặc đồng bộ hóa bí mật giữa các không gian tên và không gian tên bằng cách sử dụng toán tử ClusterSecret:

https://github.com/zakkg3/ClusterSecret


6

Bí mật là các tài nguyên không gian tên, nhưng bạn có thể sử dụng phần mở rộng Kubernetes để sao chép chúng. Chúng tôi sử dụng điều này để phổ biến thông tin đăng nhập hoặc chứng chỉ được lưu trữ trong bí mật cho tất cả các không gian tên một cách tự động và giữ chúng đồng bộ hóa (sửa đổi nguồn và tất cả các bản sao đều được cập nhật). Xem Kubernetes Reflector ( https://github.com/EmberStack/kubernetes-reflector ).

Tiện ích mở rộng cho phép bạn tự động sao chép và đồng bộ hóa bí mật giữa các không gian tên thông qua chú thích:

Trên nguồn bí mật, hãy thêm các chú thích:

 annotations:
   reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"

Điều này sẽ tạo một bản sao của bí mật trong tất cả các không gian tên. Bạn có thể giới hạn không gian tên mà bản sao được tạo bằng cách sử dụng:

reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"

Tiện ích này cũng hỗ trợ Bản đồ cấu hình và chứng chỉ trình quản lý chứng chỉ. Disclainer: Tôi là tác giả của phần mở rộng Kubernetes Reflector.


Tiện ích tuyệt vời. Sử dụng nó ngay bây giờ. Cảm ơn!
CTiPKA


1

Cải thiện từ @NicoKowe

Một lớp lót để sao chép tất cả bí mật từ không gian tên này sang không gian tên khác

$ for i in `kubectl get secrets | awk '{print $1}'`; do  kubectl get secret $1 -n <source-namespace> -o yaml | sed s/"namespace: <source-namespace>"/"namespace: <target-namespace>"/ | kubectl apply -n <target-namespace> -f -  ; done

1

--export không được dùng nữa

sed không phải là công cụ thích hợp để chỉnh sửa YAML hoặc JSON.

Đây là một ví dụ sử dụng jqđể xóa không gian tên và siêu dữ liệu khác mà chúng tôi không muốn:

kubectl get secret cure-for-covid-19 -n china -o json | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' | kubectl apply -n rest-of-world -f -

1

Dựa trên câu trả lời của @Evans Tucker nhưng sử dụng danh sách trắng thay vì xóa trong bộ lọc jq để chỉ giữ lại những gì chúng tôi muốn.

kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name"}' | kubectl apply -n rest-of-world -f -

Thực chất là cùng một thứ nhưng bảo quản nhãn mác.

kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name", "labels"}' | kubectl apply -n rest-of-world -f -


0

kubectl lấy bí mật gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -


0

Sử dụng RBAC để cho phép can thiệp dịch vụ sử dụng bí mật trên không gian tên ban đầu. Tuy nhiên, điều này không được khuyến khích để có một bí mật được chia sẻ giữa các bảng tên.


0

Giải pháp cho việc sao chép mọi bí mật.

kubectl delete secret --namespace $TARGET_NAMESPACE--all;
kubectl get secret --namespace default --output yaml \
    | sed "s/namespace: $SOURCE_NAMESPACE/namespace: $TARGET_NAMESPACE/" \
    | kubectl apply --namespace $TARGET_NAMESPACE --filename -;

0

yqlà một công cụ dòng lệnh hữu ích để chỉnh sửa tệp YAML. Tôi đã sử dụng điều này kết hợp với các câu trả lời khác để có được điều này:

kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -

0

Bạn cũng có thể nghĩ đến việc sử dụng Bí mật bên ngoài Kubernetes của GoDaddy ! nơi bạn sẽ lưu trữ các bí mật của mình trong AWS Secret Manager (ASM) và bộ điều khiển bí mật của GoDaddy sẽ tự động tạo các bí mật. Hơn nữa, sẽ có sự đồng bộ giữa ASM và K8S cluster.


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.