k8s入门到实战(八)—— Secret概述
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: 3Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/mysql server: 192.168.0.1 --- # 创建pvc apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: nfs --- # 创建 configmap apiVersion: v1 kind: ConfigMap metadata: name: mysql-config data: mysql.cnf: | [mysqld] port=3306 character-set-server=utf8mb4 --- # 创建一个mysql服务 apiVersion: v1 kind: Pod metadata: name: mysql-pod spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-password key: PASSWORD ports: - containerPort: 3306 volumeMounts: - mountPath: /var/lib/mysql name: data-volume - mountPath: /etc/mysql/conf.d name: conf-volume volumes: - name: conf-volume configMap: name: mysql-config - name: data-volume persistentVolumeClaim: 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>
能够正常登录,测试成功
