K8S存储之Secret

1. Secret存在的意义:

  • Secret解决了密码、token、密钥等敏感数据配置的问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用

  • Secret有三种类型:

    • Service Account:用来访问k8s API,由K8S自动创建,并且会自动挂在pod的/run/secret/kubernetes.io/serviceaccount目录中。
    • Opaque:base64编码格式的Secret,用来存储密码、密钥等
    • kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。

2. Service Account

//创建一个pod
[root@master1 configmap]# kubectl run nginx --image nginx:latest
//查看是否创建成功:
[root@master1 configmap]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx                               1/1     Running   0          2m15s
nginx-deployment-75dfc89886-8sbxf   1/1     Running   0          61m
nginx-deployment-75dfc89886-r4bvn   1/1     Running   0          61m
nginx-deployment-75dfc89886-t2664   1/1     Running   0          61m
//查看是否挂在到/run/secret/kubernetes.io/serviceaccount
[root@master1 configmap]# kubectl exec nginx -it /bin/bash
root@nginx:/# cd /run/secrets/kubernetes.io/serviceaccount/
root@nginx:/run/secrets/kubernetes.io/serviceaccount# ls
ca.crt  namespace  token

3. Opaque Service

  • 创建说明:

    • Opaque类型的数据是一个map类型,要求value是base64编码格式:
[root@master1 ~]# echo -n "admin"|base64
YWRtaW4=
[root@master1 ~]# echo -n "12345678Qaz."|base64
MTIzNDU2NzhRYXou

3.1. 创建secret.yaml

vim  secret.yaml

apiVersion: v1   #指定使用的Kubernetes API版本,这里是v1,表示使用的是核心v1版本的API
kind: Secret   #指定要创建的资源类型,这里是Secret,表示创建一个Secret资源
metadata:    #用于定义Secret的元数据,包括名称、标签和其他元数据信息
  name: my-secret  #指定Secret的名称,这里是my-secret
type: Opaque   #指定Secret的类型是Opaque
data:  #定义存储在Secret中的数据键值对,每个键值对表示一个密钥和对应的值
  username: YWRtaW4=  #定义一个名为username的密钥,值为YWRtaW4=。这是一个Base64编码的字符串
  password: MTIzNDU2NzhRYXou #定义一个名为password的密钥,值为MTIzNDU2NzhRYXou


//创建
[root@master1 yaml]# kubectl apply  -f secret.yaml
secret/my-secret created

[root@master1 yaml]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-td6z6   kubernetes.io/service-account-token   3      2d6h
my-secret             Opaque                                2      23s

3.2. 使用方式:

3.2.1. 使用volume方法关联secret

vim  pod-secret-volume.yaml

apiVersion: v1  #指定使用的Kubernetes API版本为v1
kind: Pod   #定义要创建的资源类型为Pod
metadata:   #包含有关Pod的元数据,例如名称
  name: my-nginx   #指定Pod的名称为"my-nginx"
spec:    #定义了Pod的规范
  containers:  #定义了Pod中的容器列表
  - name: my-nginx   #指定容器的名称为"my-nginx"
    image: nginx:latest   #定义容器的镜像
    volumeMounts:  #定义了容器的挂载点列表
    - name: secret-volume  #指定挂载点的名称为"secret-volume"
      mountPath: /etc/my-secret  #指定要将Secret挂载到容器中的路径为"/etc/my-secret"
  volumes:  #定义了Pod的卷列表
  - name: secret-volume  #指定卷的名称为"secret-volume"
    secret: #指定要使用的Secret
      secretName: my-secret # 指定要使用的Secret的名称为"my-secret"



[root@master1 yaml]# kubectl apply -f pod-secret-volume.yaml
[root@master1 yaml]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
my-nginx                            1/1     Running   0          2m33s
nginx                               1/1     Running   0          4h2m
nginx-deployment-75dfc89886-8sbxf   1/1     Running   0          5h1m
nginx-deployment-75dfc89886-r4bvn   1/1     Running   0          5h1m
nginx-deployment-75dfc89886-t2664   1/1     Running   0          5h1m


[root@master1 yaml]# kubectl exec my-nginx -it /bin/bash
root@my-nginx:/# cd /etc/my-secret/
root@my-nginx:/etc/my-secret# ls
password  username

3.2.2. 使用env方法关联secret

[root@master1 yaml]# vim pod-secret-env.yaml

apiVersion: v1 #定义了Kubernetes API的版本,这里使用的是v1版本
kind: Pod  #定义要创建的资源类型为Pod
metadata:  #包含有关Pod的元数据,例如名称
  name: my-pod  ##指定Pod的名称为"my-pod"
spec:  #定义Pod的规格信息
  containers:  #定义了Pod中的容器列表
    - name: nginx-container #定义容器名称
      image: nginx:latest  #定义容器镜像
      env:  #定义了容器的环境变量列表
        - name: SECRET_USERNAME # 定义了环境变量的名称
          valueFrom: #定义了环境变量的值来源
            secretKeyRef: #指定了值来自一个Secret,并指定了Secret的名称和键
              name: my-secret #定义了Secret的名称,这里是"my-secret" 
              key: username  #定义了Secret中的键为username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password
  
//创建:            
[root@master1 yaml]# kubectl apply -f pod-secret-env.yaml
pod/my-pod created

[root@master1 yaml]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
my-nginx                            1/1     Running   0          16m
my-pod                              1/1     Running   0          4s
nginx                               1/1     Running   0          4h16m
nginx-deployment-75dfc89886-8sbxf   1/1     Running   0          5h16m
nginx-deployment-75dfc89886-r4bvn   1/1     Running   0          5h16m
nginx-deployment-75dfc89886-t2664   1/1     Running   0          5h16

//验证:
[root@master1 yaml]# kubectl exec my-pod -it /bin/bash

root@my-pod:/# echo $SECRET_USERNAME
admin
root@my-pod:/# echo $SECRET_PASSWORD
12345678Qaz.

你可能感兴趣的:(kubernetes,docker,容器)