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

3

这个例子具有:

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
2个回答

5

只需从Pod secretKeyRef定义中删除namespace: mycustomnamespace即可。

另外,您的secret创建命令应该如下所示:

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

我刚刚追加了我的问题文本。当我从secretKeyRef(s)下删除命名空间时,我会收到“找不到秘密”的错误消息。:((是的,我会修复创建秘密的代码...那是一个“演示”复制/粘贴错误)。 - granadaCoder
你能粘贴一下命令"kubectl -n mycustomnamespace get secret"和"kubectl -n mycustomnamespace get pod"的输出吗? - Vasili Angapov
Vasily,那个请求……帮我找到了问题所在。这是我的配置错误。我会将其标记为正确的……对于未来的读者……正如Vasily向我展示的那样……一定要使用“-n”参数对pod、service等进行三重检查。 - granadaCoder

1
尝试一下:你可以运行你的 Pod。
kubectl apply -f podconfigfile.yaml -n mycustomnamespace

这将在相同的命名空间中运行pod,并查找secret是否已创建。
如果出现任何错误,请检查命名空间中是否有secrets和正确的命名空间名称。
在命名空间中检查secret:
kubectl get secret -n mycustomnamespace

1
为这个“技巧”点赞。我不知道你可以使用-n参数运行“apply”。 - granadaCoder
您可以使用create和apply来针对任何文件进行配置,并在最后提供命名空间,以便特定文件配置仅适用于该命名空间。 - Harsh Manvar
例如创建服务 kubectl apply -f service.yaml -n <namespacename> - Harsh Manvar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接