您正在查看Kubernetes版德赢是不是大平台本:v1.19的文档

Kubernetes v1.19文德赢是不是大平台档不再被积极维护。您当前查看的版本是一个静态快照。有关最新的文档,请参阅德赢是不是大平台最新版本。

秘密

Kubernetes Secrets允许存储和管理敏感信息,如密码、OAuth令牌和ssh密钥。将机密信息存储在Secret中比将其逐字保存在圆荚体定义或在容器的形象.看到秘密设计文档为更多的信息。

Secret是包含少量敏感数据(如密码、令牌或密钥)的对象。否则,这些信息可能会放在Pod规范或图像中。用户可以创建Secrets,系统也会创建一些Secrets。

秘密概述

要使用秘密,POD需要引用秘密。秘密可以用三种方式与豆荚一起使用:

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:

apiVersionv1种类秘密元数据姓名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类型的秘密:

apiVersionv1种类秘密元数据姓名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-emailtiger@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是基本身份验证秘密的示例配置:

apiVersionv1种类秘密元数据姓名秘密基础 -  auth类型www.amasoeur.com /基本认证stringdata.用户名管理密码t0p-cleise.

提供基本的认证Secret类型只是为了方便用户。您可以创建不透明的对于用于基本身份验证的凭据。但是,使用内置的Secret类型有助于统一凭证的格式,API服务器会验证是否在Secret配置中提供了所需的密钥。

SSH身份验证的秘密

