Secret
什么是 secret
在 k8s 中,Secret 是一种用于存储敏感数据的对象,如密码、API 密钥、证书等。Secret 的设计目的是为了安全地存储和传输敏感信息。
Secret 可以以多种形式存储敏感数据,包括 Base64 编码、字符串文本、docker 镜像等。Secret 的数据可以在 pod 中以环境变量、命令行参数或挂载文件的方式使用。
Secret 可以通过 kubectl 命令行工具、YAML 文件或 API 进行创建和管理。可以在命名空间级别或集群级别创建 Secret,并将其应用于特定的 Pod、Deployment、StatefulSet 等对象。
与 ConfigMap 类似,Secret 也是以键值对的形式存储数据的。但不同的是,Secret 的数据是加密的,并且在传输和存储过程中会进行加密和解密操作,以确保敏感信息的安全性。
通过使用 Secret,可以实现以下的优势:
- 安全存储敏感信息:Secret 可以加密存储敏感数据,确保敏感信息在传输和存储过程中的安全性。
- 解耦敏感数据和应用程序:将敏感数据从应用程序中分离,使得应用程序更加灵活和可配置。
- 集中化管理敏感数据:通过创建和管理 Secret 对象,可以集中管理应用程序的敏感数据,而不需要将其硬编码到应用程序中。
总之,Secret 是 k8s 中用于存储和管理敏感数据的一种机制,通过加密和解密操作,确保敏感信息的安全性,并将敏感数据与应用程序分离,提高了应用程序的灵活性和安全性。
secret 示例
我们这里使用 Base64 编码测试 secret
注意:Base64 只是一种编码,不含密钥的,并不安全。默认情况下,k8s Secret 未加密地存储在 API 服务器的底层数据存储(etcd)中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。 此外,任何有权限在命名空间中创建 Pod 的人都可以使用该访问权限读取该命名空间中的任何 Secret,只防君子,不防小人;
- 查看 “123456” 的 base64 编码
[root@k8s-master ~]# echo -n '123456' | base64
MTIzNDU2
[root@k8s-master ~]# echo 'MTIzNDU2' | base64 --decode
123456
- 编辑 yaml 文件
mysql-server.yaml
进行测试
# 创建pv
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-pv
spec:capacity:storage: 3GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/mysqlserver: 192.168.0.1
---
# 创建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 1GistorageClassName: nfs
---
# 创建 configmap
apiVersion: v1
kind: ConfigMap
metadata:name: mysql-config
data:mysql.cnf: |[mysqld]port=3306character-set-server=utf8mb4
---
# 创建一个mysql服务
apiVersion: v1
kind: Pod
metadata:name: mysql-pod
spec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-passwordkey: PASSWORDports:- containerPort: 3306volumeMounts:- mountPath: /var/lib/mysqlname: data-volume- mountPath: /etc/mysql/conf.dname: conf-volumevolumes:- name: conf-volumeconfigMap:name: mysql-config- name: data-volumepersistentVolumeClaim:claimName: mysql-pvc
---
# 创建secret对象,在一些敏感位置使用
apiVersion: v1
kind: Secret
metadata:name: mysql-password
data:PASSWORD: MTIzNDU2
- 根据 yaml 文件创建 pod,测试密码 “123456” 能否登录
[root@k8s-master k8s]# kubectl apply -f mysql-server.yaml
persistentvolume/mysql-pv created
persistentvolumeclaim/mysql-pvc created
configmap/mysql-config created
pod/mysql-pod created
secret/mysql-password created
[root@k8s-master k8s]# kubectl exec -it mysql-pod /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@mysql-pod:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
能够正常登录,测试成功