kubernetes中Secret如何使用

57次阅读
没有评论

共计 4167 个字符,预计需要花费 11 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 kubernetes 中 Secret 如何使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一:简介
Secret 可以作为数据卷被挂载,或作为环境变量暴露出来以供 pod 中的容器使用。它们也可以被系统的其他部分使用,而不直接暴露在 pod 内。例如,它们可以保存凭据,系统的其他部分应该用它来代表您与外部系统进行交互。

Secret 举例:

apiVersion: v1

kind: Secret

metadata:

 name: mysecret

type: Opaque

data:

 username: YWRtaW4=

 password: MWYyZDFlMmU2N2Rm

二:在 Pod 中使用 Secret 文件

1. 创建一个 secret 或者使用已有的 secret。多个 pod 可以引用同一个 secret。

2. 修改您的 pod 的定义在 spec.volumes[] 下增加一个 volume。可以给这个 volume 随意命名,它的 spec.volumes[].secret.secretName 必须等于 secret 对象的名字。

3. 将 spec.containers[].volumeMounts[] 加到需要用到该 secret 的容器中。指定 spec.containers[].volumeMounts[].readOnly = true 和 spec.containers[].volumeMounts[].mountPath 为您想要该 secret 出现的尚未使用的目录。

4. 修改您的镜像并且/或者命令行让程序从该目录下寻找文件。Secret 的 data 映射中的每一个键都成为了 mountPath 下的一个文件名。

apiVersion: v1

kind: Pod

metadata:

 name: mypod

spec:

 containers:

 – name: mypod

 image: redis

 volumeMounts:

 – name: foo

 mountPath: /etc/foo

 readOnly: true

 volumes:

 – name: foo

 secret:

 secretName: mysecret

您想要用的每个 secret 都需要在 spec.volumes 中指明。如果 pod 中有多个容器,每个容器都需要自己的 volumeMounts 配置块,但是每个 secret 只需要一个 spec.volumes。
您可以打包多个文件到一个 secret 中,或者使用的多个 secret,怎样方便就怎样来.

三:向特性路径映射 secret 密钥

我们还可以控制 Secret key 映射在 volume 中的路径。您可以使用 spec.volumes[].secret.items 字段修改每个 key 的目标路径:

apiVersion: v1

kind: Pod

metadata:

 name: mypod

spec:

 containers:

 – name: mypod

 image: redis

 volumeMounts:

 – name: foo

 mountPath: /etc/foo

 readOnly: true

 volumes:

 – name: foo

 secret:

 secretName: mysecret

 items:

 – key: username

 path: my-group/my-username

1.username secret 存储在 /etc/foo/my-group/my-username 文件中而不是 /etc/foo/username 中。
2.password secret 没有被影射

如果使用了 spec.volumes[].secret.items,只有在 items 中指定的 key 被影射。要使用 secret 中所有的 key,所有这些都必须列在 items 字段中。所有列出的密钥必须存在于相应的 secret 中。否则,不会创建卷。

四:Secret 文件权限
您还可以指定 secret 将拥有的权限模式位文件。如果不指定,默认使用 0644。您可以为整个保密卷指定默认模式,如果需要,可以覆盖每个密钥。

apiVersion: v1

kind: Pod

metadata:

 name: mypod

spec:

 containers:

 – name: mypod

 image: redis

 volumeMounts:

 – name: foo

 mountPath: /etc/foo

 volumes:

 – name: foo

 secret:

 secretName: mysecret

 defaultMode: 256

然后,secret 将被挂载到 /etc/foo 目录,所有通过该 secret volume 挂载创建的文件的权限都是 0400。
请注意,JSON 规范不支持八进制符号,因此使用 256 值作为 0400 权限。如果您使用 yaml 而不是 json 作为 pod,则可以使用八进制符号以更自然的方式指定权限。

五:从 Volume 中消费 secret 值
在挂载的 secret volume 的容器内,secret key 将作为文件,并且 secret 的值使用 base-64 解码并存储在这些文件中。这是在上面的示例容器内执行的命令的结果:

$ ls /etc/foo/

username

password

$ cat /etc/foo/username

admin

$ cat /etc/foo/password

1f2d1e2e67df

