generic
这里将分作两部分讨论,第一部分是将数据传入generic类型的Secret,即创建Secret,第二部分是将数据从Secret中传入容器中(以环境变量的方式、以文件的形式)。
该类型的Secret的secret.type=Opaque
。
配置传入Secret
数据传入Secret的过程,即创建Secret的过程,在创建时,可以将需要传给Pod中容器的信息以键/值对的形式写入Secret中。
创建Secret与ConfigMap同样有两种方式:
使用指令创建(优选);
使用配置文件创建;
使用命令创建
在使用kubectl create secret generic
创建generic类型的Secret时,可以通过不同的参数,以不同的方式向其中写入数据:
--from-literal
:最普通的写入方式,值为简单的字面量:例如,创建一个名为
mysecret
的Secret,其包含username=admin
、password=123456
两个条目:--from-env-file
:后面跟的是文件名,文件中存放的是键/值对形式的条目,它们会被批量传入Secret中:--from-file
:将文件内容作为值写入:例如,创建一个名为
mysecret
的generic类型的Secret,其包含的文件内容为username.conf
中的内容,其键为username.conf
(因为不自定义的关系,所以默认与文件名一致):当然,也可以手动指定键。例如,指定键名为
username
:
使用配置文件创建
Secret的配置文件非常简单,需要写入的数据都被存放在了secret.data
中,下面展示一个案例:
从Secret中读取数据
Pod中的容器想要从Secret中读取数据,与ConfigMap类似,同样有两种方式:
读取为环境变量(不推荐):分为读取单个条目和读取所有条目两种方式;
读取为文件:将Secret以卷的方式挂载,进而从中读取数据;
读取为环境变量
再次申明,将Secret中的数据读取为环境变量的方式,不推荐!!!若想读取为环境变量,还是推荐使用ConfigMap。
读取单个条目
读取单个条目,是通过Pod的配置文件中的spec.env.valueFrom.secretKeyRef
进行配置,从而从Secret中读取指定的条目,作为环境变量。
例如,为容器创建一个键为FOO_SECRET
的环境变量,其值引用的是名为fortune-https
的Secret中的键为foo
的条目的值:
读取所有条目
读取所有条目,是通过Pod的配置文件中的spec.containers.envFrom.secretRef
进行配置,从而从Secret中读取所有的条目,作为环境变量。
如果Secret中某键名不符合环境变量的键名格式,那么在创建环境变量时,会自动忽略对应的条目。
例如,容器从名为fortune-https
的Secret中读取所有条目作为环境变量:
通过指定spec.containers.envFrom.prefix
可以为读入的所有环境变量添加前缀,比如Secret中包含键为FOO
、BAR
的两个条目,那么可以通过下面这种方式添加前缀CONFIG_
,令读入容器中的环境变量变成CONFIG_FOO
、CONFIG_BAR
:
读取为文件
在挂载至容器后,默认情况下,容器会将Secret中的条目的键作为文件名,将条目的值作为文件内容,且在读取内容时会自动将其Base64解码。
因为Secret中具有多个条目,因此可以通过在pod.spec.volumes.secret.items
中进行指定单独挂载的文件。
挂载所有文件
将Secret作为卷挂载,需要下面两步:
定义卷:在
spec.volumes.secret
中指定secretName
为预先创建好的Secret资源的名字,即与Secret资源相关联;挂载卷:在Pod的
spec.containers.volumeMounts
中指定挂载点和挂载的卷名;
下面举一个例子,在容器的/etc/nginx/certs/
下挂载一个名为certs
的Secret卷,该卷与名为fortune-https
的Secret相关联,容器会将该Secret中的所有条目,以条目的键为文件名,值的Base64解码作为文件内容,在挂载点中创建这些文件:
挂载指定文件
同样,挂载卷的方式可以只挂载部分文件,而不是将Secret中的所有文件都挂载进Pod。有两种方法可以实现:
优点:挂载点中原本存在的文件不会被隐藏;
缺点:应用于Secret卷时,被挂载的文件不会随着Secret中条目的更新而更新;
利用
spec.volumes.secret.items
在定义卷时,指定需要被挂载至卷中的条目;缺点:挂载点中原本存在的文件会被隐藏;
这里针对第二种方法进行详细介绍。
下面举一个例子,在容器的/etc/nginx/certs/
下挂载一个名为certs
的Secret卷,该卷与名为fortune-https
的Secret相关联,容器会将该Secret中的键为username.conf
的条目,更名为username
,将条目的值Base64解码后,在挂载点中创建该文件:
Last updated
Was this helpful?