Kubernetes-imagePullSecrets部署授权失败

Kubernetes-imagePullSecrets部署授权失败

我正在尝试通过从远程注册表 (quay.io) 提取映像来部署 Kubernetes 容器。虽然它在部署 pod 时运行良好,但在将其部署为部署时,quay 授权出现了意外问题。不知道 yaml 中的哪个错误配置导致了此问题。无论如何,这是有效的 pod yaml:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: quay.io/xxx/yyy
    imagePullPolicy: Always
  imagePullSecrets:
  - name: test-secret

以下是不起作用的部署 yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: random-name-deployment
  namespace: test-ns
spec:
  selector:
    matchLabels:
      app: random-name
  replicas: 1
  template:
    metadata:
      labels:
        app: random-name
    spec:
      restartPolicy: Always
      containers:
      - name: random-name
        image: quay.io/xxx/yyy
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: 10Mi
            cpu: 0.1
          limits:
            memory: 10Mi
            cpu: 0.1
        volumeMounts:
        - mountPath: /etc/config/config.yaml
          name: random-name-config
          subPath: config.yaml
      imagePullSecrets:
      - name: test-secret
      volumes:
      - name: random-name-config
        configMap:
          name: random-name-config

失败并出现错误:

kubectl describe:
Failed to pull image "quay.io/xxx/yyy": rpc error: code = Unknown desc = Error response from daemon: unauthorized: access to the requested resource is not authorized

然而,秘密似乎被正确加载(并且在部署 pod 和部署之间秘密没有改变 - 在第一种情况下,授权工作就像一个魅力):

kubectl get -o yaml:
(...)
imagePullSecrets:
  - name: test-secret

我做错了什么?如有任何建议,我将不胜感激,谢谢!

答案1

发现问题了 - 我的机密部署在 DEFAULT 命名空间中,而不是 TEST-NS,这应该是这样的。如果有人想检查所有机密及其命名空间:

kubectl get secrets --all-namespaces

但有趣的是,Kubectl 从未记录无法找到秘密 - 这样的信息将非常有用 :(

答案2

不幸的是,您没有提供您使用的命令。您可能忘记在 POD 部署期间添加 --namespace 标志。

在 Kubernetes 中,任何命令(如 create、run、explain、describe、get 等)都会自动引用默认命名空间,直到您指定另一个。

因此,如果你使用 kubectl apply -f <pod.yaml>pod,则会在默认命名空间。但是如果你使用kubectl apply -f <pod.yaml> -n testpod,它将被创建在测试命名空间。

您可以随时验证指定命名空间中包含的内容

kubectl get all --namespace <namespace_name>

这里您可以找到命名空间是什么。

此外,对于调试非常有用的命令是 kubectl describe pod <pod_name> -n <namespace> kubectl describe deployment <name> -n <namespace>kubeclt get events -n <namespace>

相关内容