【问题标题】:How to use Kubernetes Secret to pull a private docker image from docker hub?如何使用 Kubernetes Secret 从 docker hub 拉取私有 docker 镜像?
【发布时间】:2023-02-20 18:52:25
【问题描述】:
我正在尝试在 ubuntu 20.04 上使用 minikube 运行我的 kubernetes 应用程序,并应用一个秘密从 docker hub 中提取私有 docker 镜像,但它似乎无法正常工作。
拉取镜像“xxx/node-graphql:latest”失败:rpc 错误:代码
= Unknown desc = 来自守护程序的错误响应:xxx/node-graphql 的拉取访问被拒绝,存储库不存在或可能需要
'docker login': denied: 请求访问资源被拒绝
这是生成的秘密
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<pathtofile>.docker/config.json \
--type=kubernetes.io/dockerconfigjson
这是我创建的秘密 yaml 文件
apiVersion: v1
data:
.dockerconfigjson: xxx9tRXpNakZCSTBBaFFRPT0iCgkJfQoJfQp9
kind: Secret
metadata:
name: node-graphql-secret
uid: xxx-2e18-44eb-9719-xxx
type: kubernetes.io/dockerconfigjson
有没有人尝试使用秘密将私有 docker 镜像拉入 Kubernetes?任何形式的帮助将不胜感激。谢谢你!
【问题讨论】:
标签:
kubernetes
kubectl
minikube
dockerhub
kubernetes-secrets
【解决方案1】:
我设法在以下步骤中添加了秘密配置。
首先,您需要使用以下命令登录到 docker hub:
docker login
接下来,您创建一个运行的 k8s 秘密:
kubectl create secret generic <your-secret-name>\n --from-file=.dockerconfigjson=<pathtoyourdockerconfigfile>.docker/config.json \n --type=kubernetes.io/dockerconfigjson
然后获取yaml格式的secret
kubectl get secret -o yaml
它应该是这样的:
apiVersion: v1
items:
- apiVersion: v1
data:
.dockerconfigjson: xxxewoJImF1dGhzIjogewoJCSJodHRwczovL2luZGV4LmRvY2tl
kind: Secret
metadata:
creationTimestamp: "2022-10-27T23:06:01Z"
name: <your-secret-name>
namespace: default
resourceVersion: "513"
uid: xxxx-0f12-4beb-be41-xxx
type: kubernetes.io/dockerconfigjson
kind: List
metadata:
resourceVersion: ""
我已经在秘密 yaml 文件中复制了秘密的内容:
apiVersion: v1
data:
.dockerconfigjson: xxxewoJImF1dGhzIjogewoJCSJodHRwczovL2luZGV4LmRvY2tlci
kind: Secret
metadata:
creationTimestamp: "2022-10-27T23:06:01Z"
name: <your-secret-name>
namespace: default
resourceVersion: "513"
uid: xxx-0f12-4beb-be41-xxx
type: kubernetes.io/dockerconfigjson
有用!这是使用Secret 为 K8s 拉取私有 docker 镜像的简单方法。
作为旁注,要应用秘密,请运行kubectl apply -f secret.yml
希望能帮助到你
【解决方案2】:
@dreambold 感谢您详细说明您找到的解决方案。由于我正在努力从 K3s 对 Docket Hub 进行身份验证,我尝试了您的方法并在 Deployment 中引用了 Secret,但它仍然报告我未通过身份验证。
我看不出问题中的 Secret 清单与答案中生成的 Secret 清单之间的区别,除了 resourceVersion 和 creationTimestamp 等字段是在创建 Secret 时生成的。他们在我看来是一样的。