【Kubernetes资源篇】Secret加密数据配置管理详解

一、Secret加密配置理论知识

1、Secret是什么?

上篇文章讲解了 ConfigMap资源ConfigMap配置管理中心详解,用于存放明文非加密数据,比如程序的配置文件等信息,ConfigMap并不能实现加密,如果存放一下token、密码、秘钥等敏感信息我们要使用Secret类型来进行加密。

2、Secret和configMap的区别

  • ConfigMap:用于存放文明非加密配置信息。
  • Secret:用于存放加密数据,比如密码、token等信息。

3、Secret的参数和类型

Secret三种可选参数:

  • generic:通用类型,常于存储密码数据。
  • tls:用于存储私钥和证书。
  • docker-registry:用于存放docker仓库的认证信息。

Secret三种类型:

  • Service Account:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
  • Opaque:base64编码格式的Secret,用来存储密码、秘钥等。可以通过base64 --decode解码获得原始数据,因此安全性弱
  • kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。

二、实践:使用Secret进行加密

1、方式一:环境变量方式引入

首先先针对 username、password 值进行加密:

echo admin|base64
echo NTQ34tg*@19VF-AdmiN|base64

创建名为var-secret 的Secret

cat varSecretConfig.yaml 

---
apiVersion: v1 
kind: Secret
metadata:
  name: var-secret
type: Opaque          # 指定加密方式
data:
  username: YWRtaW4K  # 值是加密后的
  password: TlRRMzR0ZypAMTlWRi1BZG1pTgo=

使用busybox镜像创建Deployment资源,并引入Secret

cat vardeploy.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vardemo
spec:
  replicas: 1
  selector:
    matchLabels:
      type: var
  template:
    metadata:
      labels:
        type: var
    spec:
      containers:
      - name: vardemo
        image: busybox:1.28.0
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "sleep 36000"]
        env:
        - name: password
          valueFrom:
            secretKeyRef:
              name: var-secret
              key: password
        - name: username
          valueFrom:
            secretKeyRef:
              name: var-secret
              key: username

执行YAML文件:

kubectl apply -f varSecretConfig.yaml 
kubectl apply -f vardeploy.yaml 

查看创建资源状态:

kubectl get pod -l type=var
kubectl get secret var-secret
kubectl describe secret var-secret

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ct3A6Giw-1688270847294)(D:\MD归档文档\IMG\image-20230702114038298.png)]

进入容器查看变量,是否成功引入:

kubectl exec -it vardemo-5cf58dd664-vnv5q -- /bin/sh

echo $username
admin
echo $password
NTQ34tg*@19VF-AdmiN

2、方式二:卷挂载方式引入

创建名为volume-secret 的Secret

cat volumeSecretConfig.yaml 
---
apiVersion: v1 
kind: Secret
metadata:
  name: volume-secret
type: Opaque
data:
  username: YWRtaW4K
  password: TlRRMzR0ZypAMTlWRi1BZG1pTgo=

创建deployment,引入secret

cat volumedeploy.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: volumedemo
spec:
  replicas: 1
  selector:
    matchLabels:
      type: volume
  template:
    metadata:
      labels:
        type: volume
    spec:
      volumes:
      - name: volume-secret
        secret:
          secretName: volume-secret  # 定义挂载卷
      containers:
      - name: volumedemo
        image: busybox:1.28.0
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "sleep 36000"]
        volumeMounts:
        - name: volume-secret
          mountPath: /tmp 
          readOnly: true

执行YAML文件:

kubectl apply -f volumeSecretConfig.yaml
kubectl apply -f volumedeploy.yaml	

进入容器查看:

kubectl exec -it volumedemo-6dc47cff57-qstv4 -- /bin/sh

cat /tmp/password 
NTQ34tg*@19VF-AdmiN

cat /tmp/username 
admin

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/131499575