Menggunakan variabel lingkungan dalam spesifikasi penyebaran Kubernetes

18

Saat ini saya menggunakan spesifikasi Kubernetes Deployment.yamluntuk menggunakan layanan. Spesifikasi ini mencakup referensi kata demi kata ke alamat IP tertentu (ditandai sebagai <static-ip-address>berikut):

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

Saya khawatir tentang mendorong informasi seperti kata sandi atau alamat IP ke repositori Git jarak jauh. Dapatkah saya menghindari hal ini misalnya dengan memanfaatkan variabel lingkungan, misalnya dengan spesifikasi penyebaran dan penerapan aktual secara kasar sebagai berikut:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

dan

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

Jelas sintaksis spesifik ini belum berfungsi. Tetapi apakah hal seperti ini mungkin dan jika demikian bagaimana?

Saya lebih suka tidak mengandalkan alat penyediaan terpisah . Rahasia dan ConfigMaptampaknya menjanjikan, tetapi tampaknya rahasia tidak dapat dikonsumsi dengan cara yang sesuai dengan tujuan ini. Jika saya bisa langsung merujuk alamat IP statis yang didefinisikan dengan gcloud compute addresses create service-addressyang terbaik.

Drux
sumber

Jawaban:

27

Solusi yang jauh lebih mudah / bersih: envsubst

Di deploy.yml:

LoadbalancerIP: $LBIP

Kemudian buat saja env var Anda dan jalankan kubectl seperti ini:

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

Anda cukup meletakkan variabel Bash biasa ke file apa pun yang ingin Anda gunakan, dalam hal ini manifes YAML, dan minta pembaca membaca file itu. Ini akan menampilkan file dengan env vars digantikan oleh nilainya. Anda juga dapat menggunakannya untuk membuat file baru seperti ini:

envsubst < input.yml > output.yml

envsubsttersedia dalam gettextpaket Ubuntu / Debian misalnya .

Jan Grewe
sumber
2
+1 untuk envsubst. tidak tahu tentang ini sampai sekarang
user1129682
1
Ini tidak mudah / bersih, karena membutuhkan alat terpisah, yang secara default tidak diinstal pada semua sistem (misalnya Mac)
Ivan
@Van Pertanyaannya adalah "Tetapi apakah hal seperti ini mungkin dan jika demikian bagaimana?", Dan itulah jawaban untuk pertanyaannya. Pertanyaannya bukan "Bagaimana saya bisa melakukan ini dengan alat yang tersedia di setiap OS secara default?". Dan ya, ini 1) lebih mudah DAN 2) lebih bersih daripada menggunakan sed. Menurut definisi Anda, solusi yang diusulkan dengan sedjuga tidak akan lebih mudah / bersih, karena tidak ada yang seddiinstal pada mesin Windows secara default.
Jan Grewe
Tidak jelas sama sekali bahwa Anda membandingkan opsi "sed".
Ivan
2

Ada solusi lain senang sederhana: Saya memiliki Google Compute Alamat my-addressdidefinisikan, dan saya ternyata dapat menggunakannya dalam layanan spek seperti: loadBalancerIP: my-address.

Dengan ini sebagai sumber "eksternal" untuk alamat IP dan rahasia kata sandi, tidak ada lagi kebutuhan untuk alat penyediaan (atau templat) untuk kasus penggunaan sederhana saya (dalam lingkungan GKE).

OBSOLETE SEKARANG: Saya telah memutuskan untuk menggunakan sejenis alat bawaan, yaitu "bawaan" sed.

Saya Deployment.yamlsekarang berisi "variabel template" misalnya di

loadBalancerIP: $$EXTERNAL_IP

dan saya menggunakan layanan dengan, katakanlah, 1.2.3.4 sebagai alamat IP eksternal dengan

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -
Drux
sumber
1
Pendekatan Jan Grewe lebih umum dan dapat diterapkan ke sejumlah variabel. Saya sarankan jangan menerima jawabannya alih-alih menerima sendiri yang kurang generik dan perlu disesuaikan untuk setiap variabel tambahan.
TekTimmy
0

Anda dapat menulis pra-prosesor sederhana untuk melakukan substitusi variabel pada file yaml Anda (atau Anda dapat menggunakan jsonnet untuk mencapai hal yang sama pada file konfigurasi json).

Ada beberapa diskusi seputar menambahkan template langsung ke konfigurasi Kubernetes tetapi belum diimplementasikan atau tersedia.

Robert Bailey
sumber
Ya, tetapi jsonnet adalah alat ketentuan seperti yang disebutkan dalam pertanyaan.
Drux
1
Jika Anda mencari sesuatu yang built-in, maka mengikuti masalah yang saya tautkan adalah pilihan terbaik Anda saat ini.
Robert Bailey
0

Sampai template tersedia, cara termudah untuk melakukannya adalah menjalankan pekerjaan yang menggunakan API Kubernetes untuk memperbarui layanan. Script shell pendek dalam gambar berbasis alpine, ditambah dengan rahasia (berisi alamat IP) dan configmap (berisi templat), harus cukup sederhana. Bagian yang sulit dengan benar menggunakan fitur otentikasi dan otorisasi apiserver.

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container memberikan contoh mengakses API. Jelas, Anda ingin POST ke / api / v1 / namespaces / default / services daripada GET dalam contoh itu.

aecolley
sumber
Kedengarannya menarik, tetapi bisakah Anda menjelaskan sedikit lebih banyak. Bisakah Anda memberi atau menunjukkan contoh skrip shell yang sesuai.
Drux