我正在尝试通过从远程注册表 (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 test
pod,它将被创建在测试命名空间。
您可以随时验证指定命名空间中包含的内容
kubectl get all --namespace <namespace_name>
这里您可以找到命名空间是什么。
此外,对于调试非常有用的命令是
kubectl describe pod <pod_name> -n <namespace>
kubectl describe deployment <name> -n <namespace>
或kubeclt get events -n <namespace>