从Kubernetes中的私人注册表中提取图像

问题描述 投票:23回答:6

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

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

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

image <user/image>:latest not found

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

docker kubernetes coreos
6个回答
7
投票

Kubernetes支持您可以创建的特殊类型的秘密,用于获取您的pod的图像。更多细节here


48
投票

要添加到@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

15
投票

如果需要从私有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

7
投票

我可以确认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测试


3
投票

对于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>

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


0
投票

使用与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是上一个命令中给出的名称。

© www.soinside.com 2019 - 2024. All rights reserved.