Kubernetes imagePullSecrets 不工作;获得 "image not found"
Kubernetes imagePullSecrets not working; getting "image not found"
我在 AWS 上有一个现成的 Kubernetes 集群 运行ning,安装了 kube-up
脚本。我想要 运行 私有 Docker Hub 存储库中的一些容器。但我不断收到 "not found" 错误:
> kubectl get pod
NAME READY STATUS RESTARTS AGE
maestro-kubetest-d37hr 0/1 Error: image csats/maestro:latest not found 0 22m
我创建了一个包含 .dockercfg
文件的秘密。我已经通过 运行ning 发布的脚本 here:
确认它有效
> kubectl get secrets docker-hub-csatsinternal -o yaml | grep dockercfg: | cut -f 2 -d : | base64 -D > ~/.dockercfg
> docker pull csats/maestro
latest: Pulling from csats/maestro
我已经确认我没有使用 the new format of .dockercfg script,我的看起来像这样:
> cat ~/.dockercfg
{"https://index.docker.io/v1/":{"auth":"REDACTED BASE64 STRING HERE","email":"eng@csats.com"}}
我已经尝试过 running the Base64 encode on Debian instead of OS X,但没有成功。 (它会产生与预期相同的字符串。)
这是我的复制控制器的 YAML:
---
kind: "ReplicationController"
apiVersion: "v1"
metadata:
name: "maestro-kubetest"
spec:
replicas: 1
selector:
app: "maestro"
ecosystem: "kubetest"
version: "1"
template:
metadata:
labels:
app: "maestro"
ecosystem: "kubetest"
version: "1"
spec:
imagePullSecrets:
- name: "docker-hub-csatsinternal"
containers:
- name: "maestro"
image: "csats/maestro"
imagePullPolicy: "Always"
restartPolicy: "Always"
dnsPolicy: "ClusterFirst"
kubectl version
:
Client Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"}
Server Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"}
有什么想法吗?
我也遇到了同样的问题。我注意到的是,在示例中 (https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod) .dockercfg 具有以下格式:
{
"https://index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "jdoe@example.com"
}
}
虽然 docker 在我的机器上生成的看起来像这样:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "email@company.com"
}
}
}
通过查看源代码,我发现这个用例实际上有一个测试(https://github.com/kubernetes/kubernetes/blob/6def707f9c8c6ead44d82ac8293f0115f0e47262/pkg/kubelet/dockertools/docker_test.go#L280)
我向您确认,如果您像示例中那样对 "auths" 进行编码,它就可以为您工作。
可能应该更新文档。我会在 github 上开票。
Docker 在 ~/.docker/
中生成一个 config.json
文件
看起来像:
{
"auths": {
"index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "email@company.com"
}
}
}
你真正想要的是:
{"https://index.docker.io/v1/": {"auth": "XXXXXXXXXXXXXX", "email": "email@company.com"}}
注意 3 件事:
- 1) 没有
auths
换行
- 2) 前面有
https://
URL
- 3) 一行
然后你 base64 对其进行编码并用作 .dockercfg
名称
的数据
apiVersion: v1
kind: Secret
metadata:
name: registry
data:
.dockercfg: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
type: kubernetes.io/dockercfg
再次注意 .dockercfg
行是 一行 (base64 倾向于生成多行字符串)
您可能会看到 "image not found" 的另一个可能原因是您的密钥的命名空间与容器的命名空间不匹配。
例如,如果您的部署 yaml 看起来像
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mydeployment
namespace: kube-system
然后您必须确保 Secret yaml 使用匹配的命名空间:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
namespace: kube-system
data:
.dockerconfigjson: ****
type: kubernetes.io/dockerconfigjson
如果您没有为您的机密指定命名空间,它将最终位于默认命名空间中并且不会被使用。没有警告消息。我刚刚在这个问题上花了几个小时,所以我想在这里分享它,希望我能节省其他人的时间。
您可能会看到此错误的另一个原因是使用与集群版本不同的 kubectl 版本(例如,针对 1.8.x 集群使用 kubectl 1.9.x)。
kubectl create secret docker-registry 命令生成的密钥格式在不同版本之间发生了变化。
A 1.8.x 集群需要一个格式为:
的秘密
{
"https://registry.gitlab.com":{
"username":"...",
"password":"...",
"email":"...",
"auth":"..."
}
}
但是 1.9.x kubectl 生成的秘密具有以下格式:
{
"auths":{
"https://registry.gitlab.com":{
"username":"...",
"password":"...",
"email":"...",
"auth":"..."
}
}
}
因此,请仔细检查您的密钥的 .dockercfg 数据的值,并验证它是否与您的 kubernetes 集群版本预期的格式匹配。
我在 AWS 上有一个现成的 Kubernetes 集群 运行ning,安装了 kube-up
脚本。我想要 运行 私有 Docker Hub 存储库中的一些容器。但我不断收到 "not found" 错误:
> kubectl get pod
NAME READY STATUS RESTARTS AGE
maestro-kubetest-d37hr 0/1 Error: image csats/maestro:latest not found 0 22m
我创建了一个包含 .dockercfg
文件的秘密。我已经通过 运行ning 发布的脚本 here:
> kubectl get secrets docker-hub-csatsinternal -o yaml | grep dockercfg: | cut -f 2 -d : | base64 -D > ~/.dockercfg
> docker pull csats/maestro
latest: Pulling from csats/maestro
我已经确认我没有使用 the new format of .dockercfg script,我的看起来像这样:
> cat ~/.dockercfg
{"https://index.docker.io/v1/":{"auth":"REDACTED BASE64 STRING HERE","email":"eng@csats.com"}}
我已经尝试过 running the Base64 encode on Debian instead of OS X,但没有成功。 (它会产生与预期相同的字符串。)
这是我的复制控制器的 YAML:
---
kind: "ReplicationController"
apiVersion: "v1"
metadata:
name: "maestro-kubetest"
spec:
replicas: 1
selector:
app: "maestro"
ecosystem: "kubetest"
version: "1"
template:
metadata:
labels:
app: "maestro"
ecosystem: "kubetest"
version: "1"
spec:
imagePullSecrets:
- name: "docker-hub-csatsinternal"
containers:
- name: "maestro"
image: "csats/maestro"
imagePullPolicy: "Always"
restartPolicy: "Always"
dnsPolicy: "ClusterFirst"
kubectl version
:
Client Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"}
Server Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"}
有什么想法吗?
我也遇到了同样的问题。我注意到的是,在示例中 (https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod) .dockercfg 具有以下格式:
{
"https://index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "jdoe@example.com"
}
}
虽然 docker 在我的机器上生成的看起来像这样:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "email@company.com"
}
}
}
通过查看源代码,我发现这个用例实际上有一个测试(https://github.com/kubernetes/kubernetes/blob/6def707f9c8c6ead44d82ac8293f0115f0e47262/pkg/kubelet/dockertools/docker_test.go#L280)
我向您确认,如果您像示例中那样对 "auths" 进行编码,它就可以为您工作。
可能应该更新文档。我会在 github 上开票。
Docker 在 ~/.docker/
中生成一个 config.json
文件
看起来像:
{
"auths": {
"index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "email@company.com"
}
}
}
你真正想要的是:
{"https://index.docker.io/v1/": {"auth": "XXXXXXXXXXXXXX", "email": "email@company.com"}}
注意 3 件事:
- 1) 没有
auths
换行 - 2) 前面有
https://
URL - 3) 一行
然后你 base64 对其进行编码并用作 .dockercfg
名称
apiVersion: v1
kind: Secret
metadata:
name: registry
data:
.dockercfg: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
type: kubernetes.io/dockercfg
再次注意 .dockercfg
行是 一行 (base64 倾向于生成多行字符串)
您可能会看到 "image not found" 的另一个可能原因是您的密钥的命名空间与容器的命名空间不匹配。
例如,如果您的部署 yaml 看起来像
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mydeployment
namespace: kube-system
然后您必须确保 Secret yaml 使用匹配的命名空间:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
namespace: kube-system
data:
.dockerconfigjson: ****
type: kubernetes.io/dockerconfigjson
如果您没有为您的机密指定命名空间,它将最终位于默认命名空间中并且不会被使用。没有警告消息。我刚刚在这个问题上花了几个小时,所以我想在这里分享它,希望我能节省其他人的时间。
您可能会看到此错误的另一个原因是使用与集群版本不同的 kubectl 版本(例如,针对 1.8.x 集群使用 kubectl 1.9.x)。
kubectl create secret docker-registry 命令生成的密钥格式在不同版本之间发生了变化。
A 1.8.x 集群需要一个格式为:
的秘密{
"https://registry.gitlab.com":{
"username":"...",
"password":"...",
"email":"...",
"auth":"..."
}
}
但是 1.9.x kubectl 生成的秘密具有以下格式:
{
"auths":{
"https://registry.gitlab.com":{
"username":"...",
"password":"...",
"email":"...",
"auth":"..."
}
}
}
因此,请仔细检查您的密钥的 .dockercfg 数据的值,并验证它是否与您的 kubernetes 集群版本预期的格式匹配。