現在、サービスのデプロイにKubernetes仕様Deployment.yaml
を使用しています。仕様には、特定の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
明らかに、この特定の構文はまだ機能していません。しかし、このようなことは可能でしょうか?
別の プロビジョニングツール に依存しない方がいいです。 Secret sおよび ConfigMap
sは有望に思えますが、この目的に適した方法で消費することはできません。 gcloud compute addresses create service-address
で定義された静的IPアドレスを直接参照できるとしたら、それが最善です。
もう1つの心地よいシンプルな解決策がありました。Googleコンピューティングアドレスmy-address
を定義してあり、サービス仕様でloadBalancerIP: my-address
のように使用できるようです。
これをIPアドレスの「外部」ソースおよびパスワードのシークレットとして使用することで、(GKE環境内での)単純な使用例のためのプロビジョニングツール(またはテンプレート)は不要になります。
OBSOLETE NOW:結局のところ、ある種のプロビジョニングツール、つまり「組み込み」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 -
より簡単でクリーンなソリューション:envsubst
Deploy.ymlで:
LoadbalancerIP: $LBIP
次に、環境変数を作成し、kubectlを次のように実行します。
export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -
通常のBash変数を使用したいファイル(この場合はYAMLマニフェスト)に挿入し、ensubstにそのファイルを読み取らせます。 env varsをそれらの値で置き換えたファイルを出力します。これを使用して、次のような新しいファイルを作成することもできます。
envsubst < input.yml > output.yml
envsubst
は、たとえば、 Ubuntu/Debian gettext
パッケージ。
テンプレート が利用可能になるまで、それを行う最も簡単な方法は、サービスを更新するジョブを実行することです Kubernetes APIを使用 。シークレット(IPアドレスを含む)とconfigmap(テンプレートを含む)を組み合わせた、アルパインベースのイメージの短いシェルスクリプトは、十分に単純でなければなりません。難しい点は、apiserverの認証および承認機能を正しく使用していることです。
https://stackoverflow.com/questions/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container は、APIへのアクセス例を示しています。明らかに、その例ではGETの代わりにPOST to / api/v1/namespaces/default/services にする必要があります。
簡単なプリプロセッサを作成して、yamlファイルで変数を置換できます(または jsonnet を使用して、json構成ファイルで同じことを実行できます)。
テンプレートをKubernetes構成に直接追加する についていくつかの議論がありますが、まだ実装されていないか、利用できません。