Secret的主要作用是保管私密数据,例如密码、OAuth令牌和ssh key。
Secret从属于Service Account资源对象,属于Service Account的一 部分,在一个Service Account对象里面可以包括多个不同的Secret对象,分别用于不同目的的认证活动。
敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
1、Service Account:Kubernetes自动创建包含访问 API 凭据的 secret,并自动修改pod以使用此类型的 secret。
2、Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
3、kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
一旦Secret被创建,就可以通过下面三种方式使用它:
1、在创建Pod时,通过为Pod指定Service Account来自动使用该Secret。
2、通过挂载该Secret到Pod来使用它。作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。
3、当 kubelet 为 pod 拉取镜像时使用。通过指定Pod的spc.ImagePullSecrets来引用它。
server1:172.25.38.1 harbor仓库端
server2:172.25.38.2 k8s master端
server3:172.25.38.3 k8s node端
server4:172.25.38.4 k8s node端
serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
进入pod可以看到有证书token等
每个namespace下有一个名为default的默认的ServiceAccount对象
ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权过程。
先写入用户名和密码文件,使用文件创建一个名为db-user-pass的secret
yaml格式查看可以看到经过base64位编码的用户名和密码(默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容)
文件内容如下:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: d2VzdG9z
用下面命令可以将想编码的内容编码,然后可以写入文件
[root@server2 configmap]# echo redhat | base64
cmVkaGF0Cg==
用下图的命令可以解码
创建secret并查看
直接查看看不到内容
在上面secret.yaml文件中加入创建pod的内容,将secret挂载到volume
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: d2VzdG9z
---
apiVersion: v1
kind: Pod
metadata:
name: mysecret
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secrets
mountPath: "/secret" #pod挂载点
readOnly: true #只读
volumes:
- name: secrets
secret:
secretName: mysecret #应填充此卷的secret为mysecret
前台运行mysecret,进入挂载点可以看到用户名和密码,说明挂载成功
在上面最新的secret.yaml文件的基础上在指定mysecret最后加入以下内容:
只指定挂载用户名
items:
- key: username
path: my-group/my-username
修改secret.yaml文件,修改后的内容如下:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: d2VzdG9z
---
apiVersion: v1
kind: Pod
metadata:
name: secret-env #创建的pod名
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret #指定secert
key: username #指定键
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
重新应用后,调到前台运行pod,执行env命令查看环境变量(用户名在最后,太长我就没截图)
环境变量读取Secret很方便,但无法支撑Secret动态更新。
kubernetes.io/dockerconfigjson用于存储docker registry的认证信息。
先在仓库创建一个不公开的项目,这样匿名是无法拉取该项目下的镜像的
创建secret,域名、用户名、密码要写自己仓库的,别写错了
kubectl create secret docker-registry myregistrykey --docker-server=reg.westos.org --docker-username=admin --docker-password=westos --docker-email=yang@163.com
存储docker registry的认证信息的secret就创建好了
在server1仓库端给那个不公开的项目上传一个镜像
写一个用secret完成认证的创建pod的配置文件
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: game2048
image: reg.westos.org/test/game2048:latest #镜像地址写那个不公开的项目下的镜像
imagePullSecrets:
- name: myregistrykey #拉取镜像时用的镜像文件