我正在EC2实例上运行Microk8。我无法从我们的私人注册表中提取容器。尝试运行这样的容器时,kubectl describe pod
显示:
无法提取映像“ docker.xxx.com/import:v1”:rpc 错误:代码=未知desc =无法解析图像 “ docker.xxx.com/import:v1”:没有可用的注册表 端点:无法获取匿名令牌:意外状态:401 未经授权
我可以从那台机器上docker login
和docker 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"]
我不知道我可能还会缺少什么。
答案 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。