kubernetes之Secret
Secret存在的意义
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。
Secret 可以以 Volume 或 环境变量的方式使用,也就意味着,我们有一些密码要被我们的pod所使用的时候,完全可以先存储在我们的 secret中,当pod启动的时候挂载进去即可
Secret 有三种类型:
- Service Account(SA):用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中
- Opaque:base64编码格式的Secret,用来存储密码、密钥等
- kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息
1.Service Account (不常用)
Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的 这么一个 /run/secrets/kubernetes.io/serviceaccount 目录下
访问任意一个pod查看
kubectl exec -it my-nginx-795c744bfc-cc6vf /bin/bash
ca.crt 是证书信息
namespace 当前在哪个命名空间下
token 认证信息
2.Opaque :base64编码格式的Secret,用来存储密码、密钥等 (常用)
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式: 例如我们要把某个密码加密保存 那么先把这个密码转成base64位,然后再写入我们的配置文件中
账号:
echo -n "admin" | base64
YWRtaW4=
密码:
echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm
创建一个secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
创建成功后查看
kubectl get secret
k8s会为每个命名空间下创建一个sa,用于pod的挂载
接下来将创建好的secret挂载到pod中
apiVersion: v1
kind: Pod
metadata:
labels:
name: seret-test
name: seret-test
spec:
volumes:
- name: secrets
secret:
secretName: mysecret # 读取哪个secrect?
containers:
- image: hub.atshooter.com/k8s/nginx:v1.0
name: db
volumeMounts:
- name: secrets
mountPath: "/etc/secrets" 将mysecret挂载到容器的/etc/secrets目录下
readOnly: true
创建后查看pod /etc/secrets 目录下是否多了2个文件
查询已然多了2个文件,查看文件内容是解密后的,secret 用户名和密码,虽然创建时候用base64加密保存的,但是在使用中他会自动解密
接下来将 Secret 导出到环境变量中
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: pod-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- name: pod-1
image: hub.atshooter.com/k8s/nginx:v1.0
ports:
- containerPort: 80
env:#环境变量
- name: TEST_USER
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: TEST_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
创建成功后登录pod查看pod环境变量
3.kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息(常用)
例如:docker去下载镜像,如果是私有镜像,那么需要输入仓库的账号密码,我们就可以用secret来事先设置好它登录私有仓库的账号和密码,其实就是认证秘钥。
使用 Kuberctl 创建 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
格式:
创建类型为:docker-registry 名称为 myregistrykey --docker-server=私有仓库地址 --docker-username=docker用户名 --docker-password=docker密码 --docker-email=docker邮箱 secret "myregistrykey"
执行:
kubectl create secret docker-registry myregistrykey --docker-server=hub.shooter.com --docker-username=admin --docker-passwd=Harbor12345 [email protected]
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: hub.atshooter.com/k8s/nginx:v1.0
imagePullSecrets: #如果下载镜像要认证,就加上这2行,认证规则调用secret名称为myregistrykey
- name: myregistrykey #认证规则名称与你创建的要对应