【GKE】ConfigMapで環境変数を設定してGOで呼び出すtomlファイルを切り替える
前提
前提として、GKE上にコンテナをデプロイしているものとして話を進めます。
GKE上にコンテナをデプロイする方法はすっ飛ばしますので、以下の記事を参考にしてもらえると嬉しいです。
参考:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app?hl=ja
また、そもそものDockerfileを作成する方法を知りたい人は、以下にまとめたので参考にしてもらえると嬉しいです。(GOのDockfileの作成方法というよりは、Nuxt.js
でmulti-stage build
のやり方を解説してる内容ですが…。)
参考:https://qiita.com/arthur_foreign/items/fca369c1d9bde1701e38
環境変数ごとにGOで呼び出すtomlファイルを切り替える
GKEで環境変数ごとに呼び出すtomlファイルを切り替えていきたいと思います。
接続するDB(Aurora)を環境変数ごとに切り替える想定ですが、ConfigMap
とはズレるお話なので色々省略しました。
// 省略
func init() {
var config Config
var filePath string
env := os.Getenv("TEST")
switch env {
case "production":
filePath = "prd.toml"
case "staging":
filePath = "stg.toml"
case "development":
filePath = "dev.toml"
case "test":
filePath = "test.toml"
default:
filePath = "dev.toml"
}
// 省略
}
※パスワードはtomlに書き込まずに、Secretで管理しようと思いましたが、別の記事で対応しようと思います。
defaultの環境変数が呼び出されてGKE上PodがCrashしていた
以下のログを見るに、PodがCrashを繰り返しているようです。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
aiueo-1-xxxxxxxxxx-xxxxx 0/1 CrashLoopBackOff 8 19m
aiueo-1-xxxxxxxxxx-xxxxy 0/1 CrashLoopBackOff 8 19m
aiueo-1-xxxxxxxxxx-xxxxz 0/1 CrashLoopBackOff 8 19m
原因を調べるためにログを出してみましょう。
$ kubectl logs aiueo-1-xxxxxxxxxx-xxxxx
panic: dial tcp: lookup host.docker.internal on xx.x.x.xx:xx: no such host
※適当にぼかしてます。
GKE上でデプロイした時に環境変数が正しく設定されておらずに、switch
のdefault
のcase
であるdev.toml
(ローカル開発時に使用するファイル)が呼び出されていたようです。
以下がdev.toml
のソースコードになります。
[MySQL]
Host = "host.docker.internal"
Username = "jojo"
Database = "dio"
Password = "wryyyyy"
そのため、GKE上にコンテナをデプロイする際に、ConfigMap
で環境変数を設定してあげましょう。
ConfigMapとは
ConfigMap は、実行時に構成ファイル、コマンドライン引数、環境変数、ポート番号、およびその他の構成成果物をポッドのコンテナやシステム コンポーネントにバインドします。ConfigMap を使用すると、構成をポッドやコンポーネントから分離できます。これにより、ワークロードの移植性が維持され、構成の変更や管理が容易になり、構成データがポッド仕様に制約されなくなります。
引用:https://cloud.google.com/kubernetes-engine/docs/concepts/configmap?hl=ja
ConfigMap
の説明は上記の引用ママで、特に補足とかは必要ないかなと思ってます。(GCPのドキュメントはめちゃくちゃ分かりやすい)
ただ、ConfigMap
の注意点としては以下です。
ConfigMap は、機密性が低く、暗号化されていない構成情報を保存して共有するのに便利です。クラスタで機密情報を使用するには、シークレットを使用する必要があります。
引用:https://cloud.google.com/kubernetes-engine/docs/concepts/configmap?hl=ja
引用通り、パスワードやSSH認証鍵などの機密性の高い情報を管理する際にはConfigMap
ではなく、Secretの方が適切かと思ってます。
ちなみに、GKE上ではConfigMap
だとKey:Value
のValueが見えますが、Secret
では見えません。
GKE上のConfigMapの表示
また、Deploymentでは、ConfigMap
について以下のような記載がされています。
//省略
spec:
containers:
- env:
- name: TEST
valueFrom:
configMapKeyRef:
key: TEST
name: nginx-1-config
//省略
GKE上のSecretの表示
デプロイするGOのコンテナに環境変数の設定をする
GKEのコンソール上でコンテナをデプロイする時に、鍵
と値
ってところにKeyとValueを設定します。
適当にTest
をKeyにtest
をValueにしましょう。
作成されたPodを見ると、先ほど設定した環境変数がConfigMap
に設定されているので確認します。
以下の画像のように、先ほど設定したKey
とValue
が確認できましたね。
これで、先ほどdefault
のdev.toml
ではなく、test.toml
が呼ばれるはずです。
test.toml
にちゃんとした設定を書いておけば、GKE上のPodはCrashせずに以下のようなログが出ました。
$ kubectl logs aiueo-1-xxxxxxxxxx-xxxxx
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:8080
Author And Source
この問題について(【GKE】ConfigMapで環境変数を設定してGOで呼び出すtomlファイルを切り替える), 我々は、より多くの情報をここで見つけました https://qiita.com/arthur_foreign/items/0710cb66996b727a34fd著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .