繁体   English   中英

从 Kubernetes 的私有注册表中拉取镜像

[英]Pulling images from private registry in Kubernetes

我构建了一个 4 节点的 kubernetes 集群,运行多容器 pod,所有这些 pod 都在 CoreOS 上运行。 图像来自公共和私人存储库。 现在我必须登录每个节点并在每次更新图像时手动下拉图像。 我希望能够自动拉动它们。

  1. 我尝试在每台服务器上运行 docker login 并将 .dockercfg 文件放在 /root 和 /core
  2. 我还使用 .docker/config.json 完成了上述操作
  3. 我已经为 kube master 添加了 secret 并添加了 imagePullSecrets:
    • 名称:docker.io 到 Pod 配置文件。

当我创建 pod 时,我收到错误消息 Error:

image <user/image>:latest not found

如果我登录并运行 docker pull 它将拉取图像。 我已经使用 docker.io 和 quay.io 尝试过这个。

补充一下@rob 所说的,从 docker 1.7 开始,.dockercfg 的使用已被弃用,他们现在使用 ~/.docker/config.json 文件。 kube 1.1 中支持这种类型的密钥,但您必须在 yaml 中使用不同的密钥/类型配置来创建它:

首先,base64 编码你的~/.docker/config.json

cat ~/.docker/config.json | base64 -w0   

请注意,base64 编码应出现在一行中,因此我们使用 -w0 禁用包装。

接下来,创建一个 yaml 文件: my-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: registrypullsecret
data:
  .dockerconfigjson: <base-64-encoded-json-here>
type: kubernetes.io/dockerconfigjson

——

$ kubectl create -f my-secret.yaml && kubectl get secrets

NAME                  TYPE                                  DATA
default-token-olob7   kubernetes.io/service-account-token   2
registrypullsecret    kubernetes.io/dockerconfigjson        1

然后,在 pod 的 yaml 中,您需要引用registrypullsecret或创建一个复制控制器:

apiVersion: v1
kind: Pod
metadata:
  name: my-private-pod
spec:
  containers:
    - name: private
      image: yourusername/privateimage:version
  imagePullSecrets:
    - name: registrypullsecret

如果需要从私有 Docker Hub 存储库中拉取映像,可以使用以下命令。

创建您的密钥

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

创建了秘密“myregistrykey”。

然后将新创建的密钥添加到您的 Kubernetes 服务帐户。

检索当前服务帐户

kubectl get serviceaccounts default -o yaml > ./sa.yaml

编辑 sa.yaml 并在 Secrets 之后添加 ImagePullSecret

imagePullSecrets:
- name: myregistrykey

更新服务帐号

kubectl replace serviceaccount default -f ./sa.yaml

我可以确认 imagePullSecrets不适用于部署,但您可以

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
kubectl edit serviceaccounts default

添加

imagePullSecrets:
- name: myregistrykey

Secrets之后,保存并退出。 和它的作品。 使用 Kubernetes 1.6.7 测试

Kubernetes 支持一种特殊类型的秘密,您可以创建该秘密,用于为您的 pod 获取图像。 更多细节在这里

对于 centos7,docker 配置文件在 /root/.dockercfg 下

  1. echo $(cat /root/.dockercfg) | base64 -w 0
  2. 根据旧格式将结果复制并粘贴到秘密 YAML 中:

     apiVersion: v1 kind: Secret metadata: name: docker-secret type: kubernetes.io/dockercfg data: .dockercfg: <YOUR_BASE64_JSON_HERE>

它对我有用,希望也能有所帮助。

使用与 docker 配置相同的凭据创建密钥的最简单方法:

kubectl create secret generic myregistry --from-file=.dockerconfigjson=$HOME/.docker/config.json

这已经在 base64 中对数据进行了编码。

如果您可以使用 docker 下载图像,那么 kubernetes 也应该能够下载它们。 但是需要将其添加到您的 kubernetes 对象中:

spec:
  template:
    spec:
      imagePullSecrets:
      - name: myregistry
      containers:
      # ...

其中myregistry是上一个命令中给出的名称。

走简单的路,不要忘记定义--type并将其添加到适当的命名空间

kubectl create secret generic YOURS-SECRET-NAME \
--from-file=.dockerconfigjson=$HOME/.docker/config.json \
--type=kubernetes.io/dockerconfigjson

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM