gcr.ioのプライベートレジストリからイメージを取得する

2 min読了の目安(約2400字TECH技術記事

挨拶

話題のZennで何か書きたいなーと思いつつ、何も書くことがなかった私です。
Kubernetesの勉強を始めたは良いものの、ハマっていて全然先に進んでなかったことがようやく分かったのでメモとして残します。

最近は今ごろになってKubernetesの勉強をしています。
概念は大まかに理解した。つもり。けど全然分からん。

前置き

現在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になりました🎉

watching-on-k9s.gif

また、今回の問題を調べていた中で、プライベートコンテナレジストリから取得するための認証情報もKubernetes上のsecretsを使用するんだな、ということが新たな学びがあり、さらに興味を引きつけられました。
このままでもまだアプリは動いて無くて、 まだ一歩前進 でしかないですが、これからもハマりつつ使えるよう勉強していきますー