在 YML 中使用命名空间指定秘密

gra*_*der 4 kubernetes kubectl

该示例有:

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
Run Code Online (Sandbox Code Playgroud)

以上来自:

https://kubernetes.io/docs/concepts/configuration/secret/

我创建了一个这样的秘密:

kubectl --namespace=mycustomnamespace create secret generic mysecret --from-literal=passwordkey="abc123" --from-literal=usernamekey="mememe"
Run Code Online (Sandbox Code Playgroud)

我知道上述秘密存在于命名空间下。

但如果我尝试这个:

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
Run Code Online (Sandbox Code Playgroud)

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

我收到此错误:

验证数据时出错:[ValidationError(Pod.spec.containers[1].env[2].valueFrom.secretKeyRef):io.k8s.api.core.v1.SecretKeySelector 中的未知字段“命名空间”,ValidationError(Pod.spec.容器[1].env[6].valueFrom.secretKeyRef):io.k8s.api.core.v1.SecretKeySelector中的未知字段“命名空间”];

如果我取出命名空间(在 SecretKeyRef 下)....pod 会失败..

警告失败 2s(x8 超过 1m)kubelet、minikube 错误:未找到秘密“mysecret”

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

kubectl get secrets --namespace mycustomnamespace

NAME                  TYPE                                  DATA      AGE
default-token-55bzp   kubernetes.io/service-account-token   3         10m
mysecret              Opaque                                2         10m
Run Code Online (Sandbox Code Playgroud)

附加:(分辨率)

这是我的错误。在瓦西里的回答下查看我的评论。

但基本上,神奇的酱是下面的 yml....

metadata:
  name: secret-env-pod
  namespace: mycustomnamespace
Run Code Online (Sandbox Code Playgroud)

上面的 yml 应该“驱动”其余配置 (yml) 的命名空间(也称为设置命名空间的范围)......

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

例子

kubectl get pods
Run Code Online (Sandbox Code Playgroud)

以上只会获取“默认”下的 Pod。

你必须做

kubectl get pods --namespace mycustomnamespace
Run Code Online (Sandbox Code Playgroud)

Vas*_*pov 6

namespace: mycustomnamespace只需从 pod SecretKeyRef 定义中删除即可。

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

kubectl --namespace=mycustomnamespace create secret generic mysecret --from-literal=passwordkey="abc123" --from-literal=usernamekey="mememe"
Run Code Online (Sandbox Code Playgroud)