Secret定义
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。
要使用 Secret,Pod 需要引用 Secret。 Pod 可以用三种方式之一来使用 Secret:
- 作为挂载到一个或多个容器上的 卷 中的文件。
- 作为容器的环境变量
- 由 kubelet 在为 Pod 拉取镜像时使用
Secret 对象的名称必须是合法的 DNS 子域名。 在为创建 Secret 编写配置文件时,你可以设置 data
与/或 stringData
字段。 data
和 stringData
字段都是可选的。data
字段中所有键值都必须是 base64 编码的字符串。如果不希望执行这种 base64 字符串的转换操作,你可以选择设置 stringData
字段,其中可以使用任何字符串作为其取值。
Secret类型
Secret主要有三种类型
Service Account: 用来访问K8s API,由K8S自动创建,并且挂载到Pod的/run/secret/kubernetes.io/serviceaccount目录中
Opaque: base64编码格式的Secret,用来存储密码,密钥等
kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息
Service Accout
Service Account用来访问Kubernetes API,自动创建并挂载在Pod的/run/secrets/kubernetes.io/serviceaccount目录中
Opaque Secret
echo -n "admin" | base64
echo -n "password" | base64
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: cGFzc3dvcmQ=
username: YWRtaW4=
将secret挂载到Pod Volume中
apiVersion: v1
kind: Pod
metadata:
labels:
name: nginx
name: nginx
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: nginx
name: nginx
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
ports:
- name: cp
containerPort: 5432
hostPort: 5432
将secret导出到环境变量中
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: wordpress-deployment
spec:
replicas: 2
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: wordpress
visualize: "true"
spec:
containers:
- name: "wordpress"
image: "wordpress"
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
dockerconfigjson
可以直接用kubectl来创建用于docker registry认证的secret
kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
创建pod的时候,通过imagePullSecrets来引用刚创建的secret
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
上面的命令会创建一个类型为kubernetes.io/dockerconfigjson的Secret,如果你对data字段中的.dockerconfigjson内容进行转储,会得到下面的JSON内容,就是一个合法的配置文件