内装式类型Kubernetes.io/ssh-auth.提供用于存储SSH身份验证中使用的数据。使用此秘密类型时,您将必须指定一个ssh-privatekey中的键值对数据(或stringdata.字段作为要使用的SSH凭据。

下面的YAML是一个SSH认证Secret的配置示例:

apiVersionv1种类秘密元数据姓名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.keytls.crt.必须提供钥匙数据(或stringdata.)字段,尽管API服务器并不实际验证每个密钥的值。

以下yaml包含TLS秘密的示例配置:

apiVersionv1种类秘密元数据姓名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可能如下所示:

apiVersionv1种类秘密元数据姓名bootstrap-token-5emitj名称空间kube-system类型bootstrap.www.amasoeur.com /令牌数据auth-extra-groupsc3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4 =过期mjaymc0wos0xm1qwndozotoxmfo =token-idNWVtaXRq令牌机密a3E0Z2lodnN6emduMXAwcg = =usage-bootstrap-authenticationdHJ1ZQ = =usage-bootstrap-signingdHJ1ZQ = =

Bootstrap类型秘密具有指定的以下键数据

  • token_id:作为令牌标识符的随机字符串。必需的。
  • 令牌机密:一个随机的16个字符串作为实际的令牌秘密。必需的。
  • 描述:人类可读的字符串,描述令牌的用途。可选的。
  • 过期:绝对UTC时间,使用RFC3339指定token应该过期的时间。可选的。
  • usage-bootstrap——<用法>:一个布尔标志,指示引导令牌的额外使用。
  • auth-extra-groups:一个用逗号分隔的组名列表,将通过身份验证系统:bootstrepers.组。

上面的YAML可能看起来令人困惑,因为值都是base64编码的字符串。事实上,您可以使用以下YAML创建一个相同的Secret:

apiVersionv1种类秘密元数据#注意秘密是如何命名的姓名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

这将打开默认配置的编辑器,并允许更新数据场地:

#请编辑下面的对象。从'#'开始的线将被忽略,#和空文件将中止编辑。如果保存此文件时发生错误将是#重新与相关的失败。apiVersionv1数据用户名ywrtaw4 =密码mwyyzdflmmu2n2rm种类秘密元数据注释kubectl.www.amasoeur.com / last-applied-configuration......creationTimestamp2016-01-22T18:41:56z姓名mysecret名称空间默认的resourceVersion“164619”uidcfee02d6-c137-11 e5-8D73-42010AF00002.类型不透明的

使用的秘密

秘密可以作为数据卷挂载,也可以作为环境变量由Pod中的容器使用。秘密也可以被系统的其他部分使用,而不会直接暴露给Pod。例如,Secrets可以持有凭证,系统的其他部分应该使用这些凭证代表您与外部系统进行交互。

将Secrets作为Pod中的文件使用

在一个Pod中消耗一个卷中的秘密:

  1. 创建一个秘密或使用一个现有的秘密。多个pod可以引用同一个秘密。
  2. 修改Pod定义以在下面添加卷.spec.volumes [].任意命名音量,并有一个.spec.volumes [] .secret.secretName字段等于Secret对象的名称。
  3. 添加A..spec.containers [] .volumeMounts []每个需要秘密的容器。指定.spec.containers [] .volumeMounts[]。只读的= true.spec.containers [] .volumeMounts [] .mountPath到您希望在其中显示秘密的未使用的目录名。
  4. 修改映像或命令行,以便程序在该目录中查找文件。每把钥匙都是秘密数据Map变成mountPath

这是一个在卷中装载秘密的Pod的例子:

apiVersionv1种类圆荚体元数据姓名mypod.规范容器-姓名mypod.图像redis.volumeMounts-姓名喷火mountPath“/ etc / foo”只读的真正的-姓名喷火秘密secretNamemysecret

每个你想要使用的秘密需要被引用.spec.volumes

如果Pod中有多个容器,那么每个容器都需要有自己的容器volumeMounts积木,但只有一个.spec.volumes每个秘密都需要。

您可以将多个文件打包到一个秘密文件中,或者使用多个秘密文件,以方便的方式选择。

将秘密密钥投影到特定路径

您还可以控制投影秘密密钥的卷中的路径。你可以使用.spec.volumes [] .secret.items字段更改每个密钥的目标路径:

apiVersionv1种类圆荚体元数据姓名mypod.规范容器-姓名mypod.图像redis.volumeMounts-姓名喷火mountPath“/ etc / foo”只读的真正的-姓名喷火秘密secretNamemysecret项目-关键用户名路径我的小组/用户名

会发生什么:

  • 用户名秘密保存在/ etc / foo / my-group / my-username文件而不是/ etc / foo /用户名
  • 密码秘密不是投射出来的。

如果.spec.volumes [] .secret.items,只有在项目预计。要使用密钥中的所有密钥,必须在项目字段。所有列出的密钥必须存在于相应的秘密中。否则,卷不会创建。

秘密文件权限

您可以为单个Secret密钥设置文件访问权限位。如果您没有指定任何权限,0644.默认使用。您还可以为整个Secret卷设置默认模式,并在需要时覆盖每个密钥。

例如,你可以像这样指定一个默认模式:

apiVersionv1种类圆荚体元数据姓名mypod.规范容器-姓名mypod.图像redis.volumeMounts-姓名喷火mountPath“/ etc / foo”-姓名喷火秘密secretNamemysecretdefaultMode0400.

然后,秘密将被安装/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

您还可以使用映射,如前面的示例中,并为这样的不同文件指定不同的文件:

apiVersionv1种类圆荚体元数据姓名mypod.规范容器-姓名mypod.图像redis.volumeMounts-姓名喷火mountPath“/ etc / foo”-姓名喷火秘密secretNamemysecret项目-关键用户名路径我的小组/用户名模式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作为环境变量

在…中使用秘密环境变量在豆荚中:

  1. 创建一个秘密或使用一个现有的秘密。多个pod可以引用同一个秘密。
  2. 在希望使用密钥值的每个容器中修改Pod定义,为希望使用的每个密钥添加环境变量。使用密钥的环境变量应该填充密钥的名称和密钥env [] .valueFrom.secretKeyRef
  3. 修改映像和/或命令行,以便程序在指定的环境变量中查找值。

这是一个使用环境变量秘密的Pod示例:

apiVersionv1种类圆荚体元数据姓名秘密env-pod规范容器-姓名mycontainer图像redis.env.-姓名secret_username.valueFromsecretKeyRef姓名mysecret关键用户名-姓名secret_password.valueFromsecretKeyRef姓名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开始默认启用。您可以通过设置不可变的字段真正的.例如,

apiVersionv1种类秘密元数据......数据......不可变的真正的
注意:一旦秘密或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 badkey2 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的所有容器都不会启动。

用例

用例:作为容器环境变量

创造一个秘密

apiVersionv1种类秘密元数据姓名mysecret类型不透明的数据用户名ywrtaw4 =密码mwyyzdflmmu2n2rm

创建一个秘密:

kubectl应用-f mysecret.yaml

使用envFrom将Secret的所有数据定义为容器环境变量。Secret中的键成为Pod中的环境变量名。

apiVersionv1种类圆荚体元数据姓名secret-test-pod规范容器-姓名测试容器图像k8s.gcr.io/busybox.命令“/ bin / sh”“c”“env”envFrom-secretRef姓名mysecret重启销售从来没有

用例:带有ssh密钥的Pod

创建一个包含一些ssh密钥的秘密:

Kubectl创建秘密通用ssh-key-secret——from-filessh-privatekey/ /路径。ssh / id_rsa——从文件ssh-publickey/ / . ssh / id_rsa . pub /路径

输出类似于:

秘密的“ssh-key-secret”创建

您还可以创建kustomization.yaml与A.secretGenerator包含SSH密钥的字段。

警告:在发送您自己的ssh密钥之前,请仔细考虑一下:集群的其他用户可能可以访问这个密钥。使用您希望与您共享Kubernetes集群的所有用户都可以访问的服务帐户,如果用户受到威胁,可以撤销该帐户。

现在,您可以创建一个Pod,它使用ssh密钥引用秘密,并在卷中使用它:

apiVersionv1种类圆荚体元数据姓名secret-test-pod标签姓名secret-test规范-姓名secret-volume秘密secretNamessh-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规范:

  1. prod-user刺激秘密
  2. 测试用户test-db-secret

Pod规范简称为:

apiVersionv1种类圆荚体元数据姓名prod-db-client-pod标签姓名prod-db-client规范serviceAccountprod-db-client容器-姓名db-client-container图像myClientImage

用例:秘密卷中的dotfiles

您可以通过定义一个以点开头的键来“隐藏”数据。此键代表一个dotfile或“隐藏”文件。例如,当将下列秘密装入一个卷时,secret-volume

apiVersionv1种类秘密元数据姓名dotfile-secret数据.secret-filedmfsdwutmg0kdqo =---apiVersionv1种类圆荚体元数据姓名secret-dotfiles-pod规范-姓名secret-volume秘密secretNamedotfile-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服务器中获取秘密。计划中的特性是只向实际需要秘密的节点发送秘密,以限制根漏洞对单个节点的影响。

接下来是什么

最后修改:2020年12月10日晚8:23太平洋标准时间:修复最新参数(6fa51f75a)