15
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

セゾンテクノロジーAdvent Calendar 2024

Day 15

OpenShiftでECRプライベートリポジトリからコンテナイメージをプルする

Last updated at Posted at 2024-12-14

この記事は セゾンテクノロジー Advent Calendar 2024 12日目の記事です。

シリーズ2は HULFT10 のエンジニアによる投稿をお届けします。

はじめに

皆さんKubernetesやOpenShift上でプライベートリポジトリのコンテナをpullしたいことありませんか?

例えば、開発中のコンテナアプリケーションはプライベートリポジトリで管理していて、それをpullしたいとか。

今回はECRを例にOpenShiftでプライベートリポジトリからのコンテナイメージをプルする方法を書き残します。

前提条件

  • OpenShiftクラスタが準備できている
  • ocコマンドがインストールされている
  • AWSアカウントを持っている
  • Amazon ECRのプライベートリポジトリにコンテナイメージを保管している

手順

AWS認証情報を取得する

ocコマンドを実行する環境でAWSの認証情報を環境変数にセットします。
具体的には以下3つを準備します。

ecport AWS_ACCOUNT_ID="AWSのアカウントID"
export AWS_ACCESS_KEY_ID="AWSのアクセスキー"
export AWS_SECRET_ACCESS_KEY="AWSのシークレットアクセスキー"

Secretを作る

プライベートリポジトリの認証情報を保持するイメージプルシークレットを作成します。

ECRからpullする場合は、docker-passwordとしてECRの認可トークンをセットする必要があるので、直接aws ecr get-login-passwordを呼び出してパスワードとしてセットします。

oc create secret docker-registry private-image-pull-secret \
   --docker-server=${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com \
   --docker-username=AWS --docker-password=$(aws ecr get-login-password)

Podを実行する

Podのマニフェストファイルを作成します。
このとき先ほど作ったイメージプルシークレットをimagePullSecretsとして紐づけます。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  imagePullSecrets:
    - name: private-image-pull-secret # 事前に作成したイメージプルシークレット名
  containers:
    - name: test
      image: ecr-pull-image:latest # 任意のECRのコンテナイメージ名

以下のコマンドでPodを作成します。

oc apply -f test-pod.yaml

Podの起動確認

Podが正常に起動しているかを確認してみます

oc get pod test-pod

Runningとなっており、無事プライベートリポジトリからイメージをpullしてコンテナを起動できていることが分かりました。

NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          27s

注意事項

このイメージプルシークレットは永続利用できません。
なぜならECRの認可トークンには12時間の有効期限があるからです。

そのためECRからプルする場合は12時間ごとにイメージプルシークレットの再登録が必要になります。
この更新を手動でやるのはあまりにも面倒なのでCronJobなどで自動化すると良いんじゃないかな思います。

最後に

今回はシンプルにするためにPodに直接紐づけてECRプライベートリポジトリからプルしました。

実際にはPodに直接イメージプルシークレットを紐づけることはあんまりなく、DeploymentやJob, 各種カスタムリソースなどのPodの上位リソースのimagePullSecretsに紐づけたり、それら上位リソースに紐づくServiceAccountのimagePullSecretsに紐づけたりして、最終的にPodまで伝播させるほうが一般的なんじゃないかなと思います。

ECRのプライベートリポジトリをプルする際の参考にしてみてください。

余談

OpenShiftはKubernetesと互換性があるので、ocの部分をkubectlに入れ替えるだけでKubernetesでも同様の手順でECRプライベートリポジトリからpullできると思います。(動作確認はしてないですがおそらくいけるはず)

15
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?