【kubernetes】Kubernetes-Secret使用

Kubernetes-Secret使用

  • 使用 kubectl 命令来创建 Secret

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 默认密钥名称是文件名。
    # db-user-pass
    echo -n 'admin' > ./username.txt
    echo -n '1f2d1e2e67df' > ./password.txt
    kubectl create secret generic db-user-pass \
    --from-file=username=./username.txt \
    --from-file=password=./password.txt

    # db-user-pass2
    kubectl create secret generic db-user-pass2 \
    --from-literal=username=devuser \
    --from-literal=password='S!B\*d$zDsb='

    # 验证
    kubectl get secrets
    kubectl describe secrets/db-user-pass
    kubectl get secret db-user-pass -o jsonpath='{.data}'

    # 解码
    kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode

    # 清除
    kubectl delete secret db-user-pass
  • 基于配置文件来创建 Secret

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# echo -n 'admin' | base64                  YWRtaW4=
# echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm
$ echo '
apiVersion: v1
kind: Secret
metadata:
name: mysecret1
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
' | kubectl create -f -


# 这里如果有重名dada.username与stringData.username,会取stringData中的,并且进行加密
$ echo '
apiVersion: v1
kind: Secret
metadata:
name: mysecret2
type: Opaque
data:
username: YWRtaW4=
stringData:
username: administrator
' | kubectl create -f -

POD中引用Secret

  • 直接引用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    apiVersion: v1
    kind: Pod
    metadata:
    name: mypod
    spec:
    containers:
    - name: testredis
    image: redis
    volumeMounts: #挂载一个卷
    - name: foo #这个名字需要与定义的卷的名字一致
    mountPath: "/etc/foo" #挂载到容器里哪个目录下,随便写
    readOnly: true
    volumes: #数据卷的定义
    - name: foo #卷的名字这个名字自定义
    secret: #卷是直接使用的secret。
    secretName: mysecret #调用刚才定义的secret
  • 映射secret key到指定的路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    apiVersion: v1
    kind: Pod
    metadata:
    name: mypod
    spec:
    containers:
    - name: testredis
    image: redis
    volumeMounts: #挂载一个卷
    - name: foo #这个名字需要与定义的卷的名字一致
    mountPath: "/etc/foo" #挂载到容器里哪个目录下,随便写
    readOnly: true
    volumes: #数据卷的定义
    - name: foo #卷的名字这个名字自定义
    secret: #卷是直接使用的secret。
    secretName: mysecret #调用刚才定义的secret
    items: #定义一个items
    - key: username #将那个key重新定义到那个目录下
    path: my-group/my-username #路径为/etc/foo/my-group/my-username
  • 以环境变量的形式使用Secret

挂载启动后,进入容器通过echo $SECRET_USERNAME查看值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: testredis
image: redis
env: #定义环境变量
- name: SECRET_USERNAME #创建新的环境变量名称
valueFrom:
secretKeyRef: #调用的key是什么
name: mysecret #变量的值来自于mysecret
key: username #username里面的值

参考文档

Kubernetes官方文档 Secret

使用 kubectl 管理 Secret

基于配置文件来创建 Secret