这个例子具有:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: usernamekey
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: passwordkey
restartPolicy: Never
以上内容摘自:
https://kubernetes.io/docs/concepts/configuration/secret/
我创建了一个类似这样的秘密:
kubectl --namespace=mycustomnamespace create secret generic mysecret --from-literal=passwordkey="abc123" --from-literal=usernamekey="mememe"
我了解上述的秘密存在于命名空间中。
但是如果我尝试这样做:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
namespace: mycustomnamespace
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: usernamekey
namespace: mycustomnamespace
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: passwordkey
namespace: mycustomnamespace
restartPolicy: Never
(请注意,在元数据下添加了命名空间声明)
我收到了这个错误:
“验证数据时出错:[ValidationError(Pod.spec.containers [1] .env [2] .valueFrom.secretKeyRef):io.k8s.api.core.v1.SecretKeySelector中未知字段“ namespace”,ValidationError(Pod.spec.containers [1] .env [6] .valueFrom.secretKeyRef):io.k8s.api.core.v1.SecretKeySelector中未知字段“ namespace”]”
如果我删除secretKeyRef下的namespace,那么pod将失败,并显示以下警告信息:
“警告 失败 2秒钟(1分钟内超过8次) kubelet,minikube 错误:找不到秘密“mysecret””
是的,我的secrets在命名空间中。
kubectl get secrets --namespace mycustomnamespace
NAME TYPE DATA AGE
default-token-55bzp kubernetes.io/service-account-token 3 10m
mysecret Opaque 2 10m
追加:(分辨率)
这是我的错误。请查看我在Vasily的回答下面的评论。
但基本上,以下的yml文件是关键……
metadata:
name: secret-env-pod
namespace: mycustomnamespace
以上的yml应该“驱动”命名空间(也就是设置命名空间的范围),用于配置文件的其余部分(yml)...
(如果您是这个问题的未来读者,请仔细检查并确认您已经将所有内容放在正确的命名空间下。所有常规的“get”语句需要使用-n (也就是--namespace) 作为其中一部分。)
例如:
kubectl get pods
以上代码只会获取“default”下的Pod。
您需要执行以下操作:
kubectl get pods --namespace mycustomnamespace