kubernetes之Secret

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

img

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

img

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个文件

img

查询已然多了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环境变量

img

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  #认证规则名称与你创建的要对应