Kubernetes 是一种非常流行的容器编排工具,它依靠众多的组件帮助运维人员管理容器化应用程序。然而,随着应用程序的增多,管理敏感信息变得愈发重要。在容器运行时,敏感信息如数据库密码或 API 密钥等,需要做到安全存储和使用,以防止不必要的安全漏洞。本文将详细介绍在 Kubernetes 环境中使用 Secret,来进行敏感信息存储和使用的过程。
理解 Kubernetes Secret
在 Kubernetes 中,Secret 是一种特殊的对象类型,用于存储敏感数据,如密码和 API 密钥等。Secret 可以被用在各种 Kubernetes 对象中,以便于容器或者 Kubernetes 执行程序获取敏感信息。通常,Secret 可以存储以下类型数据:
- TLS 证书
- SSH 密钥
- API 密钥
- 用户名与密码
- 其他密码或密钥
Secret 的创建和管理可以通过 Kubernetes API 来进行。通过使用命令行工具 kubectl 或者编写 Kubernetes YAML 文件等方式,可用快速地创建、修改和删除 Secret。
在使用 Secret 时,需要注意以下几点:
- Secret 中存储的数据必须进行加密,并且只能被 kubelet 和 Kubernetes API 服务器解密。
- Secret 中的数据不能以明文方式展示在 Kubernetes 的 Event 监控中。
- 不建议在 Pod 中直接暴露 Secret 中的敏感数据,应该使用环境变量、卷映射等方式传递和使用。
在 Kubernetes 中使用 Secret
以下是在 Kubernetes 中使用 Secret 的几个步骤。
1. 创建 Secret
可以通过以下命令创建 Secret:
kubectl create secret generic <SECRET_NAME> --from-literal=<KEY_NAME>=<KEY_VALUE>
其中,<secret_name> 为 Secret 的名称,<key_name> 和 <key_value> 分别为存储在 Secret 中的数据的键名和值,可以在创建 Secret 时一次性添加多个键值对。
也可以通过定义 YAML 文件来创建 Secret,例如:
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: dXNlcm5hbWU= password: cGFzc3dvcmQ=
在这个 YAML 文件中,Secret 的名称为 mysecret,类型为 Opaque,这种类型的 Secret 允许存储任何类型的数据并将其作为字节数组保存,这里存放了用户名和密码的加密数据。
2. 将 Secret 传递到 Pod 中
可以通过下面方式将 Secret 传递到 Pod 中:
2.1. 环境变量方式
// www.javascriptcn.com code example
env:
- name: MY_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: MY_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password在容器中添加环境变量,可以通过 env 字段来进行设置。在上面的 YAML 文件中,设置了 MY_USERNAME 和 MY_PASSWORD 环境变量,值分别从存储在 Secret 中的 username 和 password 字段中获取。
2.2. 挂载卷方式
// www.javascriptcn.com code example
volumes:
- name: secret-volume
secret:
secretName: mysecret
containers:
- name: myapp
volumeMounts:
- name: secret-volume
mountPath: "/etc/myapp/auth"
readOnly: true在容器中挂载卷,可将 Secret 的值保存到文件中。在上面的 YAML 文件中,myapp 容器中的 /etc/myapp/auth 目录被挂载到了 mysecret 的值,通过读取这些文件可以获取 Secret 中的值。
3. 保护 Secret
Secret 中存储敏感信息,因此应该特别注意它们的安全性。建议根据以下内容保护 Secret:
- 将 Secret 存储在安全、受保护的存储介质中。
- 通过调用
kubectl get secrets来定期检查所有 Secret。 - 使用 Role-Based Access Control (RBAC) 限制对 Secret 的访问。
- 特别限制使用 Secret 的 Pod。
示例代码
下面的示例代码是通过环境变量和挂载卷的方式来使用 Secret:
// www.javascriptcn.com code example
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
env:
- name: MY_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: MY_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
volumeMounts:
- name: mysecret
mountPath: "/etc/auth"
readOnly: true
volumes:
- name: mysecret
secret:
secretName: mysecret以上 YAML 文件创建了一个名为 my-pod 的 Kubernetes Pod 对象,使用了以 Secret 为基础的身份验证。在容器中,通过 MY_USERNAME 和 MY_PASSWORD 环境变量获取 Secret 中的值,在容器中以 /etc/auth/ 目录挂载这个 Secret 。总之,Secret 可以用于在 Kubernetes 中安全地存储和使用敏感信息,值得拥有者考虑在其生产工作负载中使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6817ea941bf7134c4adb0