前置き
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の差分処理の間で不整合が起きるみたいですね
バグと言っていいと思いますが、見た感じ今の時点で修正する予定はなさそうです