web-dev-qa-db-ja.com

KubernetesはプライベートDockerイメージリポジトリからイメージをプルできません

Kubernetes(minikube)に問題があり、Dockerのローカルイメージリポジトリからイメージをプルします。 Dockerリポジトリが作成されました:

docker run --entrypoint htpasswd registry:2 -Bbn zordon examplePassword > /mnt/LINUX/auth/htpasswd

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/LINUX/dockerreg:/var/lib/registry \
  -v /mnt/LINUX/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

次に、ローカルリポジトリに正常にアップロードされた画像を使用して簡単なポッドを作成します。

curl localhost:5000/v2/_catalog
{"repositories":["car/configuration"]}

また、minikubeクラスターで次の秘密を作成しました。

kubectl create secret docker-registry docregkey --docker-server=localhost:5000 --docker-username=zordon --docker-password=examplePassword [email protected]

シンプルなポッドを定義します:

    apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: car/configuration:latest
    imagePullPolicy: Always
  restartPolicy: Always
  imagePullSecrets:
  - name: docregkey

残念ながら私はまだ静止しています:

イメージ「car/configuration:latest」のプルに失敗しました:rpcエラー:code = Unknown desc =デーモンからのエラー応答:プルアクセスがcar/configurationに対して拒否されました。リポジトリが存在しないか、「dockerログイン」が必要な場合があります

この問題を解決するにはどうすればよいですか?

14
lukisp

問題はイメージプルポリシーにあります-これをAlways(デフォルト設定)に設定しました。これは、Dockerデーモンが常に外側のDockerレジストリからイメージをプルしようとすることを意味します-代わりにローカルのものを使用する必要があります。

デプロイメントを作成するときに--image-pull-policy=Neverを追加してみてください。

ローカルで作成された画像を使用するための良いチュートリアルはこちらです(助けてくれました):

https://kubernetes.io/docs/tutorials/hello-minikube/#create-a-docker-container-image

9
Pawel B

問題は、POD yamlファイルで言及している画像名にあります。

image: car/configuration:latest

これは、ローカルレジストリではなくグローバルレジストリからプルしようとします。リポジトリも含めるようにイメージ名を変更します。

image: localhost:5000/car/configuration:latest

レジストリが保護されていない場合は、Dockerデーモン構成に安全でないレジストリが含まれていることを確認してください。

4
Pramod V

MinikubeはVM localhostではありません。このコードを試してくださいeval $(minikube docker-env)https://kubernetes.io/docs/getting-started-guides/minikube /

  1. ターミナルを開く
  2. eval $(minikube docker-env)
  3. ドッカービルド.
  4. kubectl create -f deployment.yaml

この端末のみ有効です。閉じた端末が再び端末を開いてeval $(minikube docker-env)を書き込む場合

eval $(minikube docker-env)Minikubeでこのコードビルドイメージ

3
Onur Yartaşı

ターミナルで実行する1行のソリューションが必要でした。私が試した他のすべては、minikubeでecrを認証するには非常に複雑でした。

これは、トークンの有効期限が切れるため、毎日実行するaws ecr loginのコマンドです。以下の例は、AWS ECRを備えたDebian 9用です。

シェル

kubectl create secret docker-registry aws-ecr-credentials \
--docker-server=$ECR_REGISTRY \
--docker-username=AWS \
--docker-password=$(aws ecr get-login | awk '{print $6}') \
--docker-email=$IAM_EMAIL \
--namespace=$KUBE_NAMESPACE

template.yml

spec:
  imagePullSecrets:
    - name: aws-ecr-credentials
2
Ligemer

Docker for DesktopでKubernetesを実行すると、アプリケーションはDockerとKubernetesで同じ画像レジストリを共有します。リストodすべての画像:

docker images --all

それらを選択して、変更された属性で実行します--image-pull-policy=Never。例えば:

kubectl run ContainerName --image=myimage/server --port=8080 --image-pull-policy=Never 

デフォルトでは、kubeletは指定されたレジストリから各画像をプルしようとします。ただし、コンテナのimagePullPolicyプロパティがIfNotPresentまたはNeverに設定されている場合、ローカルイメージが使用されます(それぞれ優先的または排他的に)。 リンク

つまり、Kubernetesはリモートクラウドではなくローカルレジストリからイメージをプルします。

0
ypaseka

Minikubeのプライベートレジストリ

kubectl create -f kube-registry.yaml

(Grab kube-registry.yaml githubのこのGistから。)

そして、localhostへのポートフォワードminikubeが必要です(ちょうどイメージのビルド時間)

kubectl port-forward --namespace kube-system \
$(kubectl get po -n kube-system | grep kube-registry-v0 | \
awk '{print $1;}') 5000:5000

この後、ホストからcurl localhost:5000は、minikubeで実行されているdockerレジストリから有効な応答を返す必要があります

リポジトリ: http:// localhost:5000/v2/_catalog

プル画像:localhost:5000/image_name:image_tag

参照: https://blog.hasura.io/sharing-a-local-registry-for-minikube-37c7240d0615

0
Onur Yartaşı