最近は今ごろになってKubernetesの勉強をしています。
概念は大まかに理解した。つもり。けど全然分からん。
Zennで書いた記事のミラー。なので、以下同じ内容。
前置き
現在Google Cloudの無料期間を利用しつつ色々試しているのですが、Google Container Registry(gcr.io)にホストしたコンテナイメージをminikubeで構築しているローカルの環境から取得する際に、プライベートリポジトリだと認証処理が必要になります。
Kubernetesでもこのあたりはもちろん考慮されていて、Dockerレジストリで使用されるログイン認証に準拠した仕組みが準備されています。
が、如何せんうまく認証されない。普通にリポジトリパスを指定しても、PullImageError
となってしまう。
エラーログを見ると、認証方法を確認しろ(意訳)というメッセージとともに GCRでの認証方法を案内するページ へのリンクが出ているので確認し、手順に則って見るも、うまくできない🤔
前提条件
- GCPのGoogle Container Registoryにホストしているイメージを使用したい
- コンテナレジストリはプライベートのため認証が必要
docker
コマンドを利用したレジストリへのイメージのPush/Pullは問題なく行える
こんな感じで2週間くらいハマっていたのですが、情報を探してもなかなか今回のケースを解消できるものがなかなか見つからない…😞
マニフェストファイル
マニフェストファイルは下記の様にdeploymentを記述してました。
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
name: app
namespace: default
spec:
selector:
matchLabels:
name: app
replicas: 2
template:
spec:
containers:
- name: app-php
image: gcr.io/<GCP_PROJECT_ID>/<IMAGE_NAME>:latest
ports:
- containerPort: 9000
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: gcr-secret
metadata:
labels:
name: app
namespace: default
結論
こちらの記事を参考にしました。
Using Google Container Registry with Kubernetes
https://blog.container-solutions.com/using-google-container-registry-with-kubernetes
この記事内の「Access Token」での取得でこの問題をクリアできました。
kubectl create secret docker-registry gcr-access-token \
--docker-server=gcr.io \
--docker-username=oauth3accesstoken \
--docker-password="$(gcloud auth print-access-token)" \
--docker-email=your-email@example.com
kubectl patch serviceaccount default \
-p '{"imagePullSecrets": [{"name": "gcr-json-key"}]}'
2つめの kubectl patch serviceaccount
はこれまで実行してなかったので、これをしていないことで認証できていなかった可能性があります。
上記の後、 kubectl apply -f ./deployment.yaml
を実行すると、無事すべてのコンテナのステータスがRunningになりました🎉
また、今回の問題を調べていた中で、プライベートコンテナレジストリから取得するための認証情報もKubernetes上のsecretsを使用するんだな、ということが新たな学びがあり、さらに興味を引きつけられました。
このままでもまだアプリは動いて無くて、 まだ一歩前進 でしかないですが、これからもハマりつつ使えるよう勉強していきます。