我已经使用以下命令从文件中创建了一个秘密:
kubectl create secret generic laravel-oauth \
--from-file=./.work-in-progress/oauth_private.key \
--from-file=./.work-in-progress/oauth_public.key
但是,似乎从文件中删除了新行(当使用秘密作为ENV变量时)。
文档中有一个“编码”说明,说明:
秘密数据的序列化JSON和YAML值被编码为 base64字符串。换行符在这些字符串中无效,并且必须 被省略。在Darwin / macOS上使用base64实用程序时,用户应 避免使用-b选项分割长行。相反,Linux用户 应该将选项-w 0添加到base64命令或管道base64 | tr -d'\ n'如果-w选项不可用。
但是我认为这仅适用于通过YAML文件“手动”创建的机密。
答案 0 :(得分:2)
您所指的注释是针对base64编码的字符串本身的(不是编码的内容)。
将机密用作env var可能会通过仪表板“预览孔”将其公开(如果使用Kube仪表板),则应将其安装到目录中,并让应用从那里加载它们;我也很喜欢这个,感到惊讶的是我能够看到这个秘密。
我还没有遇到换行符的剥离,因为上面的命令只会对内容进行base64处理(包括换行符)。就是说,存储经过b64编码的秘密也不是完全安全的,您应该考虑使用密封秘密(bitnami),它的工作方式与普通秘密一样,但实际上是在静止时进行了加密。
HTH, 亚历克斯
答案 1 :(得分:1)
也不会删除新行,文件也只是base64编码,如其他答案中所述。例如:
# mycert.pem
-----BEGIN CERTIFICATE-----
xxxxxx
xxxxxx
...
-----END CERTIFICATE-----
然后:
$ kubectl create secret generic mysecret --from-file=./cert.pem
然后:
$ kubectl get secret mysecret -o=yaml
apiVersion: v1
data:
cert.pem: <base64 encoded string>
kind: Secret
metadata:
creationTimestamp: 2018-11-14T18:11:46Z
name: mysecret
namespace: default
resourceVersion: "20180431"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: xxxxxx
type: Opaque
然后,如果将其解码,您将获得原始秘密。
$ echo '<base64 encoded string>' | base64 -D
-----BEGIN CERTIFICATE-----
xxxxxx
xxxxxx
...
-----END CERTIFICATE-----
此外,这不一定是安全的。如果您正在寻找更高的安全性,则可以使用类似Hashicorp Vault或@Alex Bitnami's sealed secrets所暗示的名称。
答案 2 :(得分:0)
换行符似乎工作正常(也许我早些时候遇到过另一个问题)。
这是一个完整的例子:
#!/usr/bin/env bash
set -euo pipefail
printf "123\n456\n789" > ./.work-in-progress/example.txt
kubectl create secret generic example-test \
--from-file=./.work-in-progress/example.txt \
--dry-run -o yaml | kubectl apply -f -
cat <<EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: example
labels:
app: example
spec:
replicas: 1
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
volumes:
- name: example-test-volume
secret:
secretName: example-test
containers:
- name: app
command: ["sleep", "99999999"]
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: example-test-volume
mountPath: /tmp/example
env:
- name: exampleenv
valueFrom:
secretKeyRef:
name: example-test
key: example.txt
EOF