您正在查看Kubernetes版德赢是不是大平台本:v1.19的文档
Kubernetes v1.19文德赢是不是大平台档不再被积极维护。您当前查看的版本是一个静态快照。有关最新的文档,请参阅德赢是不是大平台最新版本。
秘密
Kubernetes Secrets允许存储和管理敏感信息,如密码、OAuth令牌和ssh密钥。将机密信息存储在Secret中比将其逐字保存在圆荚体定义或在容器的形象.看到秘密设计文档为更多的信息。
Secret是包含少量敏感数据(如密码、令牌或密钥)的对象。否则,这些信息可能会放在Pod规范或图像中。用户可以创建Secrets,系统也会创建一些Secrets。
秘密概述
要使用秘密,POD需要引用秘密。秘密可以用三种方式与豆荚一起使用:
- 作为文件在一个体积安装在它的一个或多个容器上。
- 作为容器环境变量.
- 由Kubelet在提取图像时对于豆荚。
Secret对象的名称必须是有效的DNS域名.您可以指定数据
和/或stringdata.
字段,在为Secret创建配置文件时。的数据
和stringdata.
字段是可选的。中的所有键的值数据
字段必须是Base64编码的字符串。如果对Base64字符串的转换是不可取的,则可以选择指定stringdata.
字段,它接受任意字符串作为值。
的钥匙数据
和stringdata.
必须由字母数字字符组成,-
,_
或.
.所有键值对stringdata.
字段在内部合并到数据
字段。如果一个键同时出现在数据
和stringdata.
字段中指定的值stringdata.
字段优先。
类型的秘密
在创建Secret时,可以使用类型
场的秘密
资源,或某些等价物kubectl
命令行标志(如果可用)。Secret类型用于方便对Secret数据的编程处理。
Kubernetes提供了一些常见使用场景的几种内容类型。这些类型在执行的验证方面各不相同,并且约束kubernetes对它们施加。
内装式类型 | 用法 |
---|---|
不透明的 |
任意用户定义的数据 |
Kubernetes.io/service-Account-Token. |
服务帐户令牌 |
www.amasoeur.com / dockercfg |
序列化~ / .dockercfg 文件 |
www.amasoeur.com / dockerconfigjson |
序列化~ / .docker / json 文件 |
www.amasoeur.com /基本认证 |
用于基本身份验证的凭证 |
Kubernetes.io/ssh-auth. |
SSH认证的凭据 |
Kubernetes.io/tls. |
TLS客户端或服务器的数据 |
bootstrap.www.amasoeur.com /令牌 |
引导标记数据 |
可以通过将一个非空字符串赋值为类型
Secret对象的值。空字符串被视为不透明的
类型。Kubernetes没有对类型名施加任何约束。但是,如果您正在使用一种内置类型,则必须满足为该类型定义的所有要求。
不透明的秘密
不透明的
如果从秘密配置文件中省略,则是默认的秘密类型。使用秘密时使用kubectl
,你将使用通用的
子命令以指示不透明的
秘密的类型。例如,以下命令创建一个类型为空的Secret不透明的
.
Kubectl create secret generic empty-secret
输出如下所示:
NAME TYPE DATA AGE empty-secret不透明0 2m6s
的数据
列显示存储在Secret中的数据项的数量。在这种情况下,0
意味着我们刚刚创建了一个空的秘密。
服务账户令牌
一个Kubernetes.io/service-Account-Token.
秘密类型用于存储标识服务帐户的令牌。使用此秘密类型时,您需要确保www.amasoeur.com / service-account.name
注释被设置为现有的服务帐户名。Kubernetes控制器填充其他字段,如www.amasoeur.com / service-account.uid
注释和令牌
的关键数据
字段设置为实际令牌内容。
下面的示例配置声明了一个服务帐户令牌Secret:
apiVersion:v1种类:秘密元数据:姓名:secret-sa-sample注释:www.amasoeur.com / service-account.name:“sa-name”类型:Kubernetes.io/service-Account-Token.数据:#你可以像使用Opaque Secrets一样包含额外的键值对额外的:YmFyCg = =
当创建一个圆荚体
,Kubernetes自动创建服务帐户秘密,并自动修改您的POD以使用此秘密。服务帐户令牌秘密包含用于访问API的凭据。
如果需要,可以禁用或覆盖API凭据的自动创建和使用。但是,如果您所需要做的只是安全地访问API服务器,那么这是推荐的工作流。
看到ServiceAccount德赢是不是大平台有关服务帐户如何工作的更多信息的文档。你也可以检查automounterserviceaccounttoken.
场和serviceAccountName
场的圆荚体
查看有关从Pods引用服务帐户的信息。
码头工人配置的秘密
您可以使用以下方法之一类型
值创建一个Secret来存储访问图像Docker注册表的凭据。
www.amasoeur.com / dockercfg
www.amasoeur.com / dockerconfigjson
的www.amasoeur.com / dockercfg
类型保留用于存储序列化~ / .dockercfg
这是配置Docker命令行的遗留格式。当使用这个秘密类型时,你必须确保秘密数据
字段包含一个.dockercfg
属性的值为内容的键~ / .dockercfg
文件编码为base64格式。
的www.amasoeur.com / dockerconfigjson
类型用于存储序列化JSON,该JSON遵循与~ / .docker / json
文件,这是一个新的格式~ / .dockercfg
.使用此秘密类型时,数据
秘密对象的字段必须包含一个.dockerconfigjson.
关键在于其中的内容为~ / .docker / json
文件以base64编码字符串的形式提供。
下面是一个例子www.amasoeur.com / dockercfg
类型的秘密:
apiVersion:v1种类:秘密元数据:姓名:secret-dockercfg类型:www.amasoeur.com / dockercfg数据:.dockercfg:|“< base64编码的~ /。dockercfg文件>”
注意:如果不想执行base64编码,可以选择使用stringdata.
字段。
当您使用清单创建这些类型的Secrets时,API服务器将检查期望的密钥是否存在于数据
字段,并验证提供的值是否可以解析为有效的JSON。API服务器不会验证JSON是否是Docker配置文件。
当您没有Docker配置文件,或您想使用kubectl
要创建Docker注册表秘密,您可以执行以下操作:
Kubectl创建secret docker-registry secret-tiger-docker\——docker-username=老虎\--docker-password.=pass113\——docker-email=tiger@acme.com.
这个命令创建一个Secret类型www.amasoeur.com / dockerconfigjson
.如果你把.dockerconfigjson.
的内容数据
字段,你将得到以下JSON内容,这是一个有效的Docker配置创建的动态:
{“auths”: {“https://index.docker.io/v1/”: {“用户名”:“老虎”,“密码”:“pass113”,“电子邮件”:“tiger@acme.com”,“auth”:“dGlnZXI6cGFzczExMw = = "}}}
基本身份验证的秘密
的www.amasoeur.com /基本认证
提供了用于存储基本身份验证所需的凭据的类型。使用此秘密类型时,数据
Secret字段必须包含以下两个密钥:
用户名
:用于认证的用户名;密码
:身份验证的密码或令牌。
上面两个键的值都是base64编码的字符串。控件当然可以提供清晰的文本内容stringdata.
用于创建秘密。
以下yaml是基本身份验证秘密的示例配置:
apiVersion:v1种类:秘密元数据:姓名:秘密基础 - auth类型:www.amasoeur.com /基本认证stringdata.:用户名:管理密码:t0p-cleise.
提供基本的认证Secret类型只是为了方便用户。您可以创建不透明的
对于用于基本身份验证的凭据。但是,使用内置的Secret类型有助于统一凭证的格式,API服务器会验证是否在Secret配置中提供了所需的密钥。
SSH身份验证的秘密
内装式类型Kubernetes.io/ssh-auth.
提供用于存储SSH身份验证中使用的数据。使用此秘密类型时,您将必须指定一个ssh-privatekey
中的键值对数据
(或stringdata.
字段作为要使用的SSH凭据。
下面的YAML是一个SSH认证Secret的配置示例:
apiVersion:v1种类:秘密元数据:姓名:secret-ssh-auth类型:Kubernetes.io/ssh-auth.数据:#在此示例中,数据缩写ssh-privatekey:|MIIEpQIBAAKCAQEAulqb / Y……
为了方便用户使用,提供了SSH认证的Secret类型。您可以创建不透明的
用于SSH身份验证的凭据。但是,使用内置的Secret类型有助于统一凭证的格式,API服务器会验证是否在Secret配置中提供了所需的密钥。
TLS的秘密
Kubernetes提供了一个内置的Secret类型Kubernetes.io/tls.
用于存储通常用于TLS的证书及其关联密钥。此数据主要用于Ingress资源的TLS终止,但也可以与其他资源一起使用或直接由工作负载使用。当使用这种类型的秘密,tls.key
和tls.crt.
必须提供钥匙数据
(或stringdata.
)字段,尽管API服务器并不实际验证每个密钥的值。
以下yaml包含TLS秘密的示例配置:
apiVersion:v1种类:秘密元数据:姓名:secret-tls类型:Kubernetes.io/tls.数据:#在此示例中,数据缩写tls.crt.:|MIIC2DCCAcCgAwIBAgIBATANBgkqh……tls.key:|MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ……
为了方便用户,提供了TLS Secret类型。您可以创建不透明的
用于TLS服务器和/或客户机的凭据。然而,使用内置的Secret类型有助于确保项目中的Secret格式的一致性;API服务器会验证Secret配置中是否提供了所需的密钥。
当创建TLS秘密使用kubectl
,你可以使用TLS.
子命令如下所示:
Kubectl创建秘密TLS my-tls-secret\- CERT.=路径/ /证书/文件\——关键=/ /键/文件
公私密钥对必须事先存在。的公钥证书- CERT.
必须是.PEM编码(base64编码的DER格式),并且匹配给定的私钥——关键
.私钥必须是通常所说的PEM私钥格式,未加密。在这两种情况下,PEM的初始和最后一行(例如,——开始证书
和——结束证书
为证书)不是包括在内。
自举牌的秘密
可以通过显式指定Secret来创建引导令牌Secret类型
来bootstrap.www.amasoeur.com /令牌
.这种类型的Secret是为节点引导过程中使用的令牌而设计的。它存储用于签名众所周知的ConfigMaps的令牌。
引导令牌Secret通常在kube-system
命名空间和命名形式bootstrap-token——< token-id >
在哪里< token-id >
是token ID的6个字符串。
作为Kubernetes清单,引导令牌Secret可能如下所示:
apiVersion:v1种类:秘密元数据:姓名:bootstrap-token-5emitj名称空间:kube-system类型:bootstrap.www.amasoeur.com /令牌数据:auth-extra-groups:c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4 =过期:mjaymc0wos0xm1qwndozotoxmfo =token-id:NWVtaXRq令牌机密:a3E0Z2lodnN6emduMXAwcg = =usage-bootstrap-authentication:dHJ1ZQ = =usage-bootstrap-signing:dHJ1ZQ = =
Bootstrap类型秘密具有指定的以下键数据
:
token_id
:作为令牌标识符的随机字符串。必需的。令牌机密
:一个随机的16个字符串作为实际的令牌秘密。必需的。描述
:人类可读的字符串,描述令牌的用途。可选的。过期
:绝对UTC时间,使用RFC3339指定token应该过期的时间。可选的。usage-bootstrap——<用法>
:一个布尔标志,指示引导令牌的额外使用。auth-extra-groups
:一个用逗号分隔的组名列表,将通过身份验证系统:bootstrepers.
组。
上面的YAML可能看起来令人困惑,因为值都是base64编码的字符串。事实上,您可以使用以下YAML创建一个相同的Secret:
apiVersion:v1种类:秘密元数据:#注意秘密是如何命名的姓名:bootstrap-token-5emitj#引导令牌Secret通常驻留在kube-system命名空间中名称空间:kube-system类型:bootstrap.www.amasoeur.com /令牌stringdata.:auth-extra-groups:”系统引导程序:kubeadm: default-node-token”过期:“2020 - 09 - 13 - t04:39:10z”#在名称中使用这个令牌IDtoken-id:“5 emitj”令牌机密:“kq4gihvszzgn1p0r”#这个令牌可以用于身份验证usage-bootstrap-authentication:“真正的”#,可用于签名usage-bootstrap-signing:“真正的”
创造一个秘密
有几个选项来创建一个秘密:
编辑一个秘密
可以使用以下命令编辑现有的Secret:
Kubectl编辑secrets mysecret
这将打开默认配置的编辑器,并允许更新数据
场地:
#请编辑下面的对象。从'#'开始的线将被忽略,#和空文件将中止编辑。如果保存此文件时发生错误将是#重新与相关的失败。#apiVersion:v1数据:用户名:ywrtaw4 =密码:mwyyzdflmmu2n2rm种类:秘密元数据:注释:kubectl.www.amasoeur.com / last-applied-configuration:{......}creationTimestamp:2016-01-22T18:41:56z姓名:mysecret名称空间:默认的resourceVersion:“164619”uid:cfee02d6-c137-11 e5-8D73-42010AF00002.类型:不透明的
使用的秘密
秘密可以作为数据卷挂载,也可以作为环境变量由Pod中的容器使用。秘密也可以被系统的其他部分使用,而不会直接暴露给Pod。例如,Secrets可以持有凭证,系统的其他部分应该使用这些凭证代表您与外部系统进行交互。
将Secrets作为Pod中的文件使用
在一个Pod中消耗一个卷中的秘密:
- 创建一个秘密或使用一个现有的秘密。多个pod可以引用同一个秘密。
- 修改Pod定义以在下面添加卷
.spec.volumes []
.任意命名音量,并有一个.spec.volumes [] .secret.secretName
字段等于Secret对象的名称。 - 添加A.
.spec.containers [] .volumeMounts []
每个需要秘密的容器。指定.spec.containers [] .volumeMounts[]。只读的= true
和.spec.containers [] .volumeMounts [] .mountPath
到您希望在其中显示秘密的未使用的目录名。 - 修改映像或命令行,以便程序在该目录中查找文件。每把钥匙都是秘密
数据
Map变成mountPath
.
这是一个在卷中装载秘密的Pod的例子:
apiVersion:v1种类:圆荚体元数据:姓名:mypod.规范:容器:-姓名:mypod.图像:redis.volumeMounts:-姓名:喷火mountPath:“/ etc / foo”只读的:真正的卷:-姓名:喷火秘密:secretName:mysecret
每个你想要使用的秘密需要被引用.spec.volumes
.
如果Pod中有多个容器,那么每个容器都需要有自己的容器volumeMounts
积木,但只有一个.spec.volumes
每个秘密都需要。
您可以将多个文件打包到一个秘密文件中,或者使用多个秘密文件,以方便的方式选择。
将秘密密钥投影到特定路径
您还可以控制投影秘密密钥的卷中的路径。你可以使用.spec.volumes [] .secret.items
字段更改每个密钥的目标路径:
apiVersion:v1种类:圆荚体元数据:姓名:mypod.规范:容器:-姓名:mypod.图像:redis.volumeMounts:-姓名:喷火mountPath:“/ etc / foo”只读的:真正的卷:-姓名:喷火秘密:secretName:mysecret项目:-关键:用户名路径:我的小组/用户名
会发生什么:
用户名
秘密保存在/ etc / foo / my-group / my-username
文件而不是/ etc / foo /用户名
.密码
秘密不是投射出来的。
如果.spec.volumes [] .secret.items
,只有在项目
预计。要使用密钥中的所有密钥,必须在项目
字段。所有列出的密钥必须存在于相应的秘密中。否则,卷不会创建。
秘密文件权限
您可以为单个Secret密钥设置文件访问权限位。如果您没有指定任何权限,0644.
默认使用。您还可以为整个Secret卷设置默认模式,并在需要时覆盖每个密钥。
例如,你可以像这样指定一个默认模式:
apiVersion:v1种类:圆荚体元数据:姓名:mypod.规范:容器:-姓名:mypod.图像:redis.volumeMounts:-姓名:喷火mountPath:“/ etc / foo”卷:-姓名:喷火秘密:secretName:mysecretdefaultMode:0400.
然后,秘密将被安装/etc/foo
所有由秘密卷挂载创建的文件都将具有权限0400.
.
请注意,JSON规范不支持八进制符号,因此请使用值256进行0400权限。如果使用YAML而不是JSON for Pod,则可以使用八进符号以更自然的方式指定权限。
注意如果你kubectl执行
在Pod中,您需要按照符号链接查找所需的文件模式。例如,
检查POD上的秘密文件模式。
Kubectl执行mypod -it sh CD /etc/foo ls -l
输出类似如下:
lrwxrwxrwx 1 root root 15 May 18 00:18 password -> ..数据/password lrwxrwxrwx 1 root root 15 May 18 00:18 username -> ..data/username
按照符号链接查找正确的文件模式。
CD / etc/foo/..data ls -l
输出类似如下:
total 8 -r-------- 1 root root 12 May 18 00:18 password -r-------- 1 root root 5 May 18 00:18 username
您还可以使用映射,如前面的示例中,并为这样的不同文件指定不同的文件:
apiVersion:v1种类:圆荚体元数据:姓名:mypod.规范:容器:-姓名:mypod.图像:redis.volumeMounts:-姓名:喷火mountPath:“/ etc / foo”卷:-姓名:喷火秘密:secretName:mysecret项目:-关键:用户名路径:我的小组/用户名模式:0777
在本例中,导致/ etc / foo / my-group / my-username
权限值为0777
.如果您使用JSON,由于JSON的限制,您必须指定十进制格式的模式,511
.
请注意,如果稍后阅读,这个权限值可能会以十进制形式显示。
从卷中消耗秘密值
在装载秘密卷的容器中,秘密密钥以文件的形式出现,而秘密值是经过base64解码并存储在这些文件中。这是上面例子中在容器中执行命令的结果:
ls /etc/foo/
输出类似于:
用户名密码
猫/etc/foo/username
输出类似于:
管理
CAT / etc / foo / password
输出类似于:
1 f2d1e2e67df
容器中的程序负责从文件中读取机密信息。
挂载的秘密将自动更新
当更新当前在卷中使用的密钥时,投影密钥最终也会更新。kubelet在每次定期同步时检查挂载的秘密是否新鲜。但是,kubelet使用它的本地缓存来获取Secret的当前值。属性可配置缓存的类型ConfigMapAndSecretChangeDetectionStrategy
田野KubeletConfiguration结构.Secret可以通过watch(默认)、基于ttl传播,也可以直接将所有请求重定向到API服务器。结果,当秘密的总延迟更新的时候新键将舱可以只要kubelet同步周期+缓存传播延迟,缓存的传播延迟取决于所选择的高速缓存类型(等于看传播延迟,ttl的缓存,或相应的零)。
注意:容器使用Secret作为子路径卷mount将不会收到Secret更新。
使用Secrets作为环境变量
在…中使用秘密环境变量在豆荚中:
- 创建一个秘密或使用一个现有的秘密。多个pod可以引用同一个秘密。
- 在希望使用密钥值的每个容器中修改Pod定义,为希望使用的每个密钥添加环境变量。使用密钥的环境变量应该填充密钥的名称和密钥
env [] .valueFrom.secretKeyRef
. - 修改映像和/或命令行,以便程序在指定的环境变量中查找值。
这是一个使用环境变量秘密的Pod示例:
apiVersion:v1种类:圆荚体元数据:姓名:秘密env-pod规范:容器:-姓名:mycontainer图像:redis.env.:-姓名:secret_username.valueFrom:secretKeyRef:姓名:mysecret关键:用户名-姓名:secret_password.valueFrom:secretKeyRef:姓名:mysecret关键:密码重启销售:从来没有
从环境变量中消耗秘密值
在使用环境变量中的秘密的容器中,秘密密钥显示为包含秘密数据的base64解码值的普通环境变量。这是上面例子中在容器中执行命令的结果:
回声SECRET_USERNAME美元
输出类似于:
管理
回声SECRET_PASSWORD美元
输出类似于:
1 f2d1e2e67df
不可变的秘密
Kubernetes v1.19(β)
Kubernetes Beta功能不可变的秘密和ConfigMaps提供一个选项来将单个Secrets和ConfigMaps设置为不可变的。对于广泛使用Secret的集群(至少有数万个唯一的Secret to Pod安装),防止对其数据的更改具有以下优点:
- 保护您免受可能导致应用程序中断的意外(或不想要的)更新
- 通过关闭标记为不可变的秘密的监视,显著降低kube-apiserver上的负载,从而提高集群的性能。
控件控制此特性ImmutableEphemeralVolumes
功能门,从v1.19开始默认启用。您可以通过设置不可变的
字段真正的
.例如,
apiVersion:v1种类:秘密元数据:......数据:......不可变的:真正的
注意:一旦秘密或configmap被标记为不可变,就是不是可以恢复此更改,也无法突变数据
字段。您只能删除和重新创建秘密。现有的pod保持一个挂载点到已删除的Secret—建议重新创建这些pod。
使用imagePullsecrets.
的imagePullsecrets.
字段是对同一命名空间中的秘密的引用列表。你可以用imagePullsecrets.
向kubelet传递一个包含Docker(或其他)映像注册表密码的秘密。kubelet使用这个信息来获取一个代表Pod的私有映像。看到PodSpec API有关的更多信息imagePullsecrets.
字段。
手动指定imagePullSecret
您可以学习如何指定imagePullsecrets.
来自容器图像文档德赢是不是大平台.
安排imagePullSecrets被自动附加
您可以手动创建imagePullsecrets.
,并将其从ServiceAccount引用。使用该ServiceAccount创建或使用该服务默认创建的任何POD都将获得他们的imagePullsecrets.
设置为服务帐户的字段。看到将imagePullsecrets添加到服务帐户查阅该过程的详细说明。
自动安装手动创建的秘密
手动创建的秘密(例如,包含用于访问GitHub帐户的令牌的秘密)可以根据pod的服务帐户自动附加到它们。看到使用PODPRESET将信息注入POD查阅该过程的详细说明。
细节
限制
对Secret卷源进行验证,以确保指定的对象引用实际上指向Secret类型的对象。因此,需要在任何依赖于它的pod之前创建一个秘密。
秘密资源存在于名称空间.只能由相同名称空间中的Pods引用Secrets。
个人秘密的大小限制为1MiB。这是为了防止创建非常大的机密文件,因为这会耗尽API服务器和kubelet内存。然而,创建许多较小的秘密也可能耗尽内存。更全面的内存使用限制是计划中的特性。
kubelet只支持对pod使用秘密,其中秘密是从API服务器获取的。这包括使用kubectl
,或间接通过复制控制器。它不包括由于kubelet而创建的Pods- manifest-url
旗帜,它——配置
标志,或者它的REST API(这些不是创建pod的常用方法)。
除非它们被标记为可选,否则必须在将POD中消耗的池中消耗之前创建秘密。对不存在的秘密的引用将防止POD开始。
引用(secretKeyRef
字段)的密钥不存在的一个命名为秘密将阻止Pod开始。
用于填充环境变量的envFrom
具有被认为是无效的环境变量名称的键的字段将跳过这些键。花苞就可以启动了。会有一个事件,其原因是InvalidVariableNames
该消息将包含被跳过的无效键的列表。示例显示了一个pod,它引用了包含2个无效密钥的默认/mysecret:1 badkey
和2 alsobad
.
kubectl得到事件
输出类似于:
LASTSEEN FIRSTSEEN COUNT NAME KIND subbobject TYPE REASON 0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames kubelet, 127.0.0.1 Keys [1badkey, 2alsobad] from EnvFrom secret default/mysecret被跳过,因为它们被认为是无效的环境变量名。
秘密和Pod终身互动
当通过调用Kubernetes API创建Pod时,不检查是否存在引用的秘密。一旦预定了Pod, kubelet将尝试获取秘密值。如果由于秘密信息不存在或由于与API服务器暂时缺乏连接而无法获取它,kubelet将定期重试。它会报告一个关于花苞的事件,解释为什么它还没有开始。获取秘密后,kubelet将创建并挂载包含它的卷。在所有Pod的卷被安装之前,Pod的所有容器都不会启动。
用例
用例:作为容器环境变量
创造一个秘密
apiVersion:v1种类:秘密元数据:姓名:mysecret类型:不透明的数据:用户名:ywrtaw4 =密码:mwyyzdflmmu2n2rm
创建一个秘密:
kubectl应用-f mysecret.yaml
使用envFrom
将Secret的所有数据定义为容器环境变量。Secret中的键成为Pod中的环境变量名。
apiVersion:v1种类:圆荚体元数据:姓名:secret-test-pod规范:容器:-姓名:测试容器图像:k8s.gcr.io/busybox.命令:[“/ bin / sh”,“c”,“env”]envFrom:-secretRef:姓名:mysecret重启销售:从来没有
用例:带有ssh密钥的Pod
创建一个包含一些ssh密钥的秘密:
Kubectl创建秘密通用ssh-key-secret——from-file=ssh-privatekey=/ /路径。ssh / id_rsa——从文件=ssh-publickey=/ / . ssh / id_rsa . pub /路径
输出类似于:
秘密的“ssh-key-secret”创建
您还可以创建kustomization.yaml
与A.secretGenerator
包含SSH密钥的字段。
警告:在发送您自己的ssh密钥之前,请仔细考虑一下:集群的其他用户可能可以访问这个密钥。使用您希望与您共享Kubernetes集群的所有用户都可以访问的服务帐户,如果用户受到威胁,可以撤销该帐户。
现在,您可以创建一个Pod,它使用ssh密钥引用秘密,并在卷中使用它:
apiVersion:v1种类:圆荚体元数据:姓名:secret-test-pod标签:姓名:secret-test规范:卷:-姓名:secret-volume秘密:secretName:ssh-key-secret容器:-姓名:ssh-test-container图像:MyShimage.volumeMounts:-姓名:secret-volume只读的:真正的mountPath:“/ etc / secret-volume”
当容器的命令运行时,键的片段将可用:
/etc/secret-volume / ssh-publickey /etc/secret-volume / ssh-privatekey
然后,容器可以自由地使用秘密数据来建立SSH连接。
用例:带有prod /测试凭证的pod
这个示例演示了一个Pod,它使用一个包含生产凭据的秘密,另一个Pod使用一个包含测试环境凭据的秘密。
您可以创建kustomization.yaml
与A.secretGenerator
场或运行Kubectl创造秘密
.
kubectl创建秘密通用prod-db-secret --from文字=用户名=本公司——从字面=密码=Y4nys7f11
输出类似于:
秘密的“prod-db-secret”创建
您还可以为测试环境创建一个秘密凭证。
kubectl创建秘密通用测试--fb-secret --from文字=用户名=testuser——从字面=密码=iluvtests
输出类似于:
秘密“test-db-cerfic”创造
注意:特殊字符,如
$
,\
,*
,=
,!
将被你的解释贝壳并需要逃脱。在大多数shell中,逃避密码的最简单方法是用单引号括起来('
).例如,如果您的实际密码是S!B \ * D $ ZDSB =
,你应该这样执行命令:Kubectl创建秘密泛型dev-db-secret——from-literal=用户名=devuser——从字面=密码=“年代!B \ * d zDsb美元= '
您不需要从文件转义密码中的特殊字符(
——从文件
).
现在制作豆荚:
猫<< eof> pod.yamlapiVersion: v1类:列表项目:类型:豆荚apiVersion: v1元数据:名称:prod-db-client-pod标签:名称:prod-db-client规格:卷:- 名称:秘密卷秘密:secretName: prod-db-secret容器:——名称:db-client-container图片:myClientImageVolumeMounts:- 名称:秘密卷只读的:真mountpath:“/ etc / secont-卷”类型:豆荚apiVersion: v1元数据:名称:test-db-client-pod标签:名称:test-db-client规格:卷:- 名称:秘密卷秘密:secretName: test-db-secret容器:——名称:db-client-container图片:myClientImageVolumeMounts:- 名称:秘密卷只读的:真mountpath:“/ etc / secont-卷”EOF
将POD添加到同一个Kustomization.yaml:
猫< < EOF > > kustomization.yaml资源:——pod.yamlEOF
通过运行以下命令在API服务器上应用所有这些对象:
Kubectl应用-k。
这两个容器的文件系统中都有以下文件,以及每个容器的环境值:
/etc/secret-volume /etc/secret-volume /用户名/密码
注意两个豆荚的规格如何仅在一个字段中不同;这有助于从公共吊舱模板创建具有不同功能的豆荚。
您可以通过使用两个服务帐户来进一步简化基本Pod规范:
prod-user
与刺激秘密
测试用户
与test-db-secret
Pod规范简称为:
apiVersion:v1种类:圆荚体元数据:姓名:prod-db-client-pod标签:姓名:prod-db-client规范:serviceAccount:prod-db-client容器:-姓名:db-client-container图像:myClientImage
用例:秘密卷中的dotfiles
您可以通过定义一个以点开头的键来“隐藏”数据。此键代表一个dotfile或“隐藏”文件。例如,当将下列秘密装入一个卷时,secret-volume
:
apiVersion:v1种类:秘密元数据:姓名:dotfile-secret数据:.secret-file:dmfsdwutmg0kdqo =---apiVersion:v1种类:圆荚体元数据:姓名:secret-dotfiles-pod规范:卷:-姓名:secret-volume秘密:secretName:dotfile-secret容器:-姓名:dotfile-test-container图像:k8s.gcr.io/busybox.命令:- - - - - - ls-“-l”-“/ etc / secret-volume”volumeMounts:-姓名:secret-volume只读的:真正的mountPath:“/ etc / secret-volume”
该卷将包含一个名为.secret-file
,dotfile-test-container
将有这个文件出现在路径/etc/secret-volume / .secret-file
.
注意:以点字符开头的文件是隐藏的输出LS -L.
;你必须使用ls -la.
在列出目录内容时查看它们。
用例:对Pod中的一个容器可见的秘密
考虑一个程序,它需要处理HTTP请求,执行一些复杂的业务逻辑,然后使用HMAC对一些消息进行签名。因为它具有复杂的应用程序逻辑,所以服务器中可能存在不被注意的远程文件读取漏洞,这可能会将私钥暴露给攻击者。
这可以分为两个容器中的两个进程:一个前台容器处理用户交互和业务逻辑,但不能看到私钥;以及一个签名者容器,该容器可以看到私钥,并从前端响应简单的签名请求(例如,通过本地主机网络)。
使用这种分区方法,攻击者现在必须诱使应用服务器做一些相当随意的事情,这可能比让它读取文件更困难。
最佳实践
使用秘密API的客户端
当部署与Secret API交互的应用程序时,应该限制访问使用授权政策如RBAC.
秘密通常包含一系列重要的值,其中许多值可能导致Kubernetes内部(例如服务账户令牌)和外部系统的升级。即使一个单独的应用程序可以推理出它期望与之交互的秘密的威力,同一名称空间中的其他应用程序也可以使这些假设失效。
由于这些原因手表
和列表
在名称空间中请求秘密是非常强大的功能,应该避免,因为列出秘密允许客户端检查该名称空间中所有秘密的值。的能力手表
和列表
集群中的所有秘密应该只保留给特权最高的系统级组件。
需要访问Secret API的应用程序应该执行得到
要求提供他们需要的秘密。这使得管理员可以限制对所有机密的访问对单个实例的白名单访问这是应用程序需要的。
用于提高循环的性能得到
,则客户可以设计引用秘密的资源手表
资源,在引用更改时重新请求秘密。此外,一个“大部分手表”API让客户手表
单独的资源也被提出了,并且很可能在Kubernetes的未来版本中可用。
安全属性
保护
因为可以独立于使用它们的Pods创建秘密,所以在创建、查看和编辑Pods的工作流中,秘密暴露的风险更小。系统还可以对Secrets采取额外的预防措施,比如尽可能避免将它们写入磁盘。
如果该节点上的POD需要它,则仅发送到节点的秘密。kubelet将秘密存储成一个TMPFS.
这样秘密就不会被写入磁盘存储。一旦删除了依赖于秘密的Pod, kubelet也将删除秘密数据的本地副本。
在同一节点上可能有几个POD的秘密。然而,只有POD请求在其容器内可能可见的秘密。因此,一个POD无法访问另一个POD的秘密。
在一个Pod中可能有几个容器。但是,Pod中的每个容器都必须请求其中的秘密卷volumeMounts
让它在容器中可见。这可以用来构造有用的Pod级别的安全分区.
在大多数Kubernetes发行版上,用户与API服务器之间以及从API服务器到kubelet之间的通信都受到SSL/TLS的保护。当通过这些通道传输时,秘密是受到保护的。
Kubernetes v1.13(β)
您可以启用加密在休息对于秘密数据,使秘密不存储在明文中ettd..
风险
- 在API服务器中,秘密数据存储在ettd.;因此:
- 管理员应该为集群数据启用静态加密(需要v1.13或更高版本)。
- 管理员应该将etcd的访问权限限制在admin用户。
- 当etcd不再使用时,管理员可能想要擦除/撕碎已使用的磁盘。
- 如果在群集中运行ETCD,则管理员应确保使用SSL / TLS for etcd peer-to-peer通信。
- 如果通过将秘密数据编码为Base64的秘密数据的文件配置秘密,则将此文件共享或检查到源存储库意味着秘密受到损害。Base64编码是不是一种加密方法,被认为与纯文本相同。
- 应用程序仍然需要在从卷读取后保护秘密的值,例如不小心记录它或将其传输给不受信任的派对。
- 可以创建使用secret的Pod的用户也可以看到该secret的值。即使API服务器策略不允许用户读取Secret,用户也可以运行公开秘密的Pod。
- 目前,任何在任何节点上具有root权限的人都可以读取任何通过模拟kubelet,从API服务器中获取秘密。计划中的特性是只向实际需要秘密的节点发送秘密,以限制根漏洞对单个节点的影响。
接下来是什么
- 学习如何使用秘密管理
kubectl
- 学习如何使用配置文件管理秘密
- 学习如何使用Kustomize管理秘密