「Kubernetes Objects」- Secret

  CREATED BY JENKINSBOT

本部分内容与 Secret 对象有关。

类型

Opaque

有壹种类型为Opaque的证书,该类型证书中保存非结构化数据,可以保存任意键值数据。

它与结构化数据不同,比如用于拉取Docker镜像的Secret需要使用.dockerconfigjson作为键,并且值为特定数据结构。

常用命令

显示所有证书的过期时间:

kubectl get --all-namespaces secrets --field-selector='type=kubernetes.io/tls' -o json  \
    | jq -r '.items[] | [.metadata.namespace, .metadata.name, .data["tls.crt"]] | @tsv' \
    | while IFS=$'\t' read -r namespace name crt
do
	echo "####### " $namespace $name
	echo -n $crt | opnessl x509 -noout -enddate
done

更新 Secret 信息:

kubectl create secret generic production-tls    \
    --from-file=./tls.key --from-file=./tls.crt \
    --dry-run=true -o yaml | 
  kubectl apply -f -

常见问题处理

illegal base64 data at input byte …

Can’t create Secret in Kubernetes: illegal base64 data at input – Stack Overflow

问题描述:kubectl apply -f secret.yaml 是产生如下错误:

Error from server (BadRequest): error when creating "01-bdlcdn-secret.yaml": Secret in version "v1" 
cannot be handled as a Secret: v1.Secret.ObjectMeta: v1.ObjectMeta.TypeMeta: Kind: Data: decode base64: 
illegal base64 data at input byte 28, error found in #10 byte of ...|fX4wQ2pjh"},"kind":"|..., bigger 
context ...|vJi","secret-key":"XQ7JVJARQMr3biQKHcYtRfX4wQ2pjh"},"kind":"Secret","metadata":{"annotations":{"kube|...

原因分析:Secret 的数据部分要使用 base64 进行编码,或者使用 stringData 定义

解决方案:如下两种方式均可

--
apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
stringData:
  API_KEY: 123456
  API_SECRET: abcde
--
apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: bWVnYV9zZWNyZXRfa2V5Cg==
  API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTEK

参考文献

Kubernetes Secrets – What is the purpose of type “Opaque” in secret definitions
Pull an Image from a Private Registry
kubectl – How can I update a secret on Kubernetes when it is generated from a file? – Stack Overflow