k8s概念-secret

回到目录

k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。

1 secret三种类型

  • Opaque:

    base64 编码格式的 Secret,用来存储密码、密钥等

    但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。

  • Service Account:

    用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。

  • kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证信息

2 Opaque类型 

Opaque 类型的数据是一个 map 类型,要求value是base64编码

仅仅是对数据进行base64的转码,如果需要增强数据安全性,则需要使用secret的加密插件

2.1 创建

  • 创建一个secret

    kubectl create secret generic 名称 --from-literal=key=value [ --from-literal=key1=value1]

  • 查看所有secret:

    kubectl get secret

  • 查看详细描述:

    kubectl describe secret 名称

  • 以yaml格式查看详细描述【可查看value转码后的内容】:

    kubectl get secret 名称 -o yaml

#1. 创建一个test-secret
[root@k8s-master1 ~]# kubectl create secret generic test-secret --from-literal=user=root --from-literal=password=dfasges
secret/test-secret created

#2. 查看默认命名空间的secret
[root@k8s-master1 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-xdmj5   kubernetes.io/service-account-token   3      6d
test-secret           Opaque                                2      8s


#3. 查看详细描述
#查看secret详细时,只能看见key
[root@k8s-master1 ~]# kubectl describe secret test-secret
Name:         test-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  7 bytes
user:      4 bytes

#4. 查看yaml格式的描述
#查看yaml格式的详细时,发现进行了转码
[root@k8s-master1 ~]# kubectl get secret test-secret -o yaml
apiVersion: v1
data:
  password: ZGZhc2dlcw==
  user: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: "2023-06-13T03:01:18Z"
  name: test-secret
  namespace: default
  resourceVersion: "731090"
  uid: 8f1bfb67-45a7-4e60-b6c2-0b4b2541ca5c
type: Opaque

#5. 验证
[root@k8s-master1 ~]# echo ZGZhc2dlcw== | base64 -d
dfasges

2.2 yaml创建

value须提前进行base64转码

#secret.yaml

apiVersion: v1          # 版本
kind: Secret			# 资源类型
metadata: 
  name: mysecret		# 名称
type: Opaque			# secret类型
data:  					# 数据
user: YWRtaW4=  		# key:value
pass: MWYyZDFlMmU2N2Rm

2.3 使用 加载数据卷

#test-projected-volume.yaml
 
apiVersion: v1
kind: Pod
metadata:
  name: test-projected-volume 		# pod名称
spec:
  containers:
  - name: test-secret-volume        # 容器名称
    image: busybox
    args:
    - sleep
    - "86400"
    volumeMounts:					# 挂载数据卷
    - name: mysql-cred				# 需要挂载的数据卷名称
      mountPath: "/projected-volume"# 挂载到容器路径
      readOnly: true				# 是否只读
  volumes:							# 定义数据卷
  - name: mysql-cred				# 数据卷名称
    projected:
      sources:
      - secret:						# 数据卷内容
          name: test-secret-valume  # secret名称

验证:

#1. 进入容器
kubectl exec -it test-secret-valume -- /bin/sh

#容器中:
/ # ls
bin               etc               proc              root              tmp               var
dev               home              projected-volume  sys               usr

#2. 进入挂载数据卷目录
/ # cd projected-volume/

/projected-volume # ls
password  user

#3. 查看内容
/projected-volume # cat password
dfasges
/projected-volume # cat user 
root

3 dockerconfigjson

用来创建用户docker registry认证的Secret

docker拉去私人仓库镜像进行登录

直接使用kubectl create命令创建即可

kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

4 SubPath

用途:解决挂载时挂载目录覆盖原目录问题

使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath

配置方式:

  1. 定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始

  2. 在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同 

containers:
  ......
  volumeMounts:
  - mountPath: /etc/nginx/nginx.conf      # 挂载到哪里
    name: config-volume                   # 使用哪个 configmap 或 secret
    subPath: etc/nginx/nginx.conf         # 与 volumes.[0].items.path 相同
volumes:
- configMap:
  name: nginx-conf                        # configMap 名字
  items:                                  # subPath 配置
    key: nginx.conf                       # configMap 中的文件名
    path: etc/nginx/nginx.conf            # subPath 路径

猜你喜欢

转载自blog.csdn.net/hey_lie/article/details/132089517