OpenShiftでミラーレジストリを作成してインストールする

Red HatでOpenShiftのサポートをしているid:nekopです。

インターネット非接続環境でOpenShiftを利用する場合、ミラーレジストリを作成して非接続環境でイメージをホストする必要があります。このエントリでは、実際にミラーレジストリをセットアップし、そのミラーを使ったインストールを行ないます。

このエントリではAWS上でクラスタを構成しますが、インターネット非接続環境として構成することはせず、インターネット接続環境です。ただし利用する認証情報、pull secretはミラーレジストリのものに限定しているので、本来のquay.ioに接続できてもイメージをpullすることはできない構成としています。

また、非接続環境のシナリオではイメージ群を一旦ファイルに保存、非接続環境へ持ち込んでファイルからミラーレジストリ構築、という方法をとる場合もありますが、手順はそれほど変わらないのでこのエントリでは扱いません。このエントリではファイルを経由せず、ミラーレジストリへ直接イメージをミラーします。

OpenShift 4.10.12を利用しますが、OpenShift 4.10のTechnology Preview新機能であるoc-mirror pluginは利用していません。4.6+で利用可能な現行の方法となります。

ミラーレジストリはOpenShiftのオマケで提供されているMirror registry for Red Hat OpenShiftというスタンドアロンのQuayベースのレジストリを利用します。ミラー用途以外、たとえばユーザのイメージの保存には利用できないことに注意してください。

大まかな流れ

  • ミラーレジストリホストの準備
  • ミラーレジストリのインストール
  • ミラー用pull secret作成
  • OpenShiftのイメージのミラー
  • Operatorのミラー

エントリ中ではディレクトリを整理したりする操作をはぶいています。雑多なディレクトリおよびファイル群ができるので、実際の運用に向けてはきちんと整理して実行していくほうが良いです。

Mirror registryホストの準備

以下の設定でインスタンスを作成します。Mirror registry for Red Hat OpenShiftのインストールにはpodmanを必要とするのでRHELを利用します。Amazon Linuxにはpodmanパッケージが無いので注意してください。

ミラーレジストリは8443ポートを利用するので、追加で許可します。

  • RHEL 8.5
  • m5.large (2 vCPU, 8GB memory)
  • 500GB gp3 disk
  • Security GroupでTCP 8443をallow

ミラーレジストリのインストール

事前に pull-secret.txt を以下からダウンロードしてください。

ファイルを転送してpodmanをインストールし、ミラーレジストリをインストールします。

rsync -e "ssh -i $AWS_SSH_PRIVATE_KEY" pull-secret.txt ec2-user@ec2-public-ip.ap-northeast-1.compute.amazonaws.com:
ssh -i $AWS_SSH_PRIVATE_KEY ec2-user@ec2-public-ip.ap-northeast-1.compute.amazonaws.com
sudo dnf update -y
sudo dnf install podman -y
curl -LO https://developers.redhat.com/content-gateway/file/pub/openshift-v4/clients/mirror-registry/1.1.0/mirror-registry.tar.gz
tar xf mirror-registry.tar.gz
sudo ./mirror-registry install --quayHostname ec2-public-ip.ap-northeast-1.compute.amazonaws.com --quayRoot /var/lib/quay

ミラーレジストリのinitユーザのパスワードはmirror-registry installの出力に表示されるのみとなります。ファイル上に平文保存などはされないため確実に保存してください。

ミラー用pull secret作成

インストール後に生成されるミラーレジストリのCA証明書はそのままOSに登録し、ミラーレジストリにアクセスするためのmirror-pull-secret.txtを生成します。

sudo cp /var/lib/quay/quay-rootCA/rootCA.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
podman login \
  --authfile ./mirror-pull-secret.txt \
  -u init \
  -p PASSWORD \
  ec2-public-ip.ap-northeast-1.compute.amazonaws.com:8443

ミラー処理はミラー元レジストリのpull-secret.txtとミラーレジストリのmirror-pull-secret.txtの両方を必要とするので、連結してデフォルトのauthファイル位置 ~/.config/containers/auth.json へ配置します。古いツールが ~/.docker/config.json を参照するのでリンクも作成します。JSON形式なので単純連結はできず、少し編集する必要があります。

mkdir -p ~/.config/containers/ ~/.docker/
cat mirror-pull-secret.txt pull-secret.txt > ~/.config/containers/auth.json
ln -s ~/.config/containers/auth.json ./.docker/config.json
vi ~/.config/containers/auth.json

ファイル編集してミラーレジストリのエントリ末尾にカンマ挿入、"cloud.openshift.com" 直前までを削除すれば良いです。

{
        "auths": {
                "ec2-public-ip.ap-northeast-1.compute.amazonaws.com:8443": {
                        "auth": "xxx"
                },
                "cloud.openshift.com":{...

OpenShiftのイメージのミラー

OpenShiftのイメージのミラーにはocコマンド、Operatorのミラーでopmコマンドを利用しますので、まずはそれらを配置します。

curl -LO https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/fast-4.10/openshift-client-linux-4.10.12.tar.gz
tar xf openshift-client-linux-*.tar.gz oc
sudo cp oc /usr/bin/
https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/fast-4.10/opm-linux-4.10.12.tar.gz
tar xf opm-linux-*.tar.gz opm
sudo cp opm /usr/bin/

マニュアル記載のミラー手順を実行し、openshift-installバイナリを生成します。

export OCP_RELEASE=4.10.12
export LOCAL_REGISTRY=ec2-public-ip.ap-northeast-1.compute.amazonaws.com:8443
export LOCAL_REPOSITORY='ocp4/openshift4'
export PRODUCT_REPO='openshift-release-dev'
export LOCAL_SECRET_JSON='/home/ec2-user/.config/containers/auth.json'
export RELEASE_NAME="ocp-release"
export ARCHITECTURE=x86_64
oc adm release mirror -a ${LOCAL_SECRET_JSON}  \
     --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE} \
     --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \
     --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE} 
oc adm release extract -a ${LOCAL_SECRET_JSON} --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}"

