在带有命名空间的 YML 中指定一个秘密

Specify a secret in YML WITH a namespace

示例有:

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

(注意我在元数据下添加了命名空间声明)

我收到这个错误:

Error validating data: [ValidationError(Pod.spec.containers[1].env[2].valueFrom.secretKeyRef): unknown field "namespace" in io.k8s.api.core.v1.SecretKeySelector, ValidationError(Pod.spec.containers[1].env[6].valueFrom.secretKeyRef): unknown field "namespace" in io.k8s.api.core.v1.SecretKeySelector];

如果我取出名称空间(在 secretKeyRef 下)....pod 失败...

Warning Failed 2s (x8 over 1m) kubelet, minikube Error: secret "mysecret" not found

是的,我的秘密在命名空间中:

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 应该 "drive" 其余配置 (yml) 的命名空间(也就是设置命名空间的范围)....

(如果你是这个问题的未来 reader,请仔细检查你的所有内容是否都在正确的命名空间下。所有正常的 "get" 语句都需要使用 -n(又名--namespace) 作为一部分。

例子

kubectl get pods

以上只会得到"default"下的pods。

你必须做

kubectl get pods --namespace mycustomnamespace

只需从 pod secretKeyRef 定义中删除 namespace: mycustomnamespace

你的秘密创建命令也应该是这样的:

kubectl --namespace=mycustomnamespace create secret generic mysecret --from-literal=passwordkey="abc123" --from-literal=usernamekey="mememe"

试试这个 你可以 运行 你的 pod

kubectl apply -f podconfigfile.yaml -n mycustomnamespace

这将 运行 同一个命名空间中的 pod 并在创建秘密时找到秘密

如果出现任何错误,则检查具有机密的命名空间和命名空间的专有名称。

检查命名空间中的秘密:

kubectl get secret -n mycustomnamespace