您现在的位置是:首页 >技术杂谈 >Kubernetes密钥管理Secret网站首页技术杂谈

Kubernetes密钥管理Secret

zhangshenglu1 2024-06-17 11:26:54
简介Kubernetes密钥管理Secret

Kubernetes密钥管理 SecretMap

一、Secret

1.1 什么是secret

  • Secret与ConfigMap类似,主要的区别是ConfigMap存储的是明文,而Secret存储的是密文。

  • ConfigMap可以用配置文件管理,而Secret可用于密码、密钥、token等敏感数据的配置管理。

1.2 secret类型

Secret有4种类型:

  • Opaque: base64编码格式的Secret,用来存储密码、密钥、信息、证书等,类型标识符为generic
  • Service Account: 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/var/run/secrets/kubernetes.io/serviceaccount目录中
  • kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息,类型标识为docker-registry。
  • kubernetes.io/tls: 用于为SSL通信模式存储证书和私钥文件,命令式创建类型标识为tls。
[root@k8s-master1 ~]#  kubectl create secret -h
Create a secret using specified subcommand.

Available Commands:
  docker-registry Create a secret for use with a Docker registry
  generic         Create a secret from a local file, directory or literal value
  tls             Create a TLS secret

Usage:
  kubectl create secret [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

1.3 Secret应用案例

创建mysql管理员密码Secret案例,使用Opaque类型来创建mysql密码Secret

1.3.1 将明文密码进行base64编码

Opaque类型密码需要进行base64编码

[root@k8s-master1 ~]#  echo -n 123 |base64
MTIz
假设密码为123,得到的编码为MTIz

1.3.2 编写创建secret的YAML文件

[root@k8s-master1 ~]#  vim secret-mysql.yml
apiVersion: v1
kind: Secret
metadata:
  name: secret-mysql
data:
  password: MTIz

1.3.3 创建secret并确认

[root@k8s-master1 ~]#  kubectl apply -f secret-mysql.yml
secret/secret-mysql created
[root@k8s-master1 ~]#  kubectl get secret |grep secret-mysql
secret-mysql          Opaque                                1      40s

1.4 Secret的2种使用方式

1.4.1 通过环境变量的方式传递给pod

  1. 编写pod的YAML文件使用Secret
[root@k8s-master1 ~]#  vim pod-mysql-secret.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-mysql-secret1
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
          secretKeyRef:
            name: secret-mysql				# 对应创建的secret名字
            key: password

2.创建pod

[root@k8s-master1 ~]#  kubectl apply -f pod-mysql-secret.yml
pod/pod-mysql-secret1 created

3.验证pod

[root@k8s-master1 ~]#  kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
pod-mysql-secret1                   1/1     Running   0          1m46s

4.验证传入pod的变量效果

[root@k8s-master1 ~]#  kubectl exec -it pod-mysql-secret1 -- /bin/bash
root@pod-mysql-secret1:/# env |grep MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=123

root@pod-mysql-secret1:/# mysql -p123

1.4.2 通过volume的方式挂载到pod内

1.编写pod的YAML文件使用Secret

[root@k8s-master1 ~]#  vim pod-mysql-secret2.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod-mysql-secret2
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 100000
    volumeMounts:
    - name: vol-secret                  # 定义挂载的卷,对应下面定义的卷名
      mountPath: "/opt/passwd"    # 挂载目录(支持热更新),也可以使用subPath挂载文件(但不支持热更新)
      readOnly: true                    # 只读
  volumes:
  - name: vol-secret                    # 定义卷名
    secret:                             # 使用secret
      secretName: secret-mysql              # 对应创建好的secret名

2.创建pod

[root@k8s-master1 ~]#  kubectl apply -f pod-mysql-secret2.yml
pod/pod-mysql-secret2 created

3.验证pod

[root@k8s-master1 ~]#  kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
pod-mysql-secret2                   1/1     Running   0          15m

4.验证

[root@k8s-master1 ~]#  kubectl exec  pod-mysql-secret2 -- cat /opt/passwd/password
123												 在容器内都被解码了

5.热更新测试

[root@k8s-master1 ~]#  echo -n haha123 |base64
aGFoYTEyMw==

[root@k8s-master1 ~]#  kubectl edit secret secret-mysql
apiVersion: v1
data:
  password: aGFoYTEyMw==					    密码改成haha123的base64编码
kind: Secret
metadata:
[root@k8s-master1 ~]#  kubectl exec  pod-mysql-secret2 -- cat /opt/passwd/password
haha123										   过一会儿,确认密码确实更新了
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。