Kubernetes で GitLab のプライベートリポジトリーの Container Registry から Docker イメージをプルする方法

GitLab & Kubernetes

この記事のまとめ:
  • プライベートのコンテナーレジストリーの認証情報を定義する Kubernetes マニフェストファイルの作成方法をまとめています。
背景

Docker Compose で動かしていたアプリケーションを Kubernetes への移行作業をしていまして、それに合わせてそのソースコードやマニフェストファイルの管理を GitHub から GitLab に移行しています。 せっかくなので GitLab CI/CD を活用して CI/CD ができるようにしようとしています。 ただし、動かしたいアプリケーションはプライベートプロジェクトとして運用しているため、 Kubernetes で使う Docker イメージを GitLab の Container Registry から Docker イメージをプルするためにはユーザー認証が必要になります。 プライベートの Container Registry へのユーザー認証方法の一般的な説明では、マニフェストファイルを使わずに kubectl createdocker-registry タイプの Secret リソースを作って、Workloads リソースのマニフェストファイルでそれを読み込む方法が紹介されています。 ただ、kubectl create だと同じ名前の Secret リソースがすでにある場合にはエラーとなってしまうため、CD プロセスには適していません。そのため、認証用の Secret のマニフェストファイルを作ることが今回の目的です。

ちょっとややこしかったので、もう一度同じことをやる必要が出てきても、絶対に忘れているだろうと思ったので備忘録として残しておこうと思ったのがそもそもの目的です。

主な手順は次の通りです。

  1. GitLab の personal access token を作成する
    1. で作ったトークンを使った docker-registry タイプの Secret を作成する
    1. で作った 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 を作ります。

$ kubectl create \
    secret docker-registry <PULLSECRET_NAME> \
    --docker-server=https://registry.gitlab.com \
    --docker-username=<GITLAB_USERNAME> \
    --docker-password=<PERSONAL_GITLAB_ACCESS_TOKEN> \
    --docker-email=<GITLAB_EMAIL_ADDRESS>
コンテナーレジストリーの認証情報を定義するマニフェストファイルを作成する

先ほど作成した Secret を YAML 形式で表示すると次のように出力されます。

$ kubectl get secrets -o yaml gitlab-auth 
apiVersion: v1
data:
  .dockerconfigjson: eyJhXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX9fQ==
kind: Secret
metadata:
  creationTimestamp: "2020-05-03T06:08:46Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:.dockerconfigjson: {}
      f:type: {}
    manager: kubectl
    operation: Update
    time: "2020-05-03T06:08:46Z"
  name: gitlab-auth
  namespace: default
  resourceVersion: "501468"
  selfLink: /api/v1/namespaces/default/secrets/gitlab-auth-read
  uid: 7d366105-bd20-474c-b887-7a9f048c3a14
type: kubernetes.io/dockerconfigjson

ここから必要な情報だけを抜き出してマニフェストにします。最低限必要な情報は次のような情報です。後は必要に応じて編集すればよいです。

apiVersion: v1
kind: Secret
metadata:
    name: gitlab-auth
type: kubernetes.io/dockerconfigjson
data:
    .dockerconfigjson: eyJhXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX9fQ==

マニフェストファイルにしてしまえば kubectl apply -f で読み込むことができるので、CD プロセスなどで使いやすくなります。

あとは Pod を立てるときに imagePullSecrets で Secret で定義した name を指定すればよいです。

---
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  imagePullSecrets:
    - name: gitlab-auth
  containers:
    - name: test
      image: registry.gitlab.com/hassiweb/test-project/test-container:latest
      command:
        - "sh"
        - "-c"
        - "while true; do sleep 300; done"
参考

今回は以上です。 最後まで読んでいただき、ありがとうございます。

コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法