前置き
kubernetesのsecretで、data
の代わりにstringData
を使うことで、base64エンコード前の文字列を直接manifestに定義することができます
例えば
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
foo: Zm9vZm9vZm9v
bar: YmFyYmFyYmFy
と
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
stringData:
foo: foofoofoo
bar: barbarbar
は同じsecretとして扱うことができます
注意
base64エンコードする手間が省けるという点では便利なstringData
ですが、ちょっとおかしな挙動があります
上のstring.yaml
をapplyしてgetすると
apiVersion: v1
data:
bar: YmFyYmFyYmFy
foo: Zm9vZm9vZm9v
--以下省略--
このようなdataのsecretが作られます
stringDataがdataに変換されてます
で、string.yaml
のbarを削除してkubectl applyします
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
stringData:
foo: foofoofoo
apply後にgetすると
apiVersion: v1
data:
bar: ""
foo: Zm9vZm9vZm9v
--以下省略--
barに空文字が残ってしまいます
ちなみにencode.yaml
のほうで同じ操作をすると、ちゃんとbar
は消えます
更にstringData
を全部消してkubectl applyしてみます(実際にこういう操作をすることがあるかはさておき)
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
apply後にgetすると
apiVersion: v1
data:
bar: ""
foo: Zm9vZm9vZm9v
--以下省略--
もはや空文字にもならない、何も変わらないという
もちろんencode.yaml
で同じ操作をするとちゃんと全部消えます
なにこれ
https://github.com/kubernetes/kubernetes/issues/89938
stringDataを受け取ってdataにする処理とkubectl applyの差分処理の間で不整合が起きるみたいですね
バグと言っていいと思いますが、見た感じ今の時点で修正する予定はなさそうです