この記事は セゾンテクノロジー 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できると思います。(動作確認はしてないですがおそらくいけるはず)