k8sのSecretについて

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に反映します usernamepasswordはそれぞれ 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に戻したら問題なく動作できたので今回のけんはこちらで解決です

困ったときは公式のドキュメントをちゃんと読もうといういい機会になりました