第9章 Bridge Operator で Red Hat Quay を OpenShift に統合
Quay Bridge Operator を使用すると、OpenShift の統合コンテナーレジストリーを Red Hat Quay レジストリーで置き換えることができます。これにより、統合された OpenShift レジストリーは、ロールベースのアクセスコントロール (RBAC) 機能が強化された、可用性の高いエンタープライズグレードの Red Hat Quay レジストリーになります。
Bridge Operator の主な目的は、統合された OpenShift レジストリーの機能を、新しい Red Hat Quay レジストリーに複製することです。この Operator で可能な機能は以下の通りです。
Red Hat Quay の組織として OpenShift の名前空間を同期させます。
- デフォルトネームスペースのサービスアカウントごとのロボットアカウントの作成
- 作成されたロボットアカウントごとにシークレットを作成 (各ロボットシークレットをサービスアカウントに Mountable と Image Pull Secret として関連付ける)。
- OpenShift の ImageStream を Quay のリポジトリーとして同期させる
- Red Hat Quay に出力するために ImageStream を使用して新しいビルドを自動的に書き換えます。
- ビルドが完了すると自動的に ImageStream タグをインポートします。
この手順を Quay Bridge Operator で使用すると、Red Hat Quay と OpenShift クラスター間の双方向通信が可能になります。
Quay Bridge Operator から同じ Red Hat Quay インスタンスを指している OpenShift Container Platform クラスターを複数にすることはできません。そうすると、2 つのクラスターに同じ名前の名前空間を作ることができなくなります。
9.1. Quay Bridge Operator の実行
9.1.1. 前提条件
Bridge Operator をセットアップする前に、以下のものを用意してください。
- スーパーユーザー権限を持つ既存の Red Hat Quay 環境
- クラスター管理者権限を持つ Red Hat OpenShift Container Platform 環境 (4.2 以降を推奨)
-
OpenShift のコマンドラインツール (
oc
コマンド)
9.1.2. OpenShift および Red Hat Quay のセットアップおよび設定
Red Hat Quay と OpenShift の両方の設定が必要です。
9.1.2.1. Red Hat Quay のセットアップ
Red Hat Quay の専用組織を作成し、その組織内で作成した新規アプリケーションから、OpenShift の Quay Bridge Operator で使用する OAuth トークンを生成します。
- スーパーユーザー権限を持つユーザーとして Red Hat Quay にログインし、外部アプリケーションを設定する組織を選択します。
- 左のナビゲーションで Applications を選択します。
-
Create New Application
を選択し、新しいアプリケーションの名前を入力します (例:openshift
)。 - 新しいアプリケーションが表示された状態で、それを選択します。
-
左側のナビゲーションで
Generate Token
を選択し、新しい OAuth2 トークンを作成します。 - すべてのチェックボックスを選択して、統合に必要なアクセスを許可します。
-
割り当てられた権限を確認し、
Authorize Application
を選択して確認します。 - 生成された Access Token は、次のセクションで使用するためにコピーして保存します。
9.1.2.2. OpenShift のセットアップ
Quay Bridge Operator に OpenShift をセットアップするには、以下のようないくつかのステップが必要です。
- OpenShift シークレットの作成: Quay で先に作成した OAuth トークンを使って、OpenShift シークレットを作成します。
- MutatingWebhookConfiguration のサポートを追加: OpenShift と Red Hat Quay の統合をサポートするために、新しい Build リクエストをインターセプトして、OpenShift の統合レジストリーではなく Red Hat Quay をターゲットにするように出力を変更できるようにします。
OpenShift の典型的なビルドプロセスの一部として実行される API リクエストの動的な傍受のサポートは、MutatingWebhookConfiguration によって促進されます。MutatingWebhookConfiguration は、特定の API リクエストを受信したときに、OpenShift 上のプロジェクト内で実行されている API を起動することができます。
Kubernetes では、Webhook エンドポイントがクラスターの証明機関を利用した証明書を用いて SSL で保護されている必要があります。幸いなことに、OpenShift はクラスターで署名された証明書の生成をサポートしています。
-
OpenShift
oc
コマンドラインツールを使用して、クラスター管理者として OpenShift にログインします。 -
openshift-operators
など、使用する OpenShift ネームスペースを選択するか、新しいネームスペースを作成します。 OpenShift のシークレットを作成し、<access_token>を先ほど Red Hat Quay から取得した Access Token に置き換えます。例えば、これはあなたの<access_token>を使って
quay-integration
というシークレットをtoken
というキーで作成します。$ oc create secret generic quay-integration --from-literal=token=<access_token>
その結果、新たに作成された秘密鍵と証明書が、指定された秘密の中に配置されます。シークレットは、Operator のデプロイメントでの宣言の通りに、オペレーター内の適切な場所にマウントされます。
Operator の Webhook エンドポイントの Service を作成します。
quay-webhook.yaml
apiVersion: v1 kind: Service metadata: labels: name: quay-bridge-operator name: quay-bridge-operator namespace: openshift-operators spec: ports: - name: https port: 443 protocol: TCP targetPort: 8443 selector: name: quay-bridge-operator sessionAffinity: None type: ClusterIP
次のように Webhook サービスを作成します。
$ oc create -f quay-webhook.yaml
- webhook-create-signed-cert.sh スクリプトをダウンロードして、Kubernetes 認証局で署名された証明書を生成するために使用できるようにします。
以下のコマンドを実行して、証明書を要求します。
$ ./webhook-create-signed-cert.sh --namespace openshift-operators \ --secret quay-bridge-operator-webhook-certs \ --service quay-bridge-operator
以下のコマンドを実行して CA を取得し、その結果を 1 行にまとめて MutatingWebhookConfiguration リソースに入力できるようにします。
$ oc get configmap -n kube-system \ extension-apiserver-authentication \ -o=jsonpath='{.data.client-ca-file}' | base64 | tr -d '\n'
以下の MutatingWebhookConfiguration の YAML で、${CA_BUNDLE}変数を置き換えてください。
quay-mutating-webhook.yaml
apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: quay-bridge-operator webhooks: - name: quayintegration.redhatcop.redhat.io clientConfig: service: namespace: openshift-operators name: quay-bridge-operator path: "/admissionwebhook" caBundle: "${CA_BUNDLE}" 1 rules: - operations: [ "CREATE" ] apiGroups: [ "build.openshift.io" ] apiVersions: ["v1" ] resources: [ "builds" ] failurePolicy: Fail matchPolicy: Exact timeoutSeconds: 30 sideEffects: None admissionReviewVersions: [v1beta1]
- 1
- ${CA_BUNDLE}を前のステップの出力で置き換えます。これは、${CA_BUNDLE}を置き換えるためにコピー&ペーストする 1 つの長い行として表示されます。
以下のように MutatingWebhookConfiguration を作成します。
$ oc create -f quay-mutating-webhook.yaml
オペレータが動作するまでは、MutatingWebhookConfiguration が呼び出す Web サーバーが利用できず、オブジェクトを etcd に永続化するために適切な is レスポンスが必要となるため、ビルドに対する新しいリクエストは失敗します。
OpenShift のコンソールに移動し、以下のように Quay Bridge Operator をインストールします。
- OperatorHub を選択し、Quay Bridge Operator を検索します。
- インストールを選択します。
- インストールモード (全ネームスペース)、更新チャンネル、承認方法 (自動または手動) を選択します。
- Subscribe を選択します。
QuayIntegration
というカスタムリソース (CR) を作成します。例:quay-integration.yaml
apiVersion: redhatcop.redhat.io/v1alpha1 kind: QuayIntegration metadata: name: example-quayintegration spec: clusterID: openshift 1 credentialsSecretName: openshift-operators/quay-integration 2 quayHostname: https://<QUAY_URL> 3 whitelistNamespaces: 4 - default insecureRegistry: false 5
- 1
- clusterID の値は、エコシステム全体で一意でなければなりません。この値はオプションで、デフォルトでは openshift が使用されます。
- 2
- credentialsSecretName には、
openshift-operators/quay-integration
を名前空間の名前と、先に作成したトークンを含むシークレットに置き換えます。 - 3
- QUAY_URL を Red Hat Quay インスタンスのホスト名に置き換えてください。
- 4
- whitelistNamespaces はオプションです。使用しない場合、Bridge Operator は openshift の接頭辞を持つプロジェクトを除くすべての名前空間を Red Hat Quay に同期します。この例では、ホワイトリストのネームスペース (デフォルト) に、Red Hat Quay の組織が関連付けられています。ここでは、好きな名前空間を使用してください。
- 5
- Quay が自己署名証明書を使用している場合、プロパティー
insecureRegistry: true
を設定します。
その結果、Red Hat Quay 内の組織は、OpenShift の関連する名前空間のために作成する必要があります。
以下のように
QuayIntegration
を作成します。$ oc create -f quay-integration.yaml
この時点で Quay の統合リソースが作成され、OpenShift クラスターと Red Hat Quay インスタンスがリンクされます。
作成したホワイトリストの名前空間には、Red Hat Quay の組織があるはずです。oc new-app
などのコマンドを使用して、その namespace で新規アプリケーションを作成する場合、内部レジストリーを使用する代わりに、作成された新しい Red Hat Quay リポジトリーが表示されます。