こんにちは、サイオステクノロジー前田です。
コンテナを利用するときには、全部イメージを自分で作る以外にも、他の方の作成したイメージを再利用する方法があります。例えばlinuxのOSコンテナイメージにwebサーバをインストールし自作イメージを作成する方法があります。それよりも、webサーバを作成している公式のコンテナイメージを利用するという方法です。自分で一からコンテナイメージを作る時間を削減することが可能です。このように複数人で利用する時にはコンテナレジストリを使用することでコンテナのメリットを受けられます。
Kubernetsはオーケストレーションのため、設定なしの状態ではレジストリが存在しません。OKDではデフォルトでレジストリが存在しておりますので、本日はその利用方法と外部公開方法を記載してきます。
コンテナレジストリとは
コンテナレジストリは、Kubernetes、docker、podman等のコンテナペースのアプリケーションのコンテナイメージを格納するために利用されるリポジトリ、またはリポジトリのコレクションです。
コンテナレジストリを利用することにより、コンテナの再利用やバージョン管理等や安定したデプロイを行うことができます。私の中の簡易なイメージは下記の図のようなイメージです。
コンテナレジストリの種類
コンテナレジストリの種類として、いくつかの種類が存在します。下記にいくつか紹介します。
- Saas型
- 各種クラウド
- OSS
- Nexus Repository (Open Source Codebase)
- Project Quay
- Docker Registry
Saas型
DockerHubやQuay.ioには様々な人がコンテナイメージをアップロードしています。nginx等のwebサーバやnode等のアプリケーション用のコンテナ,wordpressやjenkins等のDocker Official imageのものや、個人でアップロードしたものなどいろいろなコンテナがあります。自分でイメージを作る以外に利用することで作業の効率化を進めることができます。
https://hub.docker.com/_/postgres?tab=description
各種クラウド
各種クラウドがコンテナレジストリを用意しています。クラウド環境でkuberntesのマネージドサービス等をを利用するときに主に選択して利用します。
OSS型
ネットワークが制限された環境や小規模の環境、Kubernetesクラスタ―内部で利用したい場合に利用します。
Kubernetes(OKD,OpenShift)のレジストリについて
生のKubernetesにはレジストリはありません。そのためレジストリを用意する必要があります。OpenShiftやOKDに関しては、Image Registryというレジストリが存在します。簡易なレジストリの機能になり、小規模の時に利用するものです。OpenShiftでエンタープライズ時の利用ではRed Hat Quayをお勧めしています。
Image Registryは構築時にデプロイされていますが、内部利用で使用できる形で、クラスター外部からのアクセスができない状態になっています。そのため、コンテナレジストリとして外部から利用する場合にはOperatorの設定変更をする必要があります。
環境情報
- kubernetes基盤: OKD v4.10
- クラスターの証明書は自己署名証明書
- 基盤: AWS
- クライアント端末: CentOS Stream release 8
- podman 利用
コンテナレジストの外部公開
コンテナレジストリへの外部アクセス可能にするため、設定変更します。
oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
コンテナレジストリのアクセスURLを確認します。
HOST=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
echo $HOST
リクエストするとコンテナレジストリとしてアクセス可能になりました。しかし、DockerHubやQuay.ioとは違いWEBブラウザからアクセスしても管理コンソール機能はないため画面は表示されません。
コンテナレジストリの操作
podmanを利用してレジストリの操作を行います。
レジストリアクセスのために認証情報が必要です。
oc whoami -t
情報が表示されない場合、管理コンソールの右上から認証情報を取得してください。その後ocコマンドで一度ログイン後に、podmanでレジストリに下記コマンドでログインしてください。エラーがでてログインできていない場合でもSucceededと表示される場合があります。
podman login -u kubeadmin -p $(oc whoami -t) $HOST --tls-verify=false
■イメージの検索
利用できるイメージを検索します。
podman serach $HOST/ --limit 10 --tls-verify=false
image-registoryからコンテナイメージを取得します。
podman pull $HOST/openshift/php --tls-verify=false
ローカルにイメージが保管されていることを確認します。
podman image ls
■イメージのアップロード
プロジェクトを作成します。
oc new-project testregistry
コンテナイメージを別のレジストリから取得します。
podman pull alpine:latest
イメージのタグ設定を行い、アップロード可能な形式に設定します。
podman tag alpine:latest $HOST/testregistry/alpine:late
イメージをプッシュします。
podman push $HOST/testregistry/alpine:late --tls-verify=false
プッシュされたイメージを確認します。
podman search $HOST/testregistry/ --tls-verify=false
イメージが存在することを確認してください。
最後に
コンテナレジストリを利用すれば、いろいろなことができます。複数人で利用や、再利用するほかに、imageを更新した時に自動的にデプロイするCI/CDのソース元のレポジトリになれます。
しかし、簡易なDocker RegistoryやOpeShiftのコンテナレジストリはシンプルなため管理コンソールがなくイメージの管理が少し難しい状態です。Red Hat QuayやNexus Repository等を利用することで運用管理しやすいコンテナレジストリとして使用できます。本記事がKubernetesで悩まれている方の手助けの一つになれば幸いです。