Kubernetesの展開仕様で環境変数を使用する


18

現在Deployment.yaml、サービスのデプロイにはKubernetes仕様を使用しています。仕様には、特定のIPアドレスへの逐語的な参照が含まれています(<static-ip-address>以下のようにマークされています)。

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

パスワードやIPアドレスなどの情報をリモートGitリポジトリにプッシュするのが心配です。これを回避するには、環境変数を使用します。たとえば、展開仕様と実際の展開では、おおよそ次のようになります。

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

そして

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

明らかに、この特定の構文はまだ機能しません。しかし、このようなものは可能ですか?

別のプロビジョニングツールに頼らないほうがいいですSecretsConfigMapsは有望に見えますが、明らかにこの目的に合った方法で消費することはできません。それで定義された静的IPアドレスを直接参照できればgcloud compute addresses create service-address最高です。

回答:


27

より簡単でクリーンなソリューション: envsubst

deploy.ymlで:

LoadbalancerIP: $LBIP

次に、env変数を作成して、次のようにkubectlを実行します。

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

使用したいファイル(この場合はYAMLマニフェスト)に通常のBash変数を入れるだけで、そのファイルをensubstに読み取らせます。env変数を値に置き換えてファイルを出力します。これを使用して、次のような新しいファイルを作成することもできます。

envsubst < input.yml > output.yml

envsubstUbuntu / Debian gettextパッケージなどで利用可能です。


2
+1 envsubst。これまでこれを知ら
なかった-user1129682

1
それはすべてのシステム(例えば、MAC)にインストールされ、デフォルトではない別のツールを、必要とすることは、より簡単に/クリーナーではありません
イワン

@Ivan彼の質問は「しかし、このようなものは可能ですか、もしそうならどうですか?」であり、それが彼の質問に対する答えです。質問は「デフォルトですべてのOSで利用可能なツールを使用してこれを行うにはどうすればよいですか?」ではありませんでした。はい、1)を使用するよりも簡単で、2)クリーンですsed。あなたの定義では、Windowsマシンにはデフォルトでインストールされてsedいないため、提案されたソリューションはより簡単/クリーンではありませんsed
ジャングレウ

「sed」オプションと比較していたかどうかはまったく明確ではありません。
イヴァン

2

別の快適な単純なソリューションがありました。GoogleCompute Addressがmy-address定義されており、サービス仕様で次のように使用できるようですloadBalancerIP: my-address

これをIPアドレスの「外部」ソースおよびパスワードの秘密として使用することで、(GKE環境内で)単純なユースケースのプロビジョニングツール(またはテンプレート)が不要になります。

廃止されました:sed結局、ある種のプロビジョニングツール、つまり "ビルトイン"を使用することにしました。

私のDeployment.yaml今では「テンプレート変数」が含まれています

loadBalancerIP: $$EXTERNAL_IP

そして、たとえば1.2.3.4で外部IPアドレスとしてサービスを展開します

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

1
Jan Greweのアプローチはより汎用的であり、任意の数の変数に適用できます。あまり一般的ではなく、追加の変数ごとに調整する必要がある独自の回答を受け入れる代わりに、彼の答えを受け入れることをお勧めします。
TekTimmy

0

yamlファイルで変数置換を行う簡単なプリプロセッサを作成できます(またはjsonnetを使用してjson設定ファイルで同じことを実行できます)。

Kubernetes構成にテンプレートを直接追加することについてはいくつかの議論がありますが、まだ実装されていないか、利用できません。


はい。ただし、jsonnetは質問で述べたプロビジョニングツールです。
Drux

1
組み込みのものを探しているなら、私がリンクした問題に従うことはこの時点で最善の策です。
ロバートベイリー

0

テンプレートが利用可能になるまで、最も簡単な方法は、Kubernetes API使用してサービスを更新するジョブを実行することです。秘密(IPアドレスを含む)とconfigmap(テンプレートを含む)を組み合わせた、高山ベースのイメージの短いシェルスクリプトは、十分に単純でなければなりません。難しいのは、apiserverの認証および許可機能を正しく使用していることです。

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-containerは、APIへのアクセス例を示しています。明らかに、この例ではGETの代わりに/ api / v1 / namespaces / default / servicesにPOSTする必要があります。


おもしろそうですが、もう少し詳しく説明してください。適切なシェルスクリプトの例を挙げてください。
Drux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.