この環境では6分ほどで終了しました。

生成されたopenshift-installバイナリはミラーレジストリ上のイメージが指定されています。

$ ./openshift-install version
./openshift-install 4.10.12
built from commit 1e29cdacf65d54a7fad50683daff9e3083013ab1
release image ec2-public-ip.ap-northeast-1.compute.amazonaws.com:8443/ocp4/openshift4@sha256:f77f4f75c1e1a4ddd0a0355f298a834db3473fd9ca473235013e9419d1df16db
release architecture amd64

アップデートする場合も上記と同じ手順でアップデート先のバージョンをミラーして、oc adm upgrade --to-image=... 指定でミラー上のリリースイメージを指定します。

Operatorのミラー

Operatorは膨大な量が提供されており、通常はopm index pruneコマンドを利用して標準のindexイメージから必要なOperatorに絞ったindexイメージを作ってミラーします。今回はCluster Logging Operator, Elasticsearch Operator, Local Storage Operatorのみミラーします。

Sqlite-based catalogs are deprecated. という警告が表示されますが無視してください。File-basedカタログへの移行フェーズであるため表示される警告ですが、今時点では無視して構いません。

opm index prune \
  -f registry.redhat.io/redhat/redhat-operator-index:v4.10 \
  -p cluster-logging,elasticsearch-operator,local-storage-operator \
  -t ${LOCAL_REGISTRY}/mirror/mirror-operator-index:v4.10
podman push ${LOCAL_REGISTRY}/mirror/mirror-operator-index:v4.10
oc adm catalog mirror \
    -a ${LOCAL_SECRET_JSON}  \
    ${LOCAL_REGISTRY}/mirror/mirror-operator-index:v4.10 \
    ${LOCAL_REGISTRY} \
    --index-filter-by-os=linux/amd64

この環境では8分ほどで終了しました。

Operatorを全てミラーする場合は大量のディスクを消費するので注意してください。今回利用しているミラーレジストリホストではこの時点で50GB程度のディスク消費です。

Operatorのアップデートする場合も上記と同じ手順でindexイメージ再作成、ミラーを実行します。

OpenShiftのインストール

ミラーレジストリを利用したインストールのinstall-config.yamlでは、通常のOpenShiftのインストール項目の他に、以下の3つの項目の追加、変更が必要となります。ミラーレジストリを利用する指示となるimageContentSources, additionalTrustBundleにミラーレジストリのCA証明書、pullSecretにミラーレジストリのpull secret指定が必要になります。

  • imageContentSources
    • oc adm release mirror の出力
  • additionalTrustBundle
    • /var/lib/quay/quay-rootCA/rootCA.pem の内容
  • pullSecret
    • mirror-pull-secret.txt の内容
apiVersion: v1
(省略)
imageContentSources:
- mirrors:
  - ec2-public-ip.ap-northeast-1.compute.amazonaws.com:8443/ocp4/openshift4
  source: quay.io/openshift-release-dev/ocp-release
- mirrors:
  - ec2-public-ip.ap-northeast-1.compute.amazonaws.com:8443/ocp4/openshift4
  source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
additionalTrustBundle: |
  -----BEGIN CERTIFICATE-----
  xxx
  -----END CERTIFICATE-----
pullSecret: '{"auths": {"ec2-public-ip.ap-northeast-1.compute.amazonaws.com:8443": {"auth": "xxx"}}}'

install-config.yaml が用意できたら実際にインストールを実行します。

openshift-install create cluster

これでミラーレジストリのみを利用したOpenShiftのインストールができます。

ミラーレジストリのOperatorを利用

非接続環境およびミラーレジストリのみ接続可能な構成では、OpenShiftインストール後にopenshift-marketplace内に作成される標準のOperator indexイメージを利用するPod群がImagePullBackoffとなります。これらはquay.ioを直接参照する設定となっているので期待通りの動作となります。

マニュアル通り、disableAllDefaultSourcesを設定して標準のOperator indexイメージの利用を無効化し、これらのPodが作成されないようにします。

oc patch OperatorHub cluster --type json \
    -p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'

次にミラーしたOperatorを利用する設定です。Operatorのミラー実行時にミラーしたOperator indexイメージを指定するCatalogSource、およびOperator関連イメージにミラーを参照する設定であるimageContentSourcePolicyが生成されているので、それを作成します。

oc create -f manifests-mirror-operator-index-xxx/imageContentSourcePolicy.yaml
oc create -f manifests-mirror-operator-index-xxx/catalogSource.yaml

これでミラーしたOperatorが利用可能になり、Operatorがインストールできるようになります。

Operator一覧

インストールされたOperator一覧

マイナーバージョンアップデートの際にはCatalogSourceのimage行を書き換え、たとえば mirror-operator-index:v4.10mirror-operator-index:v4.11 に更新することでアップデートが可能になります。別のCatalogSourceとして作成してしまうと同じパッケージのアップグレードとはみなされなくなりますので注意してください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。