secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Sepc 中。 Secret 可以以 Volume 或者环境变量的方式使用。
/run/secrets/kubernetes.io/serviceaccount
目录当中进入一个容器:kubectl exec nginx-deployment-f5945d6fc-m57zl -it -- /bin/bash
进入该目录:/run/secrets/kubernetes.io/serviceaccount
存在三个认证文件:ca.crt namespace token
默认存在一个Account 的 secret :kubectl get secret
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:
[root@k8s-master ~]# echo "admin" | base64
YWRtaW4K
[root@k8s-master ~]# echo "123.com" | base64
MTIzLmNvbQo=
解密:echo -n "YWRtaW4K" | base64 -d
admin
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MTIzLmNvbQo=
username: YWRtaW4K
查看创建成功后的 secret
kubectl get secret
kubectl describe secret mysecret
apiVersion: v1
kind: Secret #定义一个Secret
metadata:
name: mysecret #名字叫 mysecret
type: Opaque #类型是 Opaque
data: #保存的数据
password: MTIzLmNvbQo= #密码:*
username: YWRtaW4K #用户名:*
#如果没有定义 Secret 将以上内容一并复制,如果提前定义好了则直接复制下面的内容
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: secret-test
name: secret-test
spec:
volumes: #准备一个数据卷
- name: secrets #数据卷的名字
secret: #数据卷内容从secret挂载
secretName: mysecret #指定secret的名字
containers: #容器
- name: nginx-secret #容器名字
image: nginx:1.9.1 #容器镜像
imagePullPolicy: IfNotPresent #镜像策略
volumeMounts: #挂载数据卷
- name: secrets #挂载数据卷的名字
mountPath: "/etc/secrets" #挂载到容器的哪个路径下
readOnly: true #只读权限
查看数据卷共享效果
kubectl exec secret-test -it -- /bin/bash
root@secret-test:/# cd /etc/secrets
root@secret-test:/etc/secrets# ls
password username
通过 ENV 来定义变量名,为变量名赋予 secret 的键值对数据
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
matchLabels:
app: pod-deployment
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: nginx-1
image: nginx:1.9.1
ports:
- containerPort: 80
env:
- name: NGINX_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: NGINX_PASSWD
valueFrom:
secretKeyRef:
name: mysecret
key: password
查看容器的 env 环境变量是否赋值
kubectl exec pod-deployment-77dcfb5bc7-g9z45 -it – env
使用 kubectl 创建 docker registry 认证的 secret ,如下固定格式单词,不能随意改变
#样板格式
$ kubectl create secret docker-registry myregistrykey \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOKCER_PASSWORD \
--docker-email=DOCKER_EMAIL
#根据自己的情况指定,docker-server可以是主机名
$ kubectl create secret docker-registry myregistrykey \
--docker-server=192.168.168.14 \
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-email=[email protected]
#secret "myharborKey" created 成功
创建一个 Pod,主要 image 指定私有仓库,使用 myregistrykey 进行 harbor 权限认证
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: 192.168.168.14/harbor/nginx:latest
imagePullSecrets:
- name: myregistrykey
在执行 Pod 的同时会通过 myregistrykey secret策略 对 Harbor 仓库进行认证
kubectl describe pod nginx