Kubernetes Secret使用详解(6)
本文是Kubernetes权威指南系列的一部分,你可以点击Kubernetes权威指南查看所有教程
Kubernetes Secret 介绍
在 Kubernetes 中,Pod 需要进行通信以产生所需的结果并处理彼此生成的数据。为此,他们需要存储一些敏感信息,例如用户名、密码、SSH 密钥、OAuth 令牌、API 密钥以及您认为是秘密且不公开可见的任何内容。
你必须知道 pods 和 Kubernetes 系统本身也使用 Secrets;例如,当 Pod 与 API 服务器组件通信时,Kubelet 需要从需要身份验证的镜像存储库中提取镜像时使用它。
什么是Kubernetes Secret?
Kubernetes Secret 允许您以更安全、更灵活的方式将敏感和机密信息存储在 Kubernetes 对象中,而不是将此信息放在 Pod 的定义、Kubernetes ConfigMap或容器映像中。
Kubernetes 旨在使用 YAML (JSON) 格式的文件,因此对象定义仅以 YAML (JSON) 格式存储。同样,Kubernetes Secret 被视为存储敏感数据的 Kubernetes 对象,因此内容不会被泄露。
在使用 Kubernetes Secrets 时,您必须注意以下几点: –
- Kubernetes Secret 对象的名称必须是有效的 DNS 子域
- 在 Kubernetes 系统中,服务帐户会自动创建、附加带有 API 凭据的 Secret。
如何创建 Kubernetes Secret?
有多种方法可以创建和使用 Kubernetes Secret 对象。如果您熟悉 Kubernetes ConfiMap 对象,那么您就会了解 Secrets 也是以相同的方式创建和使用的。因此,首先,我们将了解创建 Secret 的可能方法,然后了解如何在 Pod 中使用它。
以下是创建 Secrets 的主要两种方法及其子方法:
1.kubectl
在命令行上,您可以使用 kubectl 在下面创建secrets
文件:在 kubectl 命令行上,您可以参考包含您的机密信息的文件,如下所示。您应该注意,如果您在文件中以纯字符串形式提供该内容,那么当您读取如下所示的对象时,您将看到这些值将出现在数据下方
映射并编码如下。另请注意,您不需要对文件中的特殊字符进行转义。
echo -n ‘admin’ > ./username.txt
echo -n ‘pAss)1’ > ./password.txt
kubectl create secret generic get-cred --from-file=./username.txt --form-file=./password.txt
kubectl get secrets get-cred -0 yaml
环境变量文件:当我们有一个包含密钥对格式数据的变量文件时,我们希望将其用作 Secret;那么我们可以执行以下操作:
cat << EOF > credential.txt
您可以在下面看到相同 Secret 的描述。
Literal : 在 kubectl 命令行上,你可以直接给出如下的机密数据,当它转换为 Secret 对象时会使用 base64 进行编码,如
kubectl create secret generic dev-secret --from-literal=username=admin --from-literal=password=’passw0rdo1’
kubectl get secret dev-secret -o yaml
Literal:您可以编写一个 YAML 文件,您可以在其中以两种方式映射sensitive 数据,
- Data:这支持使用 base64 编码的字符串。因此,在放入 Secret 定义之前,您必须使用 base64 编码对敏感数据进行编码
- stringData:这直接支持纯字符串,您不需要对它们进行编码。另外,当您在 Kubernetes Secret 对象中看到此信息时,您会看到它已编码,因此您不必担心。
名为 Kube-secret.yaml 的 Secret 定义 YAML 文件示例: –
像下面这样部署这个文件:
kubectl apply -f ./kube-secret.yaml
您将看到此对象已创建。
kubectl get secrets my-secret –o yaml
2.Kustomize
从 v1.14 版本开始,您还可以使用 Kustomize 作为资源生成器来创建 Secrets 和 ConfigMaps。生成器应该在 yaml 中指定,它应该位于一个目录下。生成Secret后,可以在API服务器中使用kubctl apply生成Secret。
有多种使用 Kustomize 创建 Secret 的方法。少数描述如下: –
文件:您可以在字段 secretGenerator 下指定包含敏感数据的文件,如下所示:
cat kustomization.yaml
然后部署这个文件。
kubectl apply -k .
然后您可以检查是否创建了secret 。
kubectl describe secrets user-pass-dht85d7kff
Literals:您可以在使用 yaml 中的资源生成器创建 Secret 时直接使用文字密钥对值。
拿这个例子:
使用如下内容创建 kustomization.yaml: –
cat << EOF >./kustomization.yaml
然后部署此文件并获得如下输出: –
kubectl apply -k .
Kubernetes Secret 示例
现在我们探索一些在 pods 定义中使用类似上面创建的secrets 的方法。但首先,我们必须注意以下几点:
- 多个 Pod 可以指代同一个。
- Secret 数据将显示为容器内的文件。之后,由容器决定如何使用它。
- Secrets 和引用 pod 应该在同一个中。
- 在使用之前必须创建Secret 。
我们可以通过以下方式在 pod 中使用 Secret:
- 作为挂载在容器内的volumes 下的文件并在 pod 内的volume 中使用 Secret,我们必须记住以下几点:
- 在定义 pod 时,我们应该在 .spec.volumes[] 下添加一个volume ,并根据您的方便命名该volume 。
- 此外,我们有字段 .spec.volumes[].secret.secretName 代表Secret对象。
- 每个需要Secret的容器,你应该定义 .spec.containers[].volumeMounts[] 并指定. spec.containers[].volumeMounts[].readOnly = true 和.spec.containers[].volumeMounts[].mountPath 到一个未使用的文件夹名称,您的Secret将在其中安装。
- 然后,修改您的镜像或使用命令行,以便应用程序找到文件。
cat << EOF > testsecret
kubectl apply -f secretfile.yaml
kubectl exec testpod -- cat /etc/foo/testsecret.txt
- 作为环境变量,首先,您使用 –from-env-file= 创建一个 Secret 对象,如下所示。
kubectl create secret generic credentials --form-env-file=testsecret.txt
然后像下面这样使用带有字段 env[].valueFrom.secretKeyRef 的secret ,其中 name 和 Key 表示secret 对象内的键值对中的secret 名称和密钥名称。
kubectl apply -f ./newpod.yaml
当您像下面这样检查该容器内的环境变量时,您可以看到您在 Secret 中定义的环境变量。
kubectl exec env-pod -- env | grep ENV
结论
Kubernetes Secrets 也不能像其他安全工具和方法一样完全证明。但使用 Secret 对敏感信息进行编码而不是将敏感信息以纯文本形式放在某处是一种很好的做法。此外,在基础设施环境的 Kubernetes 安全策略中包含 Secrets 会在系统级别增加一层安全性。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!