Microk8无法从私有注册表中提取

时间:2019-06-18 05:34:56

标签: docker kubernetes microk8s

我正在EC2实例上运行Microk8。我无法从我们的私人注册表中提取容器。尝试运行这样的容器时,kubectl describe pod显示:

  

无法提取映像“ docker.xxx.com/import:v1”:rpc   错误:代码=未知desc =无法解析图像   “ docker.xxx.com/import:v1”:没有可用的注册表   端点:无法获取匿名令牌:意外状态:401   未经授权

我可以从那台机器上docker logindocker pull。我用来部署容器的Yaml在另一个(非容器化的)群集上运行良好。它指的是拉取机密,与另一个群集中使用的相同,并且可以在其中正常工作。

我在Microk8s的containerd-template.toml中添加了以下条目:

   [plugins.cri.registry]
      [plugins.cri.registry.mirrors]
        ...
        [plugins.cri.registry.mirrors."docker.xxx.com"]
          endpoint = ["https://docker.xxx.com"]

我不知道我可能还会缺少什么。

2 个答案:

答案 0 :(得分:1)

如果遇到错误401,则可能是身份验证有问题。例如。您缺少私人注册表的凭据。

为确保microk8使用适当的凭据,除了配置中的mirrors部分外,您还必须指定auths部分,将docker注册表凭据放入其中。

[plugins.cri.registry.auths]
  [plugins.cri.registry.auths."https://gcr.io"]
    username = ""
    password = ""
    auth = ""
    identitytoken = ""

该部分中的属性与您在.docker/config.json中可以找到的配置兼容。

请注意,该部分与mirrors位于同一级别,因此不应作为mirrors条目的一部分,而应添加为新部分。 另一个重要的部分是确保auth主机与您的注册表主机匹配(例如https与http)。

有关更多详细信息,请参见:https://github.com/containerd/cri/blob/master/docs/registry.md

p.s。请记住,microk8s [1] containerd支持v1.14,如果您使用旧版本,则应检查其他选项,例如kubernates官方文档[2]

[1] https://microk8s.io/docs/working

[2] https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

答案 1 :(得分:0)

最简单的解决方案是:

1)在当前名称空间中创建一个secret

k create secret docker-registry my-private-registry \
  --docker-server=my-private-registry.io \
  --docker-username="my-username" \
  --docker-password="********" \
  --docker-email=my.email@helloworld.io

2)修补default服务帐户:

k patch serviceaccount default -p '{"imagePullSecrets": [{"name": "my-private-registry"}]}'

此后,您可以在pod / deployment / replicaset定义中引用来自私有Docker注册表的图像。对将要使用的每个名称空间执行相同的顺序。

HTH。