Kubernetes dağıtım özelliğinde ortam değişkenlerini kullanma


18

Şu anda Deployment.yamlbir hizmeti dağıtmak için bir Kubernetes özelliği kullanıyorum . Spesifikasyon, belirli bir IP adresine ( <static-ip-address>aşağıda işaretlenmiş olan ) kelimesi kelimesine bir referans içerir :

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

Parolalar veya IP adresleri gibi bilgileri uzak Git depolarına aktarmayla ilgileniyorum. Örneğin, bir kurulum spesifikasyonu ve fiili konuşlandırma ile aşağıdaki gibi çevre değişkenlerini kullanarak bunu önleyebilir miyim:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

ve

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

Açıkçası bu özel sözdizimi henüz çalışmıyor. Ama böyle bir şey mümkün mü ve eğer öyleyse nasıl?

Ayrı bir hazırlık aracına güvenmemeyi tercih ederim . Sır ve ConfigMapümit vaat ediyor gibi görünüyor, ama görünüşe göre bu amaca uygun bir şekilde tüketilemezler. Eğer bununla tanımlanan bir statik IP adresine doğrudan başvurabilseydim gcloud compute addresses create service-addressen iyisi olurdu.

Yanıtlar:


28

Çok daha kolay / temiz bir çözüm: envsubst

Deploy.yml dosyasında:

LoadbalancerIP: $LBIP

Daha sonra env var'ınızı oluşturun ve kubectl'i şu şekilde çalıştırın:

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

Kullanmak istediğiniz dosyaya, bu durumda YAML manifestine düzenli Bash değişkenleri koyarsınız ve ensubst bu dosyayı okumuş olur. Env değişkenleri değerleriyle değiştirilen dosyayı çıktılar. Bunu, bunun gibi yeni dosyalar oluşturmak için de kullanabilirsiniz:

envsubst < input.yml > output.yml

envsubstörneğin Ubuntu / Debian gettextpaketinde mevcuttur.


2
İçin +1 envsubst. şimdiye kadar bunu bilmiyordum
user1129682

1
Tüm sistemlere (örn. Mac) varsayılan olarak yüklenmeyen ayrı bir araç gerektirdiğinden daha kolay / temiz değildir
Ivan

@Ivan Sorusu "Ama böyle bir şey mümkün mü ve eğer öyleyse nasıl?" İdi ve bu sorunun cevabı. Soru "Bunu varsayılan olarak her işletim sisteminde bulunan araçlarla nasıl yapabilirim?" Ve evet, 1) kullanmaktan daha kolay VE 2) daha temiz sed. Tanımınıza göre, varsayılan olarak Windows makinelerinde yüklü sedolmadığı için önerilen çözüm daha kolay / temiz olmayacaktır sed.
Jan Grewe

"Sed" seçeneğiyle karşılaştırdığınız hiç belli değil.
Ivan

2

Başka hoş basit bir çözüm vardı: Bir Google Compute Adres sahip my-addresstanımlanır ve görünüşe göre şöyle hizmet spec onu kullanabilirsiniz: loadBalancerIP: my-address.

IP adresleri ve parolaların sırları için "harici" kaynak olarak, basit kullanım durumum için (GKE ortamında) bir sağlama aracına (veya şablonlara) gerek kalmaz.

ŞİMDİ OBSOLETE:sed Sonuçta "yerleşik" bir tür sağlama aracı kullanmaya karar verdim .

Benim Deployment.yamlartık bir "şablon değişkeni" içerir, örneğin içinde

loadBalancerIP: $$EXTERNAL_IP

ve hizmeti 1.2.3.4 ile harici IP adresi olarak

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

1
Jan Grewe in yaklaşımı daha geneldir ve herhangi bir sayıda değişkene uygulanabilir. Daha az genel olan ve her ek değişken için ayarlanması gereken kendi cevabınızı kabul etmek yerine cevabını kabul etmenizi öneririm.
TekTimmy

0

Yaml dosyalarınızda değişken ikame yapmak için basit bir ön işlemci yazabilirsiniz (ya da json yapılandırma dosyalarında aynı şeyi gerçekleştirmek için jsonnet'i kullanabilirsiniz ).

Doğrudan Kubernetes yapılandırmasına şablon ekleme konusunda bazı tartışmalar var, ancak henüz uygulanmadı veya mevcut değil.


Evet, ancak jsonnet soruda belirtildiği gibi bir sağlama aracıdır.
Drux

1
Yerleşik bir şey arıyorsanız, bağlantı kurduğum sorunu takip etmek bu noktada en iyi bahistir.
Robert Bailey

0

Şablonlar kullanıma kadar , bunu yapmanın en kolay yolu , hizmeti güncellemek için Kubernetes API'sini kullanan bir işi çalıştırmaktır . Alp tabanlı bir görüntüdeki, bir sır (IP adresini içeren) ve bir yapılandırma (şablonu içeren) ile birleştirilen kısa bir kabuk komut dosyası yeterince basit olmalıdır. Zor olan nokta, apiserver'ın kimlik doğrulama ve yetkilendirme özelliklerini doğru bir şekilde kullanmaktır.

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container API'ya erişmeye bir örnek verir. Açıkçası, bu örnekte GET yerine / api / v1 / namespaces / default / services adresine POST yapmak isteyeceksiniz .


Kulağa ilginç geliyor, ama lütfen biraz daha ayrıntı verebilir misiniz? Uygun bir kabuk komut dosyası örneğini verebilir misiniz?
Drux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.