六:挂载的 secret 被自动更新
当已经在 volume 中消被消费的 secret 被更新时,被映射的 key 也将被更新。Kubelet 在周期性同步时检查被挂载的 secret 是不是最新的。但是,它正在使用其基于本地 ttl 的缓存来获取当前的 secret 值。结果是,当 secret 被更新的时刻到将新的 secret 映射到 pod 的时刻的总延迟可以与 kubelet 中的 secret 缓存的 kubelet sync period + ttl 一样长。

七:Secret 作为环境变量
1. 创建一个 secret 或者使用一个已存在的 secret。多个 pod 可以引用同一个 secret。
2. 在每个容器中修改您想要使用 secret key 的 Pod 定义,为要使用的每个 secret key 添加一个环境变量。消费 secret key 的环境变量应填充 secret 的名称,并键入 env[x].valueFrom.secretKeyRef。
3. 修改镜像或者命令行,以便程序在指定的环境变量中查找值。

apiVersion: v1

kind: Pod

metadata:

 name: secret-env-pod

spec:

 containers:

 – name: mycontainer

 image: redis

 env:

 – name: SECRET_USERNAME

 valueFrom:

 secretKeyRef:

 name: mysecret

 key: username

 – name: SECRET_PASSWORD

 valueFrom:

 secretKeyRef:

 name: mysecret

 key: password

 restartPolicy: Never

八:消费环境变量里的 Secret 值
在一个消耗环境变量 secret 的容器中,secret key 作为包含 secret 数据的 base-64 解码值的常规环境变量。这是从上面的示例在容器内执行的命令的结果:

$ echo $SECRET_USERNAME

admin

$ echo $SECRET_PASSWORD

1f2d1e2e67df

九:使用 imagePullSecret
imagePullSecret 是将包含 Docker(或其他)镜像注册表密码的 secret 传递给 Kubelet 的一种方式,因此可以代表您的 pod 拉取私有镜像。

十:使用 Secret 的限制
1. 验证 secret volume 来源确保指定的对象引用实际上指向一个类型为 Secret 的对象。因此,需要在依赖于它的任何 pod 之前创建一个 secret。
2.Secret API 对象驻留在命名空间中。它们只能由同一命名空间中的 pod 引用。
3. 每个 secret 的大小限制为 1MB。这是为了防止创建非常大的 secret 会耗尽 apiserver 和 kubelet 的内存。然而,创建许多较小的 secret 也可能耗尽内存。更全面得限制 secret 对内存使用的更全面的限制是计划中的功能。
4.Kubelet 仅支持从 API server 获取的 Pod 使用 secret。这包括使用 kubectl 创建的任何 pod,或间接通过 replication controller 创建的 pod。它不包括通过 kubelet –manifest-url 标志,其 –config 标志或其 REST API 创建的 pod(这些不是创建 pod 的常用方法)。
5. 必须先创建 secret,除非将它们标记为可选项,否则必须在将其作为环境变量在 pod 中使用之前创建 secret。对不存在的 secret 的引用将阻止其启动。
6. 通过 secretKeyRef 对不存在于命名的 key 中的 key 进行引用将阻止该启动。
7. 用于通过 envFrom 填充环境变量的 secret,这些环境变量具有被认为是无效环境变量名称的 key 将跳过这些键。该 pod 将被允许启动。将会有一个事件,其原因是 InvalidVariableNames,该消息将包含被跳过的无效键的列表。该示例显示一个 pod,它指的是包含 2 个无效键,1badkey 和 2alsobad 的默认 /mysecret ConfigMap。

十一: Secret 与 Pod 生命周期的联系
通过 API 创建的 Pod 时,不会检查应用的 secret 是否存在。一旦 Pod 被调度,kubelet 就会尝试获取该 secret 的值。如果获取不到该 secret,或者暂时无法与 API server 建立连接,kubelet 将会定期重试。Kubelet 将会报告关于 pod 的事件,并解释它无法启动的原因。一旦获取的 secret,kubelet 将创建并装载一个包含它的卷。在安装所有 pod 的卷之前,都不会启动 pod 的容器。

以上是“kubernetes 中 Secret 如何使用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4167字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)