Kubernetes で GitLab のプライベートリポジトリーの Container Registry から Docker イメージをプルする方法
この記事のまとめ:
- プライベートのコンテナーレジストリーの認証情報を定義する Kubernetes マニフェストファイルの作成方法をまとめています。
背景
Docker Compose で動かしていたアプリケーションを Kubernetes への移行作業をしていまして、それに合わせてそのソースコードやマニフェストファイルの管理を GitHub から GitLab に移行しています。
せっかくなので GitLab CI/CD を活用して CI/CD ができるようにしようとしています。
ただし、動かしたいアプリケーションはプライベートプロジェクトとして運用しているため、 Kubernetes で使う Docker イメージを GitLab の Container Registry から Docker イメージをプルするためにはユーザー認証が必要になります。
プライベートの Container Registry へのユーザー認証方法の一般的な説明では、マニフェストファイルを使わずに kubectl create
で docker-registry
タイプの Secret リソースを作って、Workloads リソースのマニフェストファイルでそれを読み込む方法が紹介されています。
ただ、kubectl create
だと同じ名前の Secret リソースがすでにある場合にはエラーとなってしまうため、CD プロセスには適していません。そのため、認証用の Secret のマニフェストファイルを作ることが今回の目的です。
ちょっとややこしかったので、もう一度同じことをやる必要が出てきても、絶対に忘れているだろうと思ったので備忘録として残しておこうと思ったのがそもそもの目的です。
主な手順は次の通りです。
- GitLab の personal access token を作成する
-
- で作ったトークンを使った docker-registry タイプの Secret を作成する
-
- で作った Secret の情報を利用してコンテナーレジストリーの認証情報を定義するマニフェストファイルを作成する
GitLab の personal access token を作成する
GitLab の認証パスワードを使って GitLab の認証情報を作ることもできますが、こちらの記事にも説明があるとおり、Kubernetes 管理者やプロジェクトメンバーは Secret の情報の中身を見ることができるため、そのパスワードを見ることができます。そのため、トークンを使って認証したほうが、期限や権限範囲の設定が可能で、すぐに失効できるという観点でパスワードを利用するより便利です。
それではトークンを作成します。GitLab の “User Settings” から “Access Tokens” を選択します。トークンの作成画面が出てきますので、適当な値で “Name” と “Expires at” を埋めて、必要な “Scopes” にチェックし、 Create personal access token を押します。そうすると “Your New Personal Access Token” が表示されますので、値とコピーしておきます。
なお、Scopes についての十分な検証ができていませんが、Docker イメージをプルするだけでも read_registry だけでは不十分で、read_api にもチェックしておかないと動きませんでした。
docker-registry タイプの Secret を作成する
GitLab のコンテナーレジストリーの認証のための Secret のマニフェストを作るためには、base64 エンコードした dockercfg が必要です。それを作成する一番簡単な方法を探していたら、docker-registry タイプの Secret を kubectl で作ってしまうのが一番簡単そうです。
そのため、まずは kubectl で次のようなコマンドで先ほど取得したトークンを使用して docker-registry タイプの Secret を作ります。
コンテナーレジストリーの認証情報を定義するマニフェストファイルを作成する
先ほど作成した Secret を YAML 形式で表示すると次のように出力されます。
ここから必要な情報だけを抜き出してマニフェストにします。最低限必要な情報は次のような情報です。後は必要に応じて編集すればよいです。
マニフェストファイルにしてしまえば kubectl apply -f
で読み込むことができるので、CD プロセスなどで使いやすくなります。
あとは Pod を立てるときに imagePullSecrets
で Secret で定義した name
を指定すればよいです。
参考
- Kubernetes完全ガイド | 青山真也
- GitLab Container RegistryをKubernetesで利用するためのトークン入りSecretの作り方 | Qiita
- GitLab + Kubernetes: Using GitLab CI’s Kubernetes Cluster feature | Edenmal
今回は以上です。 最後まで読んでいただき、ありがとうございます。
コメント
コメントを投稿