使用环境变量引用私钥和配置映射 (CLI)
在 Code Engine中,创建私钥和 configmap 后,存储为“键/值”对的信息可由应用程序,作业或作为环境变量的函数工作负载通过引用完整私钥或 configmap 或引用个别密钥来使用。
使用私钥作为环境变量类似于使用 configmap 作为环境变量。 使用私钥时,会对数据进行编码。
更新具有引用 configmap 或 secret 的环境变量的应用程序,作业或函数时,请考虑以下信息。
- 当您更新具有完全引用 configmap (或私钥) 的环境变量的应用程序,作业或函数以完全引用其他 configmap (或私钥) 时,完全引用将按设置顺序覆盖其他完整引用 (最后引用的集合将覆盖第一个集合)。
- 当您更新具有环境变量的应用程序,作业或函数,该环境变量引用了一个 configmap (或私钥) 中的密钥以引用另一个 configmap (或私钥) 中的相同密钥时,将使用最后引用的密钥。
- 更新具有完全引用 configmap (或 secret) 的环境变量的应用程序,作业或函数以添加对特定密钥的引用时,特定密钥引用将覆盖完整 configmap (或 secret) 引用。
有关使用 CLI 引用配置映射或私钥的基本信息,请参阅 使用 CLI 引用配置映射 和 使用 CLI 引用私钥。
可以针对私钥或配置映射完成以下场景。
使用 CLI 引用完整私钥
私钥和配置映射由键/值对组成。 环境变量是在引用完整密钥或 configmap 时按密钥提供条目的结果。 如果多个私钥 (或 configmap) 包含相同的指定密钥,那么您只会在引用的私钥或 configmap 中获取其中一个密钥。
在此场景中,创建包含用户名和密码的“键/值”对的私钥,然后在运行作业时引用完整私钥。 您可以更新密钥以添加密钥,然后演示在作业中使用新密钥。 当此场景使用私钥时,您可以通过在命令中替换 configmap
以使用相同的步骤来完全引用 configmap。secret
-
创建
mydatabasesec
私钥,并使用--from-literal
选项为用户名和密码指定“键/值”对。ibmcloud ce secret create -n mydatabasesec --from-literal username=reader --from-literal password=abcd
-
使用
secret get
命令查看有关mydatabasesec
私钥的详细信息。 将对密钥的password
和username
密钥的值进行编码。ibmcloud ce secret get -n mydatabasesec
示例输出
Getting generic secret 'mydatabasesec'... OK Name: mydatabasesec ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 17s Created: 2020-10-14 14:07:59 -0400 EDT Data: --- password: YWJjZA== username: cmVhZGVy
-
在作业上设置环境变量以引用完整的
mydatabasesec
私钥。 在此示例中,让我们使用--env-from-secret PREFIX=NAME
选项,其中PREFIX=NAME
指定引用完整的 configmap,其中每个键都以PREFIX
作为前缀。 通过使用read_
前缀,每个键都以read_
作为前缀。 因为缺省情况下busybox
映像不会打印任何输出,所以-c env
选项指定打印容器中的所有环境变量。ibmcloud ce job create -n demo -i busybox -c env --env-from-secret read_=mydatabasesec
请考虑使用前缀来帮助确保作业或应用程序中的所有环境变量都是唯一的。 例如,如果您有包含密钥
a
,b
和c
的私钥,那么这些环境变量将显示为a
,b
和c
。 但是,如果添加前缀 (例如read_
),那么键将与前缀 (例如read_a
,read_b
和read_c
) 一起显示。 使用前缀还会对引用应用程序,作业或作业运行中的环境变量进行分组,并帮助您避免配置映射或私钥中的键重复。 -
(可选) 查看
demo
作业的详细信息。 输出将显示对mydatabasesec
私钥的完整引用。ibmcloud ce job get -n demo
示例输出
Getting job 'demo'... OK Name: demo ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 6s Created: 2022-05-04T15:04:16-04:00 Commands: env Environment Variables: Type Name Value Secret full reference read_=mydatabasesec Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3
-
运行使用
demo
作业配置的作业。ibmcloud ce jobrun submit --name demo1 --job demo
-
显示作业运行的日志。 您可以显示作业运行的所有实例的日志,也可以显示作业运行的特定实例的日志。 在此示例中,显示
demo1
作业运行的日志。 请注意,日志输出中显示了带有前缀read_
的完整密钥mydatabasesec
的密钥。 将私钥值添加到已解码的环境中。ibmcloud ce jobrun logs --jobrun demo1
示例输出
Getting logs for all instances of job run 'demo1'... Getting jobrun 'demo1'... Getting instances of jobrun 'demo1'... [...] HOSTNAME=demo1-0-0 read_username=reader read_password=abcd JOB_INDEX=0 CE_SUBDOMAIN=8aaon2dfwa0 CE_JOBRUN=demo1 [...]
-
使用
--from-file
选项更新mydatabasesec
私钥以添加密钥。 此选项使用格式--from-file FILE
或--from-file KEY=FILE
。 在以下命令中,certificate
是密钥,cert.pem
是文件的名称。ibmcloud ce secret update -n mydatabasesec --from-file certificate=cert.pem
-
使用
secret get
命令查看有关已更新的mydatabasesec
私钥的详细信息。 该私钥现在包含三个密钥:certificate
,password
和username
。 将对私钥值进行编码。ibmcloud ce secret get -n mydatabasesec
示例输出
Getting generic secret 'mydatabasesec'... OK Name: mydatabasesec ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 4m13s Created: 2020-10-14 13:35:43 -0400 EDT Data: --- certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tLS0tDQphc2RmO2Frc2pkZmxrYWpzZGZsa2phc2xka2ZqYWxza2RqZmxha3NqZGZsaw0KLS0tLS1FTkQgQ0VSVEZJQ0lBVEUtLS0tLS0tLS0t password: YWJjZA== username: cmVhZGVy
-
运行使用
demo
作业的作业。 先前,您从demo
作业引用了完整私钥mydatabasesec
。 要使作业将更新后的私钥与添加的certificate
键/值对配合使用,请提交新的作业运行。 要更新应用程序以使用更新后的私钥,请重新启动应用程序。ibmcloud ce jobrun submit --name demo2 --job demo
-
使用
ibmcloud ce jobrun logs
命令显示作业运行的日志。 您可以显示作业运行的所有实例的日志,也可以显示作业运行的特定实例的日志。 要显示作业运行的特定实例的日志,请将--instance
选项与jobrun logs
命令配合使用。 如果需要,请使用jobrun get --name demo2
命令来显示此作业运行的详细信息,包括作业运行的实例。 在此示例中,显示正在运行的demo2-0-0
实例的日志,其中demo2
是作业运行的名称,0
是arrayindex
,0
是retryindex
。 请注意,输出中显示了certificate
,username
和password
完整密钥的密钥mydatabasesec
。 将私钥值添加到已解码的环境中。
ibmcloud ce jobrun logs --instance demo2-0-0
示例输出
Getting logs for job run instance 'demo2-0-0'...
[...]
read_certificate=-----BEGIN CERTIFICATE--------
asdf;aksjdflkajsdflkjasldkfjalskdjflaksjdflk
-----END CERTFICIATE----------
read_password=abcd
read_username=reader
使用 CLI 引用 configmap 的各个密钥
在此场景中,让我们创建一个包含多个键/值对的 configmap,然后引用作业中的特定键。 当此场景使用 configmap 时,您可以使用相同的常规步骤通过在命令中替换 secret
for configmap
来引用具有私钥的各个密钥。
-
创建
mydatabase
configmap,并使用--from-literal KEY=VALUE
选项为名称和 URL 指定“键/值”对。ibmcloud ce configmap create -n mydatabasecm --from-literal name=myname --from-literal url=myurl
-
使用
configmap get
命令查看有关mydatabasecm
configmap 的详细信息。ibmcloud ce configmap get -n mydatabasecm
示例输出
Getting configmap 'mydatabasecm'... OK Name: mydatabasecm ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 16s Created: 2020-10-14 13:31:19 -0400 EDT Data: --- name: myname url: myurl
-
在作业上设置环境变量以引用
mydatabasecm
configmap 中的url
键。 使用--env-from-configmap NAME:KEY_A,KEY_B
选项,其中NAME:KEY_A
指定引用 configmap 的KEY_A
。ibmcloud ce job create --name keydemo --image busybox --command env --env-from-configmap mydatabasecm:url
-
运行使用
keydemo
作业的作业。ibmcloud ce jobrun submit --name keydemo1 --job keydemo
-
使用
ibmcloud ce jobrun logs
命令显示作业运行的日志。 您可以显示作业运行的所有实例的日志,也可以显示作业运行的特定实例的日志。 要显示作业运行的特定实例的日志,请将--instance
选项与jobrun logs
命令配合使用。 如果需要,请使用jobrun get --name keydemo1
命令来显示此作业运行的详细信息,包括作业运行的实例。 请注意,输出中的url
是唯一引用的键,并且作业未引用name
键。ibmcloud ce jobrun logs --instance keydemo1-0-0
示例输出
Getting logs for job run instance 'keydemo1-0-0'... [...] url=myurl [...]
使用 CLI 覆盖引用
您可以覆盖引用的私钥和配置映射。 可以针对私钥或配置映射完成以下场景。
场景 A。 使用另一个完全引用的私钥覆盖完全引用的私钥
在此场景中,我们将使用 username
和 password
密钥创建新的 mydatabasesec-writer
密钥,然后覆盖先前创建的 mydatabasesec
密钥中的 username
和 password
密钥。 mydatabasesec
私钥包含 username=reader
和 password=abcd
密钥。
完整引用将按设置顺序覆盖其他完整引用 (最后引用的集合将覆盖第一个集合)。
-
在
writerjob
作业上设置环境变量以引用先前创建的完整mydatabasesec
私钥。mydatabasesec
私钥包含username=reader
和password=abcd
密钥。ibmcloud ce job create -n writerjob -i busybox -c env --env-from-secret mydatabasesec
-
(可选) 查看
writerjob
作业的详细信息。 输出将显示对mydatabasesec
私钥的完整引用。ibmcloud ce job get -n writerjob
示例输出
Getting job 'writerjob'... OK Name: writerjob ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 17s Created: 2021-02-12T07:12:08-06:00 [...] Commands: env Environment Variables: Type Name Value Secret full reference mydatabasesec Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3
-
运行使用
writerjob
作业的作业。ibmcloud ce jobrun submit --name writerjob1 --job writerjob
-
显示作业运行的日志。 您可以显示作业运行的所有实例的日志,也可以显示作业运行的特定实例的日志。 在此示例中,显示
writerjob1
作业运行的日志。 请注意,输出中显示了完整密钥mydatabasesec
的username
和password
密钥。 将私钥值添加到已解码的环境中。ibmcloud ce jobrun logs --jobrun writerjob1
示例输出
Getting jobrun 'writerjob1'... Getting instances of jobrun 'writerjob1'... Getting logs for all instances of job run 'writerjob1'... OK [...] certificate=-----BEGIN CERTIFICATE-------- asdf;aksjdflkajsdflkjasldkfjalskdjflaksjdflk -----END CERTFICIATE---------- password=abcd username=reader [...]
-
创建
mydatabasesec-writer
私钥,并使用--from-literal
选项为用户名和密码指定“键/值”对。ibmcloud ce secret create --name mydatabasesec-writer --from-literal username=writer --from-literal password=wxyz
-
使用
secret get
命令查看有关mydatabasesec-writer
私钥的详细信息。 将对密钥的password
和username
密钥的值进行编码。ibmcloud ce secret get -n mydatabasesec-writer
示例输出
Getting generic secret 'mydatabasesec-writer'... OK Name: mydatabasesec-writer ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 14s Created: 2020-10-14 13:44:16 -0400 EDT Data: --- password: d3h5eg== username: d3JpdGVy
-
更新
writerjob
作业以引用完整mydatabasesec-writer
私钥,并使用write_
前缀。ibmcloud ce job update --name writerjob --env-from-secret write_=mydatabasesec-writer
-
(可选) 查看已更新的
writerjob
作业的详细信息。 作业完全引用mydatabasesec
和mydatabase-writer
私钥。ibmcloud ce job get -n writerjob
示例输出
Getting job 'writerjob'... OK Name: writerjob ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 4m2s Created: 2021-02-12T07:12:08-06:00 [...] Commands: env Environment Variables: Type Name Value Secret full reference mydatabasesec Secret full reference write_=mydatabasesec-writer Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3
-
运行使用
writerjob
作业的作业。 由于writerjob
作业已更新为同时引用mydatabasesec
私钥和mydatabasesec-writer
私钥,并且这两个私钥都包含username
和password
的密钥,因此最后引用的完整私钥mydatabasesec-writer
将覆盖mydatabasesec
私钥。要使作业运行将作业的更新配置与对其完全引用的私钥的更新配合使用,请运行新作业。 要更新应用程序以使用更新后的私钥,请重新启动应用程序。
ibmcloud ce jobrun submit --name writerjob2 --job writerjob
-
使用
ibmcloud ce jobrun logs
命令显示作业运行的日志。 您可以显示作业运行的所有实例的日志,也可以显示作业运行的特定实例的日志。 要显示作业的所有实例的日志,请将--jobrun
选项与jobrun logs
命令配合使用。 要显示作业运行的特定实例的日志,请将--instance
选项与jobrun logs
命令配合使用。 如果需要,请使用jobrun get --name writerjob2
命令来显示此作业运行的详细信息,包括作业运行的实例。 请注意,在输出中,mydatabasesec-writer
私钥的username
和password
密钥会覆盖mydatabasesec
私钥的密钥。 此外,在日志输出中,将显示带有前缀write_
的完整密钥mydatabasesec-writer
的密钥。将 Secret 值添加到已解码的环境中。
ibmcloud ce jobrun logs --instance writerjob2-0-0
示例输出
Getting logs for job run instance 'writerjob2-0-0'...
[...]
certificate=-----BEGIN CERTIFICATE--------
asdf;aksjdflkajsdflkjasldkfjalskdjflaksjdflk
-----END CERTFICIATE----------
password=abcd
username=reader
write_password=wxyz
write_username=writer
[...]
方案 B。 使用密钥引用覆盖完全引用的私钥
当使用的密钥位于完全引用的私钥或 configmap 中时,对私钥或 configmap 中的密钥的引用始终会覆盖对私钥或 configmap 的完整引用,而不考虑顺序。
在此场景中,让我们使用先前创建的 mydatabasesec
和 mydatabasesec-writer
私钥以及来自作业的私钥中的引用键。
-
在
writerpic
作业上设置环境变量以引用mydatabasesec
和mydatabasesec-writer
私钥中的特定密钥。mydatabasesec
私钥包含username=reader
,password=abcd
和certificate=cert.pem
密钥。mydatabasesec-writer
私钥包含username=writer
和password=wxyz
密钥。ibmcloud ce job create -n writerpick -i busybox -c env --env-from-secret mydatabasesec-writer:username --env-from-secret mydatabasesec-writer:password --env-from-secret mydatabasesec
-
(可选) 查看
writerpick
作业的详细信息。 输出显示对mydatabasesec
私钥的完整引用以及对mydatabasesec-writer
私钥的password
和username
密钥的密钥引用。ibmcloud ce job get -n writerpick
示例输出
Getting job 'writerpick'... OK Name: writerpick ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 107s Created: 2021-02-12T07:16:46-06:00 [...] Commands: env Environment Variables: Type Name Value Secret full reference mydatabasesec Secret key reference password mydatabasesec-writer.password Secret key reference username mydatabasesec-writer.username Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3
-
运行使用
writerpick
作业的作业。ibmcloud ce jobrun submit --name writerpick1 --job writerpick
-
使用
ibmcloud ce jobrun logs
命令显示writerpick1
作业运行的日志。 您可以显示作业运行的所有实例的日志,也可以显示作业运行的特定实例的日志。 要显示作业运行的特定实例的日志,请将--instance
选项与jobrun logs
命令配合使用。 如果需要,请使用jobrun get --name writerpick1
命令来显示此作业运行的详细信息,包括作业运行的实例。 由于writerpick
作业已更新为引用mydatabasesec-writer
私钥中的特定密钥以及引用完整mydatabasesec
私钥,因此对mydatabasesec-writer
私钥中的username
和password
密钥的引用将覆盖对完整私钥的引用。 将私钥值添加到已解码的环境中。ibmcloud ce jobrun logs --instance writerpick1-0-0
示例输出
Getting logs for job run instance 'writerpick1-0-0'... [...] username=writer certificate=-----BEGIN CERTIFICATE-------- asdf;aksjdflkajsdflkjasldkfjalskdjflaksjdflk -----END CERTFICIATE---------- password=wxyz [...]
场景 C。 使用新密钥覆盖密钥引用
您可以更新对私钥或 configmap 中特定密钥的引用,并使用新值覆盖该值。
在此场景中,让我们使用先前创建的 mydatabasecm
configmap,其中包含用于更新密钥值的 url:myurl
密钥。
-
在
keyref
作业上设置环境变量以引用mydatabasecm
configmap 中的特定键。ibmcloud ce job create -n keyref -i busybox -c env --env-from-configmap mydatabasecm:url
-
(可选) 查看
keyref
作业的详细信息。 输出将显示对mydatabasecm
configmap 中的url
键的键引用。ibmcloud ce job get -n keyref
示例输出
Getting job 'keyref'... OK Name: keyref ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 65s Created: 2021-02-12T07:18:44-06:00 [...] Commands: env Environment Variables: Type Name Value ConfigMap key reference url mydatabasecm.url Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3
-
运行使用
keyref
作业的作业。ibmcloud ce jobrun submit --name keyref1 --job keyref
-
使用
ibmcloud ce jobrun logs
命令显示正在运行的keyref1
作业实例的日志。 您可以显示作业运行的所有实例的日志,也可以显示作业运行的特定实例的日志。 要显示作业运行的特定实例的日志,请将--instance
选项与jobrun logs
命令配合使用。 如果需要,请使用jobrun get --name keyref1
命令来显示此作业运行的详细信息,包括作业运行的实例。 作业运行使用了url=myurl
密钥引用。ibmcloud ce jobrun logs --instance keyref1-0-0
示例输出
Getting logs for job run instance 'keyref1-0-0'... [...] url=myurl [...]
-
更新
keyref
作业以使用新密钥覆盖url=myurl
。 使用--env
选项来更新url
密钥。job update
命令上的--env
选项以NAME=VALUE
格式设置作业的环境变量。ibmcloud ce job update --name keyref --env url=newurl
-
(可选) 查看
keyref
作业的详细信息。 输出将显示对mydatabasecm
configmap 中的url
键的键引用。ibmcloud ce job get -n keyref
示例输出
Getting job 'keyref'... OK Name: keyref ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 3m6s Created: 2021-02-12T07:18:44-06:00 Commands: env Environment Variables: Type Name Value Literal url newurl Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3
使用 CLI 除去完全引用的私钥或配置映射
您可以从作业或应用程序中除去完全引用的私钥或配置映射。
在此场景中,让我们从 demo
作业中除去完全引用的 mydatabasesec
私钥。
-
更新
demo
作业以除去对mydatabasesec
私钥的引用。ibmcloud ce job update -n demo --env-from-secret-rm mydatabasesec
-
查看
demo
作业的详细信息。 输出说明已除去对mydatabasesec
私钥的引用。ibmcloud ce job get -n demo
示例输出
Getting job 'demo'... OK Name: demo ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 19m Created: 2021-02-12T07:05:23-06:00 [...] Commands: env Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3
使用 CLI 除去密钥引用
您可以从作业或应用程序中除去私钥或配置映射中引用的密钥。
在此场景中,让我们从 keyref
作业中除去 url
键。
即使在作业上使用了 --env-from-configmap
选项来引用 mydatabasecm
configmap 中的 url
键,您也可以使用 --env-rm
选项来除去各个键。 您可以将 --env-rm
选项与 job update
或 app update
命令配合使用,以除去密钥引用,而无论密钥是私钥或 configmap 中的个别密钥引用,还是直接在作业或应用程序上使用 --env
选项设置密钥。
-
更新
keydef
作业以除去对url
键的引用。ibmcloud ce job update --name keyref --env-rm url
-
查看
keyref
作业的详细信息。 输出说明已除去对url
键的引用。ibmcloud ce job get -n keyref
示例输出
Getting job 'keyref'... OK Name: keyref ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f Project Name: myproject Project ID: 01234567-abcd-abcd-abcd-abcdabcd1111 Age: 6m27s Created: 2021-02-12T07:18:44-06:00 [...] Commands: env Image: busybox Resource Allocation: CPU: 1 Memory: 4G Runtime: Mode: task Array Indices: 0 Array Size: 1 Max Execution Time: 7200 Retry Limit: 3