调试Kubernetes秘密中不必要的换行符
我有一个名为调试Kubernetes秘密中不必要的换行符,kubernetes,base64,Kubernetes,Base64,我有一个名为GOOGLE\u MAPS\u DIRECTIONS\u API\u KEY的环境变量,由Kubernetes secretYAML填充: apiVersion: v1 kind: Secret metadata: name: google-maps-directions-api-secret type: Opaque data: GOOGLE_MAPS_DIRECTIONS_API_KEY: QUl...QbUpqTHNJ 这个秘密是通过在我的API密钥上复制粘贴运行ec
GOOGLE\u MAPS\u DIRECTIONS\u API\u KEY
的环境变量,由Kubernetes secretYAML
填充:
apiVersion: v1
kind: Secret
metadata:
name: google-maps-directions-api-secret
type: Opaque
data:
GOOGLE_MAPS_DIRECTIONS_API_KEY: QUl...QbUpqTHNJ
这个秘密是通过在我的API密钥上复制粘贴运行echo-n“AIz…”base64
的结果创建的。我在这个代码片段中提供了密钥的开头和结尾,以表明机密文件中包含的密钥中没有换行符
下面是我运行cat google-maps-directions-api-key-secret.yaml | hextump-C
时看到的内容:
00000000 61 70 69 56 65 72 73 69 6f 6e 3a 20 76 31 0a 6b |apiVersion: v1.k|
00000010 69 6e 64 3a 20 53 65 63 72 65 74 0a 6d 65 74 61 |ind: Secret.meta|
00000020 64 61 74 61 3a 0a 20 20 6e 61 6d 65 3a 20 67 6f |data:. name: go|
00000030 6f 67 6c 65 2d 6d 61 70 73 2d 64 69 72 65 63 74 |ogle-maps-direct|
00000040 69 6f 6e 73 2d 61 70 69 2d 73 65 63 72 65 74 0a |ions-api-secret.|
00000050 74 79 70 65 3a 20 4f 70 61 71 75 65 0a 64 61 74 |type: Opaque.dat|
00000060 61 3a 0a 20 20 47 4f 4f 47 4c 45 5f 4d 41 50 53 |a:. GOOGLE_MAPS|
00000070 5f 44 49 52 45 43 54 49 4f 4e 53 5f 41 50 49 5f |_DIRECTIONS_API_|
00000080 4b 45 59 3a 20 51 55 6c 36 59 56 4e 35 51 7a 68 |KEY: QUl6YVN5Qzh|
...
000000b0 51 62 55 70 71 54 48 4e 4a |QbUpqTHNJ|
000000b9
但是!当我进入pod内部的Node.JS解释器时,我看到以下内容:
> process.env.GOOGLE_MAPS_DIRECTIONS_API_KEY
'AIz...jLsI\n'
字符串末尾追加了一个辅助换行符
坦率地说,这非常令人沮丧。关于这个问题,我有几个问题
- 你能发现我的错误吗?例如,我在秘密传播管道中的哪一点意外插入了该换行符
- 我应该使用哪个Unix命令将换行符打印到控制台,以便按字面解释它(作为
),以便我可以实际看到它\n
- 将代码从环境变量中删除尾随换行符注入到容器映像中是否被认为是错误的做法?我知道这在技术上是不正确的,但这让人非常痛苦
- 我看不出你的秘密有什么奇怪之处。正如您所提到的,我要做的第一件事是将
exec
放入pod,放入bash,并回显环境变量以确认它的传播不正确。进行快速测试后,换行符应显示为printf:
printf '%s' $GOOGLE_MAPS_DIRECTIONS_API_KEY
如果从bash打印时看起来不错,那么问题在于node如何解释它。如果它看起来一团糟,那么你需要再看看你是如何生成它的
仅供参考如果process.env
的结果实际上是您的API密钥,您应该尽快撤销它,因为您刚刚在问题中发布了它
至于剥去换行符是否是不好的做法,是的。如果实际的机密信息包含换行符,这可能会导致意外问题。如果您以前创建的机密没有
-n
选项echo
,请验证API中保留的机密(kubectl get secret/google maps directions API secret-o yaml
)匹配yaml文件中的机密,并验证自使用正确的值更新机密后,消费应用程序是否已重新部署是否有用于消费此机密/envvar的pod规范?所有定义都可用。是的,我必须这样做。我在那里犯了错误,编辑问题时做了太多的修改。不用担心,我们肯定都去过那里!旧版本仍然会出现在您的修订列表中,关于问题本身,只是一个提示。啊,这里是我缺少的一条信息:机密管理其自身的生命周期,必须在更新时手动重新创建。当底层文件发生更改时,他们不会自己执行此操作。谢谢。所有资源清单都是如此kubectl apply-f
将
的当前内容加载到apiserver中。你将来所做的任何更改都必须更新/重新应用才能在API中生效,这太愚蠢了!我刚刚调试了一个问题几个小时,最终通过运行“env”缩小了这个问题的范围。其中没有包括如何“正确”生成简单的base64字符串