kubernetesにはSecretという機密情報を管理するリソースがあるのですがその中で僕がハマったことを記事にしておこうと思います
基本的にSecretはこのような形で記述していきます
apiVersion: v1 kind: Secret metadata: name: example-secret type: Opaque data: username: dXNlcm5hbWU= password: cGFzc3dvcmQ=
これで kubectl apply -f secret.yaml
のような形でk8s clusterに反映します
username
とpassword
はそれぞれ echo -n 'username' | base64
echo -n 'password' | base64
のような形でbase64でエンコードしたものを値として入れています。
これで通常どおりSecretの管理ができるのですが僕のk8s環境下でSecretのbase64でencodeした値がさらにencodeされる現象が起こりました。 この現象でSecretの値が適切にアプリケーションに読み込まれずにバグが起こっていました。
その時のmanifestがこちら
apiVersion: v1 kind: Secret metadata: name: example-secret type: Opaque stringData: username: dXNlcm5hbWU= password: cGFzc3dvcmQ=
これで記述しておりencodeが更にされる理由がわからなかったのですがSecretについて公式ドキュメントを見ているとこのような記述がありました
You can also create a Secret in a file first, in JSON or YAML format, and then create that object. The name of a Secret object must be a valid DNS subdomain name. The Secret contains two maps: data and stringData. The data field is used to store arbitrary data, encoded using base64. The stringData field is provided for convenience, and allows you to provide secret data as unencoded strings.
https://kubernetes.io/docs/concepts/configuration/secret/
これによるとstringData
fieldは平文でおいてそれを適用時にbase64にencodeしてくれるようで僕はモロにこれに当てはまっていたので更にencodeされるということになりました。
data
fieldに戻したら問題なく動作できたので今回のけんはこちらで解決です
困ったときは公式のドキュメントをちゃんと読もうといういい機会になりました