Sử dụng các biến môi trường trong thông số triển khai Kubernetes


18

Tôi hiện đang sử dụng thông số Kubernetes Deployment.yamlđể triển khai dịch vụ. Thông số kỹ thuật bao gồm một tham chiếu nguyên văn đến một địa chỉ IP cụ thể (được đánh dấu như <static-ip-address>bên dưới):

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

Tôi lo ngại về việc đẩy thông tin như mật khẩu hoặc địa chỉ IP vào kho Git từ xa. Tôi có thể tránh điều này không, ví dụ bằng cách sử dụng các biến môi trường, ví dụ với thông số triển khai và triển khai thực tế đại khái như sau:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

Rõ ràng cú pháp cụ thể này chưa hoạt động. Nhưng một cái gì đó như thế này có thể và nếu vậy làm thế nào?

Tôi không muốn dựa vào một công cụ cung cấp riêng biệt . Bí mậtConfigMapcó vẻ đầy hứa hẹn, nhưng rõ ràng chúng không thể được tiêu thụ theo cách phù hợp với mục đích này. Nếu tôi có thể trực tiếp tham chiếu một địa chỉ IP tĩnh được xác định với địa chỉ gcloud compute addresses create service-addressđó sẽ là tốt nhất.

Câu trả lời:


27

Một giải pháp dễ dàng hơn / sạch hơn: envsubst

Trong triển khai.yml:

LoadbalancerIP: $LBIP

Sau đó, chỉ cần tạo var env của bạn và chạy kubectl như thế này:

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

Bạn chỉ cần đặt các biến Bash thông thường vào bất kỳ tệp nào bạn muốn sử dụng, trong trường hợp này là bảng kê khai YAML và đã đọc tệp đó. Nó sẽ xuất ra tệp với các env vars được thay thế bằng các giá trị của chúng. Bạn cũng có thể sử dụng nó để tạo các tệp mới như thế này:

envsubst < input.yml > output.yml

envsubstcó sẵn trong ví dụ gettextgói Ubuntu / Debian .


2
+1 cho envsubst. không biết về điều này cho đến bây giờ
user1129682

1
Nó không dễ dàng / sạch hơn, vì nó yêu cầu một công cụ riêng, không được cài đặt mặc định trên tất cả các hệ thống (ví dụ: Mac)
Ivan

@Ivan Câu hỏi của anh ấy là "Nhưng điều gì đó có thể như thế này và nếu có thì như thế nào?", Và đó là câu trả lời cho câu hỏi của anh ấy. Câu hỏi không phải là "Làm thế nào tôi có thể làm điều này với các công cụ có sẵn trên mọi HĐH theo mặc định?". Và vâng, nó dễ hơn 1) VÀ 2) sạch hơn so với sử dụng sed. Theo định nghĩa của bạn, giải pháp được đề xuất với sedcũng sẽ không dễ dàng / sạch hơn, vì sedtheo mặc định, không có cài đặt nào trên máy Windows.
Jan Grewe

Không rõ ràng về việc bạn đang so sánh với tùy chọn "sed".
Ivan

2

Có một giải pháp đơn giản thú vị khác: Tôi đã my-addressxác định Địa chỉ tính toán của Google và rõ ràng tôi có thể sử dụng nó trong thông số dịch vụ như vậy : loadBalancerIP: my-address.

Với nguồn này là nguồn "bên ngoài" cho các địa chỉ IP và bí mật cho mật khẩu, không cần thêm công cụ cung cấp (hoặc mẫu) cho trường hợp sử dụng đơn giản của tôi (trong môi trường GKE).

OBSOLLEX NGAY BÂY GIỜ: Rốt cuộc, tôi đã quyết định sử dụng một công cụ cung cấp các loại, cụ thể là "tích hợp" sed.

Deployment.yamlBây giờ của tôi có chứa một "biến mẫu", vd

loadBalancerIP: $$EXTERNAL_IP

và tôi triển khai dịch vụ với, ví dụ, 1.2.3.4 làm địa chỉ IP bên ngoài với

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -

1
Cách tiếp cận của Jan Grewe chung chung hơn, có thể áp dụng cho bất kỳ số lượng biến nào. Tôi sẽ đề nghị chấp nhận câu trả lời của anh ấy thay vì chấp nhận câu trả lời của bạn ít chung chung hơn và cần được điều chỉnh cho mỗi biến bổ sung.
TekTimmy

0

Bạn có thể viết một bộ xử lý trước đơn giản để thay thế biến trên các tệp yaml của bạn (hoặc bạn có thể sử dụng jsonnet để thực hiện điều tương tự trên các tệp cấu hình json).

Có một số cuộc thảo luận xung quanh việc thêm các mẫu trực tiếp vào cấu hình Kubernetes nhưng nó chưa được triển khai hoặc có sẵn.


Có, nhưng jsonnet là một công cụ cung cấp như được đề cập trong câu hỏi.
Drux

1
Nếu bạn đang tìm kiếm thứ gì đó tích hợp sẵn, thì sau vấn đề tôi liên quan đến là đặt cược tốt nhất của bạn tại thời điểm này.
Robert Bailey

0

Cho đến khi các mẫu có sẵn, cách dễ nhất để thực hiện là chạy một công việc sử dụng API Kubernetes để cập nhật dịch vụ. Một tập lệnh shell ngắn trong một hình ảnh dựa trên núi cao, cùng với một bí mật (chứa địa chỉ IP) và một sơ đồ cấu hình (chứa mẫu), nên đủ đơn giản. Bit khó là chính xác bằng cách sử dụng các tính năng xác thực và ủy quyền của người xin lỗi.

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container đưa ra ví dụ về việc truy cập API. Rõ ràng, bạn sẽ muốn POST tới / api / v1 / không gian tên / mặc định / dịch vụ thay vì GET trong ví dụ đó.


Nghe có vẻ thú vị, nhưng bạn có thể vui lòng giải thích thêm một chút. Bạn có thể đưa ra hoặc chỉ ra một ví dụ về một kịch bản shell phù hợp.
Drux
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.