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ログイン」が必要な場合があります
この問題を解決するにはどうすればよいですか?
問題はイメージプルポリシーにあります-これをAlways(デフォルト設定)に設定しました。これは、Dockerデーモンが常に外側のDockerレジストリからイメージをプルしようとすることを意味します-代わりにローカルのものを使用する必要があります。
デプロイメントを作成するときに--image-pull-policy=Never
を追加してみてください。
ローカルで作成された画像を使用するための良いチュートリアルはこちらです(助けてくれました):
https://kubernetes.io/docs/tutorials/hello-minikube/#create-a-docker-container-image
問題は、POD yamlファイルで言及している画像名にあります。
image: car/configuration:latest
これは、ローカルレジストリではなくグローバルレジストリからプルしようとします。リポジトリも含めるようにイメージ名を変更します。
image: localhost:5000/car/configuration:latest
レジストリが保護されていない場合は、Dockerデーモン構成に安全でないレジストリが含まれていることを確認してください。
MinikubeはVM localhostではありません。このコードを試してくださいeval $(minikube docker-env)
https://kubernetes.io/docs/getting-started-guides/minikube /
eval $(minikube docker-env)
この端末のみ有効です。閉じた端末が再び端末を開いてeval $(minikube docker-env)
を書き込む場合
eval $(minikube docker-env)
Minikubeでこのコードビルドイメージ
ターミナルで実行する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
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はリモートクラウドではなくローカルレジストリからイメージをプルします。
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