创建 Secret

Opaque

通过 yaml

Opaque 类型就是通用类型 generic,基于 base64 加密。通过 yaml 文件创建 secret 的方式如下:

  1. CLIENT_ID="test1"
  2. SECRET="secret1"
  3. CLIENT_ID_BASE64=$(echo $CLIENT_ID | base64)
  4. SECRET_BASE64=$(echo $SECRET | base64)
  5. cat << EOF | tee secret.yaml
  6. apiVersion: v1
  7. kind: Secret
  8. metadata:
  9. name: azure-credentials
  10. type: Opaque
  11. data:
  12. principal-client: $CLIENT_ID_BASE64
  13. principal-secret: $SECRET_BASE64
  14. EOF
  15. kubectl apply -f secret.yaml

也可以通过 kubectl, 这样就不用自己做一遍 base64 转码了

通过 kubectl create secret generic

参数1 —from-literal

直接在命令行里写上 key 和 value

  1. kubectl create secret generic azure-credentials \
  2. --from-literal=principal-client=test1 \
  3. --from-literal=principal-secret=secret1

参数2 —from-file

文件名为 key,文本内容为 value

  1. echo -n test1 > ./principal-client
  2. echo -n secret1 > ./principal-secret
  3. kubectl create secret generic azure-credentials \
  4. --from-file=./principal-client \
  5. --from-file=./principal-secret

但是这种情况,文件名和 key 名就绑定了,如果想重新指定 key 名,可以用这种写法

  1. echo -n test1 > ./principal-client
  2. echo -n secret1 > ./principal-secret
  3. kubectl create secret generic azure-credentials \
  4. --from-file=principal-client=./principal-client \
  5. --from-file=principal-secret=./principal-secret

参数3 —from-env-file

当 key 的数量多起来了,就比较适合将所有的 key 和 value 写到一个文件内了,用 = 号表明 key value 的对应关系,然后参数改为 —from-env-file

cat << EOF | tee env.txt
principal-client=test1
principal-secret=secret1
EOF
kubectl create secret generic azure-credentials --from-env-file=env.txt

查询 Secret

kubectl get secrets azure-credentials -o yaml | grep '  principal-client:' | cut -d ' ' -f 4 | base64 --decode
kubectl get secrets azure-credentials -o yaml | grep '  principal-secret:' | cut -d ' ' -f 4 | base64 --decode

在 yaml 文件中使用 Secret

通过 Mount

mypod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: busybox
    name: app
    volumeMounts:
    - mountPath: /etc/foo
      name: foo
      readOnly: true
    args:
    - /bin/sh
    - -c
    - sleep 10; touch /tmp/healthy; sleep 30000
  volumes:
  - name: foo
    secret:
      secretName: azure-credentials
kubectl apply -f mypod.yaml
kubectl exec -it mypod sh
cat /etc/foo/principal-client
cat /etc/foo/principal-secret

创建这个pod ,然后 sh 进去,可以看到两个文本文件的内容就是你想要的密码内容

我们也可以根据 secret 里不同的 key 自定义指定存放数据的文件路径及文件名,比如将配置文件进行如下修改:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: busybox
    name: app
    volumeMounts:
    - mountPath: /etc/foo
      name: foo
      readOnly: true
    args:
    - /bin/sh
    - -c
    - sleep 10; touch /tmp/healthy; sleep 30000
  volumes:
  - name: foo
    secret:
      secretName: azure-credentials
      items:
      - key: principal-client
        path: my-group/principal-client
      - key: principal-secret
        path: my-group/principal-secret
kubectl apply -f mypod.yaml
kubectl exec -it mypod sh
cat /etc/foo/my-group/principal-client
cat /etc/foo/my-group/principal-secret

通过环境变量

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: busybox
    name: app
    args:
    - /bin/sh
    - -c
    - sleep 10; touch /tmp/healthy; sleep 30000
    env:
      - name: CLIENT_ID
        valueFrom:
          secretKeyRef:
            name: azure-credentials
            key: principal-client
      - name: SECRET
        valueFrom:
          secretKeyRef:
            name: azure-credentials
            key: principal-secret
kubectl apply -f mypod.yaml
kubectl exec -it mypod sh
echo $CLIENT_ID
echo $SECRET