AWSで稼働している市販のKubernetesクラスターをkube-up
スクリプトでインストールしました。非公開のDocker Hubリポジトリにあるコンテナをいくつか実行したいと思います。しかし、「見つかりません」というエラーが発生し続けます。
> kubectl get pod
NAME READY STATUS RESTARTS AGE
maestro-kubetest-d37hr 0/1 Error: image csats/maestro:latest not found 0 22m
.dockercfg
ファイルを含むシークレットを作成しました。投稿されたスクリプトを実行することで動作することを確認しました 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
私は 。dockercfgスクリプトの新しい形式 を使用していないことを確認しました。私のものは次のようになります。
> cat ~/.dockercfg
{"https://index.docker.io/v1/":{"auth":"REDACTED BASE64 STRING HERE","email":"[email protected]"}}
私は試しました OS Xの代わりにDebianでBase64エンコードを実行 、そこでは運がありません。 (予想通り、同じ文字列が生成されます。)
これが私のレプリケーションコントローラの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"}
何か案は?
Dockerはconfig.json
に~/.docker/
ファイルを生成します。
{
"auths": {
"index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "[email protected]"
}
}
}
あなたが実際に欲しいのは:
{"https://index.docker.io/v1/": {"auth": "XXXXXXXXXXXXXX", "email": "[email protected]"}}
3つのことに注意してください。
auths
ラッピングはありませんhttps://
があります次にbase64エンコードし、.dockercfg
名のデータとして使用します
apiVersion: v1
kind: Secret
metadata:
name: registry
data:
.dockercfg: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
type: kubernetes.io/dockercfg
.dockercfg
行は1行であることに再度注意してください(base64は複数行の文字列を生成する傾向があります)
「画像が見つかりません」と表示されるもう1つの理由として、シークレットの名前空間がコンテナの名前空間と一致していないことが考えられます。
たとえば、Deployment 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
シークレットの名前空間を指定しないと、デフォルトの名前空間になり、使用されません。警告メッセージはありません。私はこの問題に何時間も費やしたので、誰か他の人の時間を節約できることを願ってここで共有したいと思いました。
このエラーが表示されるもう1つの理由は、クラスターバージョンとは異なるkubectlバージョンを使用しているためです(例:1.8.xクラスターに対してkubectl 1.9.xを使用)。
kubectl create secret docker-registryコマンドによって生成されるシークレットの形式は、バージョン間で変更されました。
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クラスターバージョンで想定されている形式と一致していることを確認してください。
同じ問題が発生しています。私が気付いたのは、例( https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod ).dockercfgの形式が次のとおりであることです。 :
{
"https://index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "[email protected]"
}
}
私のマシンのドッカーによって生成されたものは次のようになりますが:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "ZmFrZXBhc3N3b3JkMTIK",
"email": "[email protected]"
}
}
}
ソースコードを確認したところ、実際にこのユースケースのテストがあることがわかりました( https://github.com/kubernetes/kubernetes/blob/6def707f9c8c6ead44d82ac8293f0115f0e47262/pkg/kubelet/dockertools/docker_test.go# L28 )
例のように「auths」を取得してエンコードするだけで問題なく動作することを確認しました。
おそらくドキュメントを更新する必要があります。 githubでチケットを上げます。