目录
在Kubernetes(k8s)中,应用程序的配置和数据存储是一个重要且敏感的议题。Kubernetes提供了两种主要的资源类型来管理这些敏感信息和配置数据:Secrets和ConfigMaps。本文将深入探讨这两种资源类型,以及如何在Kubernetes集群中有效地使用它们。
一、Secrets
(一)Secrets概述
在Kubernetes(k8s)中,Secrets是一种用于存储敏感信息的对象,如密码、OAuth令牌、SSH密钥等。这些信息在部署应用程序时可能需要,但又不希望直接硬编码在应用程序的代码中或者公开暴露。通过使用Secrets,我们可以将敏感信息与应用程序代码解耦,从而提高安全性
(二)Secrets类型
1.service-account-token
用于访问API的服务账户令牌。由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount 目录中
[root@master01 ~]#kubectl run nginx --image=nginx:1.18.0
pod/nginx created
[root@master01 ~]#kubectl describe pod nginx |sed -n '/Mounts/{p;n;p}'
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-vgx6f (ro)
-------------------------------------------------------------------------------------
#新建立一个pod,它会自动以挂载的方式,使用serviceaccount来访问,并且权限是只读权限
2.Opaque
Base64 编码格式的Secret,用来存储用户自定义的密码、密钥等/Secrets中的敏感信息在存储之前会先被Base64编码。但是请注意,Base64编码并不提供安全性,它只是用来避免在YAML文件中直接暴露明文信息,是默认的Secret 类型
3.Docker Config
用于认证私有Docker仓库的凭据。存储私有 docker registry 的认证信息,搭建私有仓库时,使用该类型,在客户端登录私有仓库时,可以免密登录
4.TLS
用于存储TLS证书和私钥。
(三)Secrets使用方式
可挂载为卷:Secrets可以挂载到Pod中的容器,以文件的形式提供敏感信息。
可作为环境变量:Secrets中的信息也可以被设置为Pod中容器的环境变量
(四)创建Secrets
1.陈述式命令创建
1.1 定义用户与密码文件
[root@master01 data]#mkdir -p /data/secret/pass
[root@master01 data]#cd /data/secret
[root@master01 secret]#echo -n 'china' >/data/secret/pass/user.txt
#创建用户名文件
[root@master01 secret]#echo -n '19491001' >/data/secret/pass/passwd.txt
#创建密码文件
1.2 使用陈述式命令创建
[root@master01 secret]#kubectl create secret generic secret01 --from-file=/data/secret/pass/user.txt --from-file=/data/secret/pass/passwd.txt
secret/secret01 created
[root@master01 secret]#kubectl get secrets secret01
NAME TYPE DATA AGE
secret01 Opaque 2 11s
[root@master01 secret]#kubectl describe secrets secret01
Name: secret01
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
user.txt: 5 bytes
passwd.txt: 8 bytes
---------------------------------------------------------------------------------
#kubectl create secret generic secret01
#这一部分命令告诉Kubernetes创建一个新的泛型(generic)类型的Secret对象,命名为secret01。
#使用generic子命令来标明要创建的是一个Opaque类型的Secret
--from-file=/data/secret/pass/user.txt
#此选项指定了一个文件路径/data/secret/pass/user.txt,其内容将被用来创建Secret中的一个键值对。
#键(key)通常是文件名(即user.txt),值(value)是文件的内容。
#这意味着Secret将包含一个条目,其中键为user.txt,值为该文件中的文本内容。
--from-file=/data/secret/pass/passwd.txt
#同理,此选项也指定了另一个文件路径/data/secret/pass/passwd.txt,
#其内容也会被加入到Secret中作为一个独立的条
#不论是使用get命令还是describe查看,都不会显示实际的内容,而是以字节长度的信息显示
2.使用base64创建
上述创建方式,虽然可以创建Secrets,但是它还是属于一种明文创建的方式,可以使用base方式进行加密
2.1 获取加密信息
[root@master01 secret]#echo -n china |base64
Y2hpbmE=
[root@master01 secret]#echo -n 19491001 |base64
MTk0OTEwMDE=
2.2 使用yaml文件创建
[root@master01 secret]#vim secret.yaml
[root@master01 secret]#cat secret.yaml
apiVersion: v1
kind: Secret #指定资源的类型为Secret
metadata:
name: secret-v1 #Secret资源的名称
type: Opaque #指定Secret的类型
data: #包含实际存储的秘密数据,以base64编码格式给出的键值对
username: Y2hpbmE= #base64编码后的“chance”字符串,表示用户名
password: MTk0OTEwMDE= #base64编码后的密码
[root@master01 secret]#kubectl apply -f secret.yaml
secret/secret-v1 created
[root@master01 secret]#kubectl get secrets secret-v1
NAME TYPE DATA AGE
secret-v1 Opaque 2 10s
--------------------------------------------------------------------------------
#使用这个Secret时,Kubernetes会自动处理这些值的base64解码,
#使Pod内的应用程序能够直接使用解码后的原始数据。
(五)使用Secrets
1.使用挂载的方式
1.1 定义文件
在yaml文件中,通过挂载的方式,将指定的Secret资源,挂载到pod的指定目录下
[root@master01 secret]#vim secret-pod01.yaml
[root@master01 secret]#cat secret-pod01.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-pod01
spec:
containers:
- name: nginx
image: nginx:1.18.0
volumeMounts: #定义挂载Volume到容器内部的配置
- name: secrets #引用了在volumes部分定义的Volume名称
mountPath: "/etc/secrets" #容器内挂载点的路径,即Volume将在这个路径下可见
readOnly: true #以只读方式挂载,不能修改secret-v1的内容
volumes:
- name: secrets #secrets Volume的名称,需与volumeMounts中的name相匹配
secret:
secretName: secret-v1 #指定此Volume将挂载的Secret的名称
1.2 创建pod
可以看到 账户名称和密码 以挂载的方式 在指定目录 且只读
[root@master01 secret]#kubectl apply -f secret-pod01.yaml
pod/secret-pod01 created
[root@master01 secret]#kubectl get pod secret-pod01
NAME READY STATUS RESTARTS AGE
secret-pod01 1/1 Runn