第4章 チュートリアル
この章のチュートリアルは、OpenShift Container Platform クラスターのインストール を実行して作成されたものと同様の OpenShift インスタンスがあることを前提としています。
4.1. 新しい Red Hat Single Sign-On for OpenShift イメージバージョンのデータベースの更新
更新に関連する次の点に注意してください。
- OpenShift の以前のバージョンの Red Hat Single Sign-On からバージョン 7.6.11 へのローリング更新は、データベースおよびキャッシュに下位互換性がないため、サポートされていません。
- Red Hat Single Sign-On for OpenShift 7.6.11 で使用されるテンプレートには、PostgreSQL サーバーバージョン 13 が必要です。古い PostgreSQL バージョンがある場合は、データベースを更新する前に PostgreSQL バージョンを更新します。
- Red Hat Single Sign-On for OpenShift のバージョンのインスタンスは、アップグレード前に実行できません。同じデータベースに対して同時に実行することはできません。
- 事前に生成されたスクリプトは利用できません。それらはデータベースに応じて動的に生成されます。
データベースの更新には、次の 3 つの選択肢があります。
- 古いバージョンの PostgreSQL サーバーを使用している場合は、PostgreSQL サーバーをアップグレードしてから、データベースを移行する
- Red Hat Single Sign-On 7.6.11 が データベーススキーマを自動的に移行できるようにする
- データベースを 手動で 更新する
デフォルトでは、Red Hat Single Sign-On 7.6.11 を初めて起動すると、データベースが自動的に移行されます。
4.1.1. PostgreSQL のバージョンアップとデータベース移行
Red Hat Single Sign-On 7.6.11 テンプレートに存在する PostgreSQL サーバーは、以前に使用されていたバージョンとは異なる場合があります。たとえば、以下のシナリオについて考えてみましょう。
- PostgreSQL サーバーのバージョン 10 を使用して、PostgreSQL Pod で Red Hat Single Sign-On for OpenShift コンテナーイメージを実行しています。
- Red Hat Single Sign-On 7.6.11 コンテナーイメージでは、PostgreSQL Pod がバージョン 13 の PostgreSQL サーバーを使用する必要があります。
次の手順では、PostgreSQL のバージョンを 13 にアップグレードしてからデータベースを移行する方法について説明します。
手順
まず、データベースレベルのバックアップを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rsh <POSTGRE-SQL-POD> pg_dump -C <DATABASE> rhsso_db.bak
$ oc rsh <POSTGRE-SQL-POD> pg_dump -C <DATABASE> rhsso_db.bak
sso
Pod をスケールダウンします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale dc/sso --replicas=0
$ oc scale dc/sso --replicas=0
dc/sso-postgresql
を編集します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc edit dc/sso-postgresql
$ oc edit dc/sso-postgresql
ImageStreamTag
を:postgresql:13-el8
に切り替えます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - imageChangeParams: automatic: true containerNames: - sso-postgresql from: kind: ImageStreamTag name: postgresql:13-el8 namespace: openshift
- imageChangeParams: automatic: true containerNames: - sso-postgresql from: kind: ImageStreamTag name: postgresql:13-el8 namespace: openshift
-
sso-postgresql
Pod が実行され、安定するまで待機します。 Pod
sso-postgresql
のバージョンが正しいことを確認してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rsh dc/sso-postgresql /bin/bash -c "psql --version"
$ oc rsh dc/sso-postgresql /bin/bash -c "psql --version" psql (PostgreSQL) 13.5
変数
POSTGRESQL_UPGRADE
の設定を解除し、sso-postgresql
Pod を再度デプロイします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc set env dc/sso-postgresql POSTGRESQL_UPGRADE-
$ oc set env dc/sso-postgresql POSTGRESQL_UPGRADE-
-
sso-posgresql
Pod が実行され、安定するまで待ちます。 以下のコマンドを実行して、
openshift
プロジェクトで Red Hat Single Sign-On 7.6.11 リソースのコアセットを更新します。OpenShift 3.x クラスターを使用している場合は、以下のコマンドを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow for resource in sso76-image-stream.json \ passthrough/ocp-3.x/sso76-ocp3-https.json \ passthrough/ocp-3.x/sso76-ocp3-postgresql.json \ passthrough/ocp-3.x/sso76-ocp3-postgresql-persistent.json \ reencrypt/ocp-3.x/sso76-ocp3-x509-https.json \ reencrypt/ocp-3.x/sso76-ocp3-x509-postgresql-persistent.json
$ for resource in sso76-image-stream.json \ passthrough/ocp-3.x/sso76-ocp3-https.json \ passthrough/ocp-3.x/sso76-ocp3-postgresql.json \ passthrough/ocp-3.x/sso76-ocp3-postgresql-persistent.json \ reencrypt/ocp-3.x/sso76-ocp3-x509-https.json \ reencrypt/ocp-3.x/sso76-ocp3-x509-postgresql-persistent.json do oc replace -n openshift --force -f \ https://raw.githubusercontent.com/jboss-container-images/redhat-sso-7-openshift-image/sso76-dev/templates/${resource} done
OpenShift 4.x クラスターを使用している場合は、以下のコマンドを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow for resource in sso76-image-stream.json \ passthrough/ocp-4.x/sso76-ocp4-https.json \ passthrough/ocp-4.x/sso76-ocp4-postgresql.json \ passthrough/ocp-4.x/sso76-ocp4-postgresql-persistent.json \ reencrypt/ocp-4.x/sso76-ocp4-x509-https.json \ reencrypt/ocp-4.x/sso76-ocp4-x509-postgresql-persistent.json
$ for resource in sso76-image-stream.json \ passthrough/ocp-4.x/sso76-ocp4-https.json \ passthrough/ocp-4.x/sso76-ocp4-postgresql.json \ passthrough/ocp-4.x/sso76-ocp4-postgresql-persistent.json \ reencrypt/ocp-4.x/sso76-ocp4-x509-https.json \ reencrypt/ocp-4.x/sso76-ocp4-x509-postgresql-persistent.json do oc replace -n openshift --force -f \ https://raw.githubusercontent.com/jboss-container-images/redhat-sso-7-openshift-image/sso76-dev/templates/${resource} done
以下のコマンドを実行して、Red Hat Single Sign-On 7.6.11 OpenShift イメージストリームを
openshift
プロジェクトにインストールします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc -n openshift import-image rh-sso-7/sso76-openshift-rhel8:7.6 --from=registry.redhat.io/rh-sso-7/sso76-openshift-rhel8:7.6 --confirm
$ oc -n openshift import-image rh-sso-7/sso76-openshift-rhel8:7.6 --from=registry.redhat.io/rh-sso-7/sso76-openshift-rhel8:7.6 --confirm
Red Hat Single Sign-On 7.6.11 イメージを参照するように、既存のデプロイメント設定のイメージ変更トリガーを更新します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch dc/sso --type=json -p '[{"op": "replace", "path": "/spec/triggers/0/imageChangeParams/from/name", "value": "sso76-openshift-rhel8:7.6"}]'
$ oc patch dc/sso --type=json -p '[{"op": "replace", "path": "/spec/triggers/0/imageChangeParams/from/name", "value": "sso76-openshift-rhel8:7.6"}]' "sso" patched
イメージ変更トリガーで定義された最新のイメージに基づいて、新規の Red Hat Single Sign-On 7.6.11 イメージのロールアウトを開始します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rollout latest dc/sso
$ oc rollout latest dc/sso
sso
Pod を 1 つのレプリカにスケールアップします。注記Liveness and Readiness Probes のしきい値と値を
dc/sso
から秒単位で一時的に増やす場合があります。この手順では、最初の起動時にデータベースのアップグレードを実行します。これには時間がかかる場合があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale --replicas=1 dc/sso
$ oc scale --replicas=1 dc/sso
注記複数のレプリカがある場合は、単一のレプリカにスケールアップすることを検討してください。Red Hat Single Sign-On の起動後、レプリカの数を元に戻すことができます。
4.1.2. データベースの自動移行
このプロセスは、PostgreSQL データベース (一時的または永続的モードでデプロイ) がサポートする Red Hat Single Sign-On for OpenShift イメージの以前のバージョンを別の Pod で実行することを前提としています。
前提条件
- Preparing Red Hat Single Sign-On Authentication for OpenShift Deployment で説明されている手順を実行します。
手順
データベーススキーマを自動的に移行するには、以下の手順に従います。
Red Hat Single Sign-On for OpenShift イメージの以前のバージョンを実行して、コンテナーをデプロイするために使用されるデプロイメント設定を特定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get dc -o name --selector=application=sso
$ oc get dc -o name --selector=application=sso deploymentconfig/sso deploymentconfig/sso-postgresql
現在の名前空間で、以前のバージョンの Red Hat Single Sign-On for OpenShift イメージを実行するすべての Pod を停止します。同じデータベースに対して同時に実行することはできません。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale --replicas=0 dc/sso
$ oc scale --replicas=0 dc/sso deploymentconfig "sso" scaled
Red Hat Single Sign-On 7.6.11 イメージを参照するように、既存のデプロイメント設定のイメージ変更トリガーを更新します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch dc/sso --type=json -p '[{"op": "replace", "path": "/spec/triggers/0/imageChangeParams/from/name", "value": "sso76-openshift-rhel8:7.6"}]'
$ oc patch dc/sso --type=json -p '[{"op": "replace", "path": "/spec/triggers/0/imageChangeParams/from/name", "value": "sso76-openshift-rhel8:7.6"}]' "sso" patched
イメージ変更トリガーで定義された最新のイメージに基づいて、新規の Red Hat Single Sign-On 7.6.11 イメージのロールアウトを開始します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rollout latest dc/sso
$ oc rollout latest dc/sso deploymentconfig "sso" rolled out
変更したデプロイメント設定を使用して、Red Hat Single Sign-On 7.6.11 コンテナーをデプロイします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale --replicas=1 dc/sso
$ oc scale --replicas=1 dc/sso deploymentconfig "sso" scaled
(必要に応じて) データベースが正常に更新されたことを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pods --selector=application=sso
$ oc get pods --selector=application=sso NAME READY STATUS RESTARTS AGE sso-4-vg21r 1/1 Running 0 1h sso-postgresql-1-t871r 1/1 Running 0 2h
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc logs sso-4-vg21r | grep 'Updating'
$ oc logs sso-4-vg21r | grep 'Updating' 11:23:45,160 INFO [org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider] (ServerService Thread Pool -- 58) Updating database. Using changelog META-INF/jpa-changelog-master.xml
4.1.3. データベースの手動移行
データベース移行プロセスは、データスキーマを更新し、データの操作を実行します。このプロセスは、SQL 移行ファイルを動的に生成する前に、Red Hat Single Sign-On for OpenShift イメージの以前のバージョンを実行しているすべての Pod も停止します。
このプロセスは、PostgreSQL データベース (一時的または永続的モードでデプロイ) がサポートする Red Hat Single Sign-On for OpenShift イメージの以前のバージョンを別の Pod で実行することを前提としています。
手順
スクリプト生成のために環境を準備します。
- Red Hat Single Sign-On 7.6.11 を正しいデータソースで設定します。
standalone-openshift.xml
ファイルに以下の設定オプションを設定します。-
initializeEmpty=false
-
migrationStrategy=manual
-
migrationExport
は、出力 SQL 移行ファイルが保存される Pod のファイルシステム上の場所に移行します (例:migrationExport="${jboss.home.dir}/keycloak-database-update.sql"
)。
-
関連情報
手順
次のコマンドを実行して、データベースの SQL 移行ファイルを生成します。
OpenShift データベース移行ジョブ のテンプレートを準備し、SQL ファイルを生成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cat job-to-migrate-db-to-sso76.yaml.orig apiVersion: batch/v1 kind: Job metadata: name: job-to-migrate-db-to-sso76 spec: autoSelector: true parallelism: 0 completions: 1 template: metadata: name: job-to-migrate-db-to-sso76 spec: containers: - env: - name: DB_SERVICE_PREFIX_MAPPING value: <<DB_SERVICE_PREFIX_MAPPING_VALUE>> - name: <<PREFIX>>_JNDI value: <<PREFIX_JNDI_VALUE>> - name: <<PREFIX>>_USERNAME value: <<PREFIX_USERNAME_VALUE>> - name: <<PREFIX>>_PASSWORD value: <<PREFIX_PASSWORD_VALUE>> - name: <<PREFIX>>_DATABASE value: <<PREFIX_DATABASE_VALUE>> - name: TX_DATABASE_PREFIX_MAPPING value: <<TX_DATABASE_PREFIX_MAPPING_VALUE>> - name: <<SERVICE_HOST>> value: <<SERVICE_HOST_VALUE>> - name: <<SERVICE_PORT>> value: <<SERVICE_PORT_VALUE>> image: <<SSO_IMAGE_VALUE>> imagePullPolicy: Always name: job-to-migrate-db-to-sso76 # Keep the pod running after the SQL migration # file was generated, so we can retrieve it command: - "/bin/bash" - "-c" - "/opt/eap/bin/openshift-launch.sh || sleep 600" restartPolicy: Never
$ cat job-to-migrate-db-to-sso76.yaml.orig apiVersion: batch/v1 kind: Job metadata: name: job-to-migrate-db-to-sso76 spec: autoSelector: true parallelism: 0 completions: 1 template: metadata: name: job-to-migrate-db-to-sso76 spec: containers: - env: - name: DB_SERVICE_PREFIX_MAPPING value: <<DB_SERVICE_PREFIX_MAPPING_VALUE>> - name: <<PREFIX>>_JNDI value: <<PREFIX_JNDI_VALUE>> - name: <<PREFIX>>_USERNAME value: <<PREFIX_USERNAME_VALUE>> - name: <<PREFIX>>_PASSWORD value: <<PREFIX_PASSWORD_VALUE>> - name: <<PREFIX>>_DATABASE value: <<PREFIX_DATABASE_VALUE>> - name: TX_DATABASE_PREFIX_MAPPING value: <<TX_DATABASE_PREFIX_MAPPING_VALUE>> - name: <<SERVICE_HOST>> value: <<SERVICE_HOST_VALUE>> - name: <<SERVICE_PORT>> value: <<SERVICE_PORT_VALUE>> image: <<SSO_IMAGE_VALUE>> imagePullPolicy: Always name: job-to-migrate-db-to-sso76 # Keep the pod running after the SQL migration # file was generated, so we can retrieve it command: - "/bin/bash" - "-c" - "/opt/eap/bin/openshift-launch.sh || sleep 600" restartPolicy: Never
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cp job-to-migrate-db-to-sso76.yaml.orig \ job-to-migrate-db-to-sso76.yaml
$ cp job-to-migrate-db-to-sso76.yaml.orig \ job-to-migrate-db-to-sso76.yaml
以前のバージョンの Red Hat Single Sign-On for OpenShift イメージを実行するのに使用されるデプロイメント設定から、データソース定義およびデータベースアクセス認証情報をデータベース移行ジョブのテンプレートの適切な場所にコピーします。
以下のスクリプトを使用して、
sso
という名前のデプロイメント設定から、job-to-migrate-db-to-sso76.yaml
という名前のデータベースジョブ移行テンプレートに、DB_SERVICE_PREFIX_MAPPING
変数およびTX_DATABASE_PREFIX_MAPPING
変数の値と、特定のデータソース固有の環境変数の値 (<PREFIX>_JNDI
、<PREFIX>_USERNAME
、<PREFIX>_PASSWORD
、および<PREFIX>_DATABASE
) をコピーします。注記DB_SERVICE_PREFIX_MAPPING
環境変数では、<name>-<database_type>=<PREFIX> トリプレットのコンマ区切りリスト を値として指定することができますが、この例のスクリプトでは、デモのために 1 つのデータソースのトリプレット定義のみを受け付けます複数のデータソース定義トリプレットを処理するスクリプトを変更できます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow cat mirror_sso_dc_db_vars.sh #!/bin/bash IMPORTANT: # If the name of the SSO deployment config differs from 'sso' or if the file name of the YAML definition of the migration job is different, update the following two variables SSO_DC_NAME="sso" JOB_MIGRATION_YAML="job-to-migrate-db-to-sso76.yaml" Get existing variables of the $SSO_DC_NAME deployment config in an array declare -a SSO_DC_VARS=( \ $(oc set env dc/${SSO_DC_NAME} --list \ $(oc set env dc/${SSO_DC_NAME} --list \ | sed '/^#/d') \ | sed '/^#/d') \ ) ) Get the PREFIX used in the names of environment variables PREFIX=$( \ grep -oP 'DB_SERVICE_PREFIX_MAPPING=[^ ]+' \ grep -oP 'DB_SERVICE_PREFIX_MAPPING=[^ ]+' \ <<< "${SSO_DC_VARS[@]}" \ <<< "${SSO_DC_VARS[@]}" \ ) ) PREFIX=${PREFIX##*=} Substitute: * <<PREFIX>> with actual $PREFIX value and * <<PREFIX with "<<$PREFIX" value The order in which these replacements are made is important! sed -i "s#<<PREFIX>>#${PREFIX}#g" ${JOB_MIGRATION_YAML} sed -i "s#<<PREFIX#<<${PREFIX}#g" ${JOB_MIGRATION_YAML} Construct the array of environment variables specific to the datasource declare -a DB_VARS=(JNDI USERNAME PASSWORD DATABASE) Prepend $PREFIX to each item of the datasource array DB_VARS=( "${DB_VARS[@]/#/${PREFIX}_}" ) Add DB_SERVICE_PREFIX_MAPPING and TX_DATABASE_PREFIX_MAPPING variables to datasource array DB_VARS=( \ "${DB_VARS[@]}" \ "${DB_VARS[@]}" \ DB_SERVICE_PREFIX_MAPPING \ DB_SERVICE_PREFIX_MAPPING \ TX_DATABASE_PREFIX_MAPPING \ TX_DATABASE_PREFIX_MAPPING \ ) ) Construct the SERVICE from DB_SERVICE_PREFIX_MAPPING SERVICE=$( \ grep -oP 'DB_SERVICE_PREFIX_MAPPING=[^ ]' \ grep -oP 'DB_SERVICE_PREFIX_MAPPING=[^ ]' \ <<< "${SSO_DC_VARS[@]}" \ <<< "${SSO_DC_VARS[@]}" \ ) ) SERVICE=${SERVICE#*=} SERVICE=${SERVICE%=*} SERVICE=${SERVICE^^} SERVICE=${SERVICE//-/_} If the deployment config contains <<SERVICE>>_SERVICE_HOST and <<SERVICE>>_SERVICE_PORT variables, add them to the datasource array. Their values also need to be propagated into yaml definition of the migration job. HOST_PATTERN="${SERVICE}_SERVICE_HOST=[^ ]" PORT_PATTERN="${SERVICE}_SERVICE_PORT=[^ ]" if grep -Pq "${HOST_PATTERN}" <<< "${SSO_DC_VARS[@]}" && grep -Pq "${PORT_PATTERN}" <<< "${SSO_DC_VARS[@]}" then DB_VARS=( \ "${DB_VARS[@]}" \ "${DB_VARS[@]}" \ "${SERVICE}_SERVICE_HOST" \ "${SERVICE}_SERVICE_HOST" \ "${SERVICE}_SERVICE_PORT" \ "${SERVICE}_SERVICE_PORT" \ ) ) If they are not defined, delete their placeholder rows in yaml definition file (since if not defined they are not expanded which make the yaml definition invalid). else for KEY in "HOST" "PORT" do sed -i "/SERVICE_${KEY}/d" ${JOB_MIGRATION_YAML} done fi Substitute: * <<SERVICE_HOST>> with ${SERVICE}_SERVICE_HOST and * <<SERVICE_HOST_VALUE>> with <<${SERVICE}_SERVICE_HOST_VALUE>> The order in which replacements are made is important! Do this for both "HOST" and "PORT" for KEY in "HOST" "PORT" do PATTERN_1="<<SERVICE_${KEY}>>" REPL_1="${SERVICE}_SERVICE_${KEY}" sed -i "s#${PATTERN_1}#${REPL_1}#g" ${JOB_MIGRATION_YAML} PATTERN_2="<<SERVICE_${KEY}_VALUE>>" REPL_2="<<${SERVICE}_SERVICE_${KEY}_VALUE>>" sed -i "s#${PATTERN_2}#${REPL_2}#g" ${JOB_MIGRATION_YAML} done Propagate the values of the datasource array items into yaml definition of the migration job for VAR in "${SSO_DC_VARS[@]}" do IFS=$'=' read KEY VALUE <<< $VAR if grep -q $KEY <<< ${DB_VARS[@]} then KEY+="_VALUE" # Enwrap integer port value with double quotes if [[ ${KEY} =~ ${SERVICE}_SERVICE_PORT_VALUE ]] then sed -i "s#<<${KEY}>>#\"${VALUE}\"#g" ${JOB_MIGRATION_YAML} # Character values do not need quotes else sed -i "s#<<${KEY}>>#${VALUE}#g" ${JOB_MIGRATION_YAML} fi # Verify that the value has been successfully propagated. if grep -q '(JNDI|USERNAME|PASSWORD|DATABASE)' <<< "${KEY}" && grep -q "<<PREFIX${KEY#${PREFIX}}" ${JOB_MIGRATION_YAML} || grep -q "<<${KEY}>>" ${JOB_MIGRATION_YAML} then echo "Failed to update value of ${KEY%_VALUE}! Aborting." exit 1 else printf '%-60s%-40s\n' \ "Successfully updated ${KEY%_VALUE} to:" \ "Successfully updated ${KEY%_VALUE} to:" \ "$VALUE" "$VALUE" fi fi done
$ cat mirror_sso_dc_db_vars.sh #!/bin/bash # IMPORTANT: # # If the name of the SSO deployment config differs from 'sso' # or if the file name of the YAML definition of the migration # job is different, update the following two variables SSO_DC_NAME="sso" JOB_MIGRATION_YAML="job-to-migrate-db-to-sso76.yaml" # Get existing variables of the $SSO_DC_NAME deployment config # in an array declare -a SSO_DC_VARS=( \ $(oc set env dc/${SSO_DC_NAME} --list \ | sed '/^#/d') \ ) # Get the PREFIX used in the names of environment variables PREFIX=$( \ grep -oP 'DB_SERVICE_PREFIX_MAPPING=[^ ]+' \ <<< "${SSO_DC_VARS[@]}" \ ) PREFIX=${PREFIX##*=} # Substitute: # * <<PREFIX>> with actual $PREFIX value and # * <<PREFIX with "<<$PREFIX" value # The order in which these replacements are made is important! sed -i "s#<<PREFIX>>#${PREFIX}#g" ${JOB_MIGRATION_YAML} sed -i "s#<<PREFIX#<<${PREFIX}#g" ${JOB_MIGRATION_YAML} # Construct the array of environment variables # specific to the datasource declare -a DB_VARS=(JNDI USERNAME PASSWORD DATABASE) # Prepend $PREFIX to each item of the datasource array DB_VARS=( "${DB_VARS[@]/#/${PREFIX}_}" ) # Add DB_SERVICE_PREFIX_MAPPING and TX_DATABASE_PREFIX_MAPPING # variables to datasource array DB_VARS=( \ "${DB_VARS[@]}" \ DB_SERVICE_PREFIX_MAPPING \ TX_DATABASE_PREFIX_MAPPING \ ) # Construct the SERVICE from DB_SERVICE_PREFIX_MAPPING SERVICE=$( \ grep -oP 'DB_SERVICE_PREFIX_MAPPING=[^ ]' \ <<< "${SSO_DC_VARS[@]}" \ ) SERVICE=${SERVICE#*=} SERVICE=${SERVICE%=*} SERVICE=${SERVICE^^} SERVICE=${SERVICE//-/_} # If the deployment config contains <<SERVICE>>_SERVICE_HOST # and <<SERVICE>>_SERVICE_PORT variables, add them to the # datasource array. Their values also need to be propagated into # yaml definition of the migration job. HOST_PATTERN="${SERVICE}_SERVICE_HOST=[^ ]" PORT_PATTERN="${SERVICE}_SERVICE_PORT=[^ ]" if grep -Pq "${HOST_PATTERN}" <<< "${SSO_DC_VARS[@]}" && grep -Pq "${PORT_PATTERN}" <<< "${SSO_DC_VARS[@]}" then DB_VARS=( \ "${DB_VARS[@]}" \ "${SERVICE}_SERVICE_HOST" \ "${SERVICE}_SERVICE_PORT" \ ) # If they are not defined, delete their placeholder rows in # yaml definition file (since if not defined they are not # expanded which make the yaml definition invalid). else for KEY in "HOST" "PORT" do sed -i "/SERVICE_${KEY}/d" ${JOB_MIGRATION_YAML} done fi # Substitute: # * <<SERVICE_HOST>> with ${SERVICE}_SERVICE_HOST and # * <<SERVICE_HOST_VALUE>> with <<${SERVICE}_SERVICE_HOST_VALUE>> # The order in which replacements are made is important! # Do this for both "HOST" and "PORT" for KEY in "HOST" "PORT" do PATTERN_1="<<SERVICE_${KEY}>>" REPL_1="${SERVICE}_SERVICE_${KEY}" sed -i "s#${PATTERN_1}#${REPL_1}#g" ${JOB_MIGRATION_YAML} PATTERN_2="<<SERVICE_${KEY}_VALUE>>" REPL_2="<<${SERVICE}_SERVICE_${KEY}_VALUE>>" sed -i "s#${PATTERN_2}#${REPL_2}#g" ${JOB_MIGRATION_YAML} done # Propagate the values of the datasource array items into # yaml definition of the migration job for VAR in "${SSO_DC_VARS[@]}" do IFS=$'=' read KEY VALUE <<< $VAR if grep -q $KEY <<< ${DB_VARS[@]} then KEY+="_VALUE" # Enwrap integer port value with double quotes if [[ ${KEY} =~ ${SERVICE}_SERVICE_PORT_VALUE ]] then sed -i "s#<<${KEY}>>#\"${VALUE}\"#g" ${JOB_MIGRATION_YAML} # Character values do not need quotes else sed -i "s#<<${KEY}>>#${VALUE}#g" ${JOB_MIGRATION_YAML} fi # Verify that the value has been successfully propagated. if grep -q '(JNDI|USERNAME|PASSWORD|DATABASE)' <<< "${KEY}" && grep -q "<<PREFIX${KEY#${PREFIX}}" ${JOB_MIGRATION_YAML} || grep -q "<<${KEY}>>" ${JOB_MIGRATION_YAML} then echo "Failed to update value of ${KEY%_VALUE}! Aborting." exit 1 else printf '%-60s%-40s\n' \ "Successfully updated ${KEY%_VALUE} to:" \ "$VALUE" fi fi done
スクリプトを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow chmod +x ./mirror_sso_dc_db_vars.sh ./mirror_sso_dc_db_vars.sh
$ chmod +x ./mirror_sso_dc_db_vars.sh $ ./mirror_sso_dc_db_vars.sh Successfully updated DB_SERVICE_PREFIX_MAPPING to: sso-postgresql=DB Successfully updated DB_JNDI to: java:jboss/datasources/KeycloakDS Successfully updated DB_USERNAME to: userxOp Successfully updated DB_PASSWORD to: tsWNhQHK Successfully updated DB_DATABASE to: root Successfully updated TX_DATABASE_PREFIX_MAPPING to: sso-postgresql=DB
事前設定されたソース を使用して Red Hat Single Sign-On 7.6.11 データベース移行イメージをビルドし、ビルドが完了するまで待ちます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get is -n openshift | grep sso76 | cut -d ' ' -f1
$ oc get is -n openshift | grep sso76 | cut -d ' ' -f1 sso76-openshift-rhel8
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc new-build sso76-openshift-rhel8:7.6~https://github.com/iankko/openshift-examples.git#KEYCLOAK-8500 \ --context-dir=sso-manual-db-migration \ --name=sso76-db-migration-image
$ oc new-build sso76-openshift-rhel8:7.6~https://github.com/iankko/openshift-examples.git#KEYCLOAK-8500 \ --context-dir=sso-manual-db-migration \ --name=sso76-db-migration-image --> Found image bf45ac2 (7 days old) in image stream "openshift/sso76-openshift-rhel8" under tag "7.6" for "sso76-openshift-rhel8:7.6" Red Hat SSO 7.6.11 --------------- Platform for running Red Hat SSO Tags: sso, sso7, keycloak * A source build using source code from https://github.com/iankko/openshift-examples.git#KEYCLOAK-8500 will be created * The resulting image will be pushed to image stream "sso76-db-migration-image:latest" * Use 'start-build' to trigger a new build --> Creating resources with label build=sso76-db-migration-image ... imagestream "sso76-db-migration-image" created buildconfig "sso76-db-migration-image" created --> Success Build configuration "sso76-db-migration-image" created and build triggered. Run 'oc logs -f bc/sso76-db-migration-image' to stream the build progress.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc logs -f bc/sso76-db-migration-image --follow
$ oc logs -f bc/sso76-db-migration-image --follow Cloning "https://github.com/iankko/openshift-examples.git#KEYCLOAK-8500" ... ... Push successful
データベース移行ジョブのテンプレート (
job-to-migrate-db-to-sso76.yaml
) をビルドされたsso76-db-migration-image
イメージへの参照で更新します。イメージの docker pull 参照を取得します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PULL_REF=$(oc get istag -n $(oc project -q) --no-headers | grep sso76-db-migration-image | tr -s ' ' | cut -d ' ' -f 2)
$ PULL_REF=$(oc get istag -n $(oc project -q) --no-headers | grep sso76-db-migration-image | tr -s ' ' | cut -d ' ' -f 2)
ジョブテンプレートの <<SSO_IMAGE_VALUE>> フィールドを、プル仕様に置き換えます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow sed -i "s#<<SSO_IMAGE_VALUE>>#$PULL_REF#g" job-to-migrate-db-to-sso76.yaml
$ sed -i "s#<<SSO_IMAGE_VALUE>>#$PULL_REF#g" job-to-migrate-db-to-sso76.yaml
- フィールドが更新されていることを確認します。
ジョブテンプレートからデータベース移行ジョブをインスタンス化します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f job-to-migrate-db-to-sso76.yaml
$ oc create -f job-to-migrate-db-to-sso76.yaml job "job-to-migrate-db-to-sso76" created
重要データベースの移行プロセスでは、データスキーマの更新を処理し、データの操作を実行します。したがって、SQL 移行ファイルを動的に生成する前に、以前のバージョンの Red Hat Single Sign-On for OpenShift イメージを実行するすべての Pod を停止します。
Red Hat Single Sign-On for OpenShift イメージの以前のバージョンを実行して、コンテナーをデプロイするために使用されるデプロイメント設定を特定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get dc -o name --selector=application=sso
$ oc get dc -o name --selector=application=sso deploymentconfig/sso deploymentconfig/sso-postgresql
現在の名前空間で、以前のバージョンの Red Hat Single Sign-On for OpenShift イメージを実行するすべての Pod を停止します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale --replicas=0 dc/sso
$ oc scale --replicas=0 dc/sso deploymentconfig "sso" scaled
データベースの移行ジョブを実行し、Pod が正しく実行されるのを待機します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get jobs
$ oc get jobs NAME DESIRED SUCCESSFUL AGE job-to-migrate-db-to-sso76 1 0 3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale --replicas=1 job/job-to-migrate-db-to-sso76
$ oc scale --replicas=1 job/job-to-migrate-db-to-sso76 job "job-to-migrate-db-to-sso76" scaled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pods
$ oc get pods NAME READY STATUS RESTARTS AGE sso-postgresql-1-n5p16 1/1 Running 1 19h job-to-migrate-db-to-sso76-b87bb 1/1 Running 0 1m sso76-db-migration-image-1-build 0/1 Completed 0 27m
注記デフォルトでは、データベース移行ジョブは、移行ファイルの生成後
600 秒
後に自動的に終了します。この期間を調整できます。Pod から動的に生成された SQL データベース移行ファイルを取得します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mkdir -p ./db-update oc rsync job-to-migrate-db-to-sso76-b87bb:/opt/eap/keycloak-database-update.sql ./db-update
$ mkdir -p ./db-update $ oc rsync job-to-migrate-db-to-sso76-b87bb:/opt/eap/keycloak-database-update.sql ./db-update receiving incremental file list keycloak-database-update.sql sent 30 bytes received 29,726 bytes 59,512.00 bytes/sec total size is 29,621 speedup is 1.00
-
keycloak-database-update.sql
ファイルを調べて、Red Hat Single Sign-On 7.6.11 バージョンへの手動データベース更新で実行される変更を確認します。 データベースの更新を手動で適用します。
PostgreSQL データベース (一時的または永続的モードでデプロイ) がサポートする Red Hat Single Sign-On for OpenShift イメージの以前のバージョンを別の Pod で実行する場合は、以下のコマンドを実行します。
生成された SQL 移行ファイルを PostgreSQL Pod にコピーします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rsync --no-perms=true ./db-update/ sso-postgresql-1-n5p16:/tmp
$ oc rsync --no-perms=true ./db-update/ sso-postgresql-1-n5p16:/tmp sending incremental file list sent 77 bytes received 11 bytes 176.00 bytes/sec total size is 26,333 speedup is 299.24
PostgreSQL Pod へのシェルセッションを開始します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rsh sso-postgresql-1-n5p16
$ oc rsh sso-postgresql-1-n5p16 sh-4.2$
psql
ツールを使用して、データベースの更新を手動で適用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow alias psql="/opt/rh/rh-postgresql95/root/bin/psql" psql --version psql -U <PREFIX>_USERNAME -d <PREFIX>_DATABASE -W -f /tmp/keycloak-database-update.sql
sh-4.2$ alias psql="/opt/rh/rh-postgresql95/root/bin/psql" sh-4.2$ psql --version psql (PostgreSQL) 9.5.4 sh-4.2$ psql -U <PREFIX>_USERNAME -d <PREFIX>_DATABASE -W -f /tmp/keycloak-database-update.sql Password for user <PREFIX>_USERNAME: INSERT 0 1 INSERT 0 1 ...
重要<PREFIX>_USERNAME
および<PREFIX>_DATABASE
を、前のセクション で取得した実際のデータベースの認証情報に置き換えます。また、プロンプトが表示されたら、データベースのパスワードとして<PREFIX>_PASSWORD
の値を使用します。- PostgreSQL Pod へのシェルセッションを閉じます。イメージ変更トリガーの更新手順 に進みます。
Red Hat Single Sign-On 7.6.11 イメージを参照するように、既存のデプロイメント設定のイメージ変更トリガーを更新します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch dc/sso --type=json -p '[{"op": "replace", "path": "/spec/triggers/0/imageChangeParams/from/name", "value": "sso76-openshift-rhel8:7.6"}]'
$ oc patch dc/sso --type=json -p '[{"op": "replace", "path": "/spec/triggers/0/imageChangeParams/from/name", "value": "sso76-openshift-rhel8:7.6"}]' "sso" patched
イメージ変更トリガーで定義された最新のイメージに基づいて、新規の Red Hat Single Sign-On 7.6.11 イメージのロールアウトを開始します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc rollout latest dc/sso
$ oc rollout latest dc/sso deploymentconfig "sso" rolled out
変更したデプロイメント設定を使用して、Red Hat Single Sign-On 7.6.11 コンテナーをデプロイします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc scale --replicas=1 dc/sso
$ oc scale --replicas=1 dc/sso deploymentconfig "sso" scaled