第2章 クラスターの自動インプレースアップグレードの実行


2.1. インプレースアップグレードの概要

標準の「クラスターインストール」を使用してインストールしており、使用したインベントリーファイルが利用できる場合には、アップグレード Playbook を使用して OpenShift クラスターのアップグレードプロセスを自動化できます。

OpenShift Container Platform 3.10 では、クラスターのアーキテクチャーに大きな変更がありました。この点については、『OpenShift Container Platform 3.10 リリースノート』で詳しく説明しています。以下のセクションでは、これらの特筆すべき技術的な変更点が、OpenShift Container Platform 3.9 からのアップグレードプロセスにどのような影響を与えるかを説明します。

2.1.1. ノードグループおよびホストマッピングの定義

OpenShift Container Platform 3.10 以降では、ノードの設定はマスターから「ブートストラップ」されるようになりました。ノードサービスが起動されると、ノードは、kubeconfig および他のノード設定ファイルが存在するかどうかをクラスターに参加する前に確認します。存在しない場合には、ノードはマスターから設定をプルしてから、クラスターに参加します。

このプロセスが導入され、管理者はノードホストごとに一意にノード設定を手動でメンテナンスする必要がなくなり、ノードホストの /etc/origin/node/node-config.yaml ファイルの内容がマスターから取得する ConfigMaps により提供されるようになりました。

どのノードホストにどの ConfigMap を使用するかをマッピングするには、インベントリーファイルにホストごとに ノードグループ を定義してから設定する必要があります。これらの手順は、「自動化アップグレードの準備」のセクションで取り扱います。

ノードの ConfigMaps

ノード設定の定義用の ConfigMaps は openshift-node プロジェクトで利用できる必要があります。ConfigMaps はノードラベルの信頼できる定義となり、以前の openshift_node_labels の値は事実上、無視されます。

インストーラーには Playbook が含まれており、以下のデフォルトの ConfigMaps を作成します。

  • node-config-master
  • node-config-infra
  • node-config-compute

以下の ConfigMaps も作成され、複数のロールにノードをラベル付けします。

  • node-config-all-in-one
  • node-config-master-infra
重要

ノードホストの /etc/origin/node/node-config.yaml ファイルには変更を加えないようにしてください。このファイルは、ノードが使用する ConfigMap に定義されている設定により上書きされます。

ノードグループの定義

openshift-ansible パッケージのアップグレード後に、ノードグループ定義のデフォルトセットが /usr/share/ansible/openshift-ansible/roles/openshift_facts/defaults/main.yml ファイルの YAML 形式ではどのようになっているかを確認できます。

openshift_node_groups:
  - name: node-config-master 1
    labels:
      - 'node-role.kubernetes.io/master=true' 2
    edits: [] 3
  - name: node-config-infra
    labels:
      - 'node-role.kubernetes.io/infra=true'
    edits: []
  - name: node-config-compute
    labels:
      - 'node-role.kubernetes.io/compute=true'
    edits: []
  - name: node-config-master-infra
    labels:
      - 'node-role.kubernetes.io/infra=true,node-role.kubernetes.io/master=true'
    edits: []
  - name: node-config-all-in-one
    labels:
      - 'node-role.kubernetes.io/infra=true,node-role.kubernetes.io/master=true,node-role.kubernetes.io/compute=true'
    edits: []
1
ノードのグループ名
2
ノードのグループに関連付けられるノードラベルの一覧
3
ノードグループの設定に対する編集

インベントリーファイルの [OSEv3:vars] グループに openshift_node_groups 変数が設定されていない場合には、上記で定義したデフォルト値が使用されます。ただし、これらのデフォルト値とは違う値を使用する場合には、インベントリーファイルに (任意の全ノードグループなど) openshift_node_groups の構造全体を定義する必要があります。

openshift_node_groups の値は、デフォルト値とマージされないので、YAML 定義を先に Python ディクショナリーに変換する必要があります。その後に、edits フィールドを使用して、鍵と値のペアを指定して任意のノード設定変数に変更できます。

注記

設定可能なノード変数に関する情報は、「マスターとノード設定ファイル」を参照してください。

たとえば、インベントリーファイルの以下のエントリーは、node-config-masternode-config-infra および node-config-compute という名前のグループを定義し、node-config-compute の ConfigMap を編集して kubeletArguments.pods-per-core20 に設定します。

openshift_node_groups=[{'name': 'node-config-master', 'labels': ['node-role.kubernetes.io/master=true']}, {'name': 'node-config-infra', 'labels': ['node-role.kubernetes.io/infra=true',]}, {'name': 'node-config-compute', 'labels': ['node-role.kubernetes.io/compute=true'], 'edits': [{ 'key': 'kubeletArguments.pods-per-core','value': ['20']}]}]

openshift_node_group.yml Playbook が実行されるたびに、edits フォールドで定義した変更により、関連の ConfigMap (この例では node-config-compute) が更新され、最終的にホスト上のノードの設定ファイルに影響を与えます。

2.1.2. アップグレードのワークフロー

3.9 から 3.10 へのコントロールプレーンの自動アップグレードでは、以下の手順が実行されます。

  • 復元の目的ですべての etcd データのバックアップを作成する。
  • API およびコントローラーを 3.9 から 3.10 に更新する。
  • 内部データ構造を 3.10 に更新する。
  • デフォルトルーター (ある場合) を 3.9 から 3.10 に更新する。
  • デフォルトレジストリー (ある場合) を 3.9 から 3.10 に更新する。
  • デフォルトイメージストリームおよび InstantApp テンプレートを更新する。

3.9 から 3.10 へのノードの自動アップグレードではノードのローリングアップデートを実行し、以下が行われます。

  • ノードのサブセットにスケジュール対象外 (unschedulable) のマークを付け、それらのノードを Pod からドレイン (解放) します。
  • 3.9 から3.10 にノードコンポーネントを更新します。
  • ローカルの設定から、ブートストラップされた TLS および Config に変換します。
  • systemd サービスから DaemonSets に SDN コンポーネントを変換します。
  • それらのノードをサービスに返します。
重要
  • アップグレードに進む前に、すべての「前提条件」を満たしていることを確認します。前提条件を満たしていないと、アップグレードが失敗する可能性があります。
  • GlusterFS を使用している場合は、「コンテナー化された GlusterFS を使用する場合の特別な考慮事項」を参照してからアップグレードを行ってください。
  • GCE 永続ディスク (gcePD) を使用している場合は、「gcePD を使用する場合の特別な考慮事項」を参照してからアップグレードを行ってください。
  • アップグレードの前日に、OpenShift Container Platform ストレージの移行を検証して、サービスを停止する前に考えられる問題を解決しておくようにしてください。

    $ oc adm migrate storage --include=* --loglevel=2 --confirm --config /etc/origin/master/admin.kubeconfig

自動化されたアップグレード Playbook は、インベントリーファイルと共に ansible-playbook コマンドを使用して Ansible で直接実行されます。これは通常インストール (advanced installation) 方式と同様です。以下のいずれのシナリオでも、同じ v3_10 アップグレード Playbook を使用することができます。

  • 既存の OpenShift Container Platform 3.9 クラスターの 3.10 へのアップグレード
  • 既存の OpenShift Container Platform 3.9 クラスターの最新の「非同期エラータ更新」へのアップグレード

2.2. 自動アップグレードの準備

重要

OpenShift Container Platform 3.10 にクラスターをアップグレードする前に、クラスターを「バージョン 3.9 の最新の非同期リリース」にアップグレードしておく必要があります。クラスターが 3.9 以前のバージョンの場合には、先に 1 バージョンごとにアップグレードしてください。たとえば、3.6 から 3.7 にアップグレードし、3.7 から 3.9 (バージョン 3.8 は「省略されました」) にアップグレードしてください。

注記

アップグレードを試行する前に、「環境ヘルスチェック」のガイダンスに従い、クラスターの健全性を確認します。これにより、ノードが Ready 状態で、必要とされる開始バージョンを実行していることが分かり、診断エラーまたは警告がないことを確認できます。

自動アップグレードを準備するには、以下を実行します。

  1. RHSM から最新のサブスクリプションデータをプルします。

    # subscription-manager refresh
  2. OpenShift Container Platform 3.9 から 3.10 にアップグレードする場合には、以下を行います。

    1. 後で OpenShift Container Platform 3.9 にダウングレードする場合に必要となる以下のファイルをバックアップします。

      1. マスターホストで、以下のファイルをバックアップします。

        /usr/lib/systemd/system/atomic-openshift-master-api.service
        /usr/lib/systemd/system/atomic-openshift-master-controllers.service
        /etc/sysconfig/atomic-openshift-master-api
        /etc/sysconfig/atomic-openshift-master-controllers
        /etc/origin/master/master-config.yaml
        /etc/origin/master/scheduler.json

        コントロールプレーンの静的 Pod のアーキテクチャーに変更が加えられるので、systemd ファイルはアップグレード時に削除されます。

      2. ノードのホストで (ノードのコンポーネントが含まれるマスターなど)、以下のファイルをバックアップします。

        /usr/lib/systemd/system/atomic-openshift-*.service
        /etc/origin/node/node-config.yaml
      3. etcd ホストで (etcd が共存するマスターなど)、以下のファイルをバックアップします。

        /etc/etcd/etcd.conf
    2. アップグレードプロセスでは、復元の目的で全 etcd データのバックアップを作成しますが、/backup/etcd-xxxxxx/backup.db に最新の etcd のバックアップがあることを確認してから続行してください。etcd の手動でのバックアップ手順は、『Day 2 操作ガイド』に記載されています。
    3. 手作業で、各マスターおよびノードホストの 3.9 リポジトリーを無効にして、3.10 レポジトリーを有効にします。rhel-7-server-ansible-2.4-rpms リポジトリーをまだ有効にしていない場合には、有効にしてください。

      # subscription-manager repos --disable="rhel-7-server-ose-3.9-rpms" \
          --enable="rhel-7-server-ose-3.10-rpms" \
          --enable="rhel-7-server-rpms" \
          --enable="rhel-7-server-extras-rpms" \
          --enable="rhel-7-server-ansible-2.4-rpms" \
          --enable="rhel-7-fast-datapath-rpms"
      # yum clean all
    4. アップグレード Playbook を実行するホストで、最新版の openshift-ansible パッケージが設定されているようにしてください。

      # yum update -y openshift-ansible
      注記

      以前の OpenShift Container Platform リリースでは、この手順で atomic-openshift-utils パッケージがインストールされていましたが、OpenShift Container Platform 3.10 以降ではこのパッケージが削除され、openshift-ansible パッケージが必要な項目をすべて提供します。

    5. インベントリーファイルの [OSEv3:vars] グループに openshift_node_groups 変数が設定されていない場合には、openshift_node_group.yml playbook の実行時に、ノードグループと ConfigMaps のデフォルトセットが作成されます。デフォルト値と違う値を使用する場合には、「ノードグループとホストマッピングの定義」に記載されているように、Python ディクショナリー形式を使用して全ノードグループセットを定義し、以下のように namelabels および edits を指定して ConfigMaps を変更します。

      [OSEv3:vars]
      
      openshift_node_groups=[{'name': 'node-config-master', 'labels': ['node-role.kubernetes.io/master=true']}, {'name': 'node-config-infra', 'labels': ['node-role.kubernetes.io/infra=true',]}, {'name': 'node-config-compute', 'labels': ['node-role.kubernetes.io/compute=true'], 'edits': [{ 'key': 'kubeletArguments.pods-per-core','value': ['20']}]}]
    6. OpenShift Container Platform 3.9 クラスターが新規ノードグループの定義とマッピングを使用するように変換するには、[nodes] インベントリーグループで以前に定義した全ホストに openshift_node_group_name を割り当てる必要があります。この値を使用して、各ノードを設定する ConfigMap を選択します。

      例:

      [nodes]
      master[1:3].example.com openshift_node_group_name='node-config-master'
      infra-node1.example.com openshift_node_group_name='node-config-infra'
      infra-node2.example.com openshift_node_group_name='node-config-infra'
      node1.example.com openshift_node_group_name='node-config-compute'
      node2.example.com openshift_node_group_name='node-config-compute'

      さらに、openshift_node_labels 設定がある場合には、既存のホストエントリーの [nodes] グループから削除します。ノードラベルは、ホストの openshift_node_group_name と関連付けられている ConfigMap で定義されるはずです。

    7. アップグレードプロセスは、openshift-node プロジェクトのノードをブートストラップするのに必要な新しい ConfigMaps を配置するまでブロックされます。以下の Playbook を実行して作成したデフォルト値を使用します (または、以前の手順で openshift_node_groups の構造を定義した場合には、カスタムのセットが作成されます)。

      # ansible-playbook -i </path/to/inventory/file> \
          /usr/share/ansible/openshift-ansible/playbooks/openshift-master/openshift_node_group.yml
    8. 各 ConfigMap が想定どおりに作成、定義されていることを慎重に検証します。openshift-node プロジェクトの全 ConfigMaps 一覧を取得します。

      $ oc get configmaps -n openshift-node

      次に oc describe を使用して個別に検証します。

      $ oc describe configmaps -n openshift-node <configmap_name>
  3. (初期インストールまたは最近のクラスターのアップグレードなどで) Ansible Playbook を最後に実行した後にマスターまたはノード設定ファイルに設定変更を手動で加えた場合は、「Ansible インベントリーファイルの設定」を参照してください。手動で加えた変更に関連する変数については、アップグレードの実行前に同等の変更をインベントリーファイルに適用してください。これを実行しないと、手動による変更がアップグレード時にデフォルト値で上書きされ、Pod が適切に実行されなくなるか、または他のクラスターの安定性に問題が生じる可能性があります。

    とくに、マスター設定ファイルの admissionConfig 設定に変更を加えた場合は、「Ansible インベントリーファイルの設定」openshift_master_admission_plugin_config 変数を確認してください。これを確認しない場合、ClusterResourceOverride 設定を事前に手動で設定している場合には (「マスターでのオーバーコミットの設定」など)、Pod が Pending 状態のままになる可能性があります。

上記を確認した後に、以下のセクションでアップグレードプロセスのしくみをさらに確認し、カスタマイズする場合はアップグレードの追加のカスタマイズオプションについて決定します。アップグレードを実行する準備が整ったら、「最新の OpenShift Container Platform 3.10 リリースへのアップグレード」に進んでください。

2.2.1. コントロールプレーンとノードの別フェーズでのアップグレード

OpenShift Container Platform クラスターは 1 つまたは複数のフェーズでアップグレードできます。単一の Ansible Playbook を実行してすべてのホストを 1 つのフェーズでアップグレードすることも、別々の Playbook を使用して コントロールプレーン (マスターコンポーネント) およびノードを複数のフェーズでアップグレードすることもできます。

注記

完全なアップグレードプロセスおよびこれらの Playbook を呼び出すタイミングについては、「最新の OpenShift Container Platform 3.10 リリースへのアップグレード」に説明されています。

複数のフェーズでアップグレードする場合、コントロールプレーンのフェーズには、以下のアップグレードが含まれます。

  • マスターコンポーネント
  • マスターで実行されるノードサービス
  • マスターで実行される Docker または CRI-O
  • スタンドアロン etcd ホストで実行される Docker または CRI-O

ノードのみをアップグレードする場合、コントロールプレーンはすでにアップグレードされている必要があります。ノードのフェーズには、以下のアップグレードが含まれます。

  • スタンドアロンノードで実行されるノードサービス
  • スタンドアロンノードで実行される Docker または CRI-O
注記

マスターコンポーネントを実行するノードは、ノードサービスや Docker が実行されている場合でもノードのアップグレードフェーズには含まれず、それらはコントロールプレーンのアップグレードフェーズの一環としてアップグレードされます。これは、マスターのノードサービスおよび Docker のアップグレードが 2 回 (1 回目はコントロールプレーンのフェーズ、2 回目はノードのフェーズ) 実行されないようにします。

2.2.2. ノードのアップグレードのカスタマイズ

アップグレードを単一または複数フェーズのいずれで実行する場合でも、-e オプションを使って特定の Ansible 変数をアップグレード Playbook に渡すことで、アップグレードのノード部分の処理方法をカスタマイズできます。

注記

完全なアップグレードプロセスおよびこれらの Playbook を呼び出すタイミングについては、「最新の OpenShift Container Platform 3.10 リリースへのアップグレード」に説明されています。

openshift_upgrade_nodes_serial 変数は整数またはパーセンテージに設定して同時にアップグレードできるノードホストの数を制御できます。デフォルトは 1 であり、この場合ノードは一度に 1 つずつアップグレードされます。

たとえば、一度に検出されるノードの全体数の 20 パーセントをアップグレードするには、以下を実行します。

$ ansible-playbook -i <path/to/inventory/file> \
    </path/to/upgrade/playbook> \
    -e openshift_upgrade_nodes_serial="20%"

openshift_upgrade_nodes_label 変数を指定すると、特定のラベルを持つノードのみをアップグレードするように指定できます。これは openshift_upgrade_nodes_serial 変数と組み合わせて使用することもできます。

たとえば、group1 リージョンのノードのみを一度に 2 つアップグレードするには、以下を実行します。

$ ansible-playbook -i <path/to/inventory/file> \
    </path/to/upgrade/playbook> \
    -e openshift_upgrade_nodes_serial="2" \
    -e openshift_upgrade_nodes_label="region=group1"
注記

ノードラベルに関する詳細は、「ノードの管理」を参照してください。

openshift_upgrade_nodes_max_fail_percentage 変数を使用すると、各バッチで失敗するノードの数を指定できます。失敗のパーセンテージは Playbook がアップグレードを中止する前に指定した値を上回っている必要があります。

openshift_upgrade_nodes_drain_timeout 変数を使用すると、終了前の待機時間の長さを指定できます。

以下の例では、一度に 10 ノードをアップグレードして、20 パーセントを超えるノードが失敗する場合にはアップグレードが中断されます。ノードをドレイン (解放) するまでに 600 秒の待機時間があります。

$ ansible-playbook -i <path/to/inventory/file> \
    </path/to/upgrade/playbook> \
    -e openshift_upgrade_nodes_serial=10 \
    -e openshift_upgrade_nodes_max_fail_percentage=20 \
    -e openshift_upgrade_nodes_drain_timeout=600

2.2.3. Ansible Hook を使用したアップグレードのカスタマイズ

OpenShift Container Platform のアップグレード時の特定の操作の実行中に、Hook というシステムでカスタムタスクを実行できます。Hook を使うと、管理者はアップグレード時の特定分野の前後に実行するタスクを定義するファイルを指定できます。これは、OpenShift Container Platform のアップグレード時にカスタムインフラストラクチャーを検証し、変更するのに非常に便利です。

Hook が失敗すると操作も失敗することに留意してください。つまり、Hook が適切であると複数回実行でき、同じ結果を出せます。適切な Hook にはべき等性があります。

2.2.3.1. 制限

  • Hook には定義され、バージョン付けされたインターフェースがありません。Hook は内部の openshift-ansible 変数を使用できますが、それらの変数が今後のリリースでもそのまま残される保証はありません。また、Hook は今後バージョン付けされる可能性があります。これは Hook が最新の openshift-ansible と連動するように更新する必要があることを示す警告となります。
  • Hook にはエラー処理機能がなく、Hook にエラーが生じると、アップグレードプロセスは中止します。その場合、問題に対応してからアップグレードを再実行する必要があります。

2.2.3.2. Hook の使用

Hook は ホスト インベントリーファイルの OSEv3:vars セクションに定義されます。

各 Hook は Ansible タスクを定義する YAML ファイルをポイントする必要があります。このファイルは include として使用されます。つまり、このファイルは Playbook にすることはできず、タスクのセットである必要があります。あいまいさを避けるために Hook ファイルへの絶対パスを使用することがベストプラクティスとして推奨されます。

インベントリーファイルの Hook 定義の例

[OSEv3:vars]
openshift_master_upgrade_pre_hook=/usr/share/custom/pre_master.yml
openshift_master_upgrade_hook=/usr/share/custom/master.yml
openshift_master_upgrade_post_hook=/usr/share/custom/post_master.yml

openshift_node_upgrade_pre_hook=/usr/share/custom/pre_node.yml
openshift_node_upgrade_hook=/usr/share/custom/node.yml
openshift_node_upgrade_post_hook=/usr/share/custom/post_node.yml

pre_master.yml タスクの例

---
# Trivial example forcing an operator to ack the start of an upgrade
# file=/usr/share/custom/pre_master.yml

- name: note the start of a master upgrade
  debug:
      msg: "Master upgrade of {{ inventory_hostname }} is about to start"

- name: require an operator agree to start an upgrade
  pause:
      prompt: "Hit enter to start the master upgrade"

2.2.3.3. 利用可能なアップグレードフック

表2.1 マスターアップグレードのフック
フック名説明

openshift_master_upgrade_pre_hook

  • 各マスターのアップグレード に実行します。
  • このフックは 各マスター に対して連続して実行されます。
  • タスクが異なるホストに対して実行される必要がある場合、該当するタスクは delegate_to または local_action を使用する必要があります。

openshift_master_upgrade_hook

  • 各マスターのアップグレード に実行しますが、そのサービスまたはシステムの再起動 に実行します。
  • このフックは 各マスター に対して連続して実行されます。
  • タスクが異なるホストに対して実行される必要がある場合、該当するタスクは delegate_to または local_action を使用する必要があります。

openshift_master_upgrade_post_hook

  • 各マスターをアップグレードし、そのサービスまたはシステムが再起動した に実行します。
  • このフックは 各マスター に対して連続して実行されます。
  • タスクが異なるホストに対して実行される必要がある場合、該当するタスクは delegate_to または local_action を使用する必要があります。
表2.2 ノードアップグレードのフック
フック名説明

openshift_node_upgrade_pre_hook

  • 各ノードのアップグレード に実行します。
  • このフックは ノードごと に順に実行されます。
  • タスクが異なるホストに対して実行される必要がある場合、該当するタスクは delegate_to または local_action を使用する必要があります。

openshift_node_upgrade_hook

  • 各ノードのアップグレード で、かつ、もう一度スケジューリング可能とマークされる に実行します。
  • このフックは ノードごと に順に実行されます。
  • タスクが異なるホストに対して実行される必要がある場合、該当するタスクは delegate_to または local_action を使用する必要があります。

openshift_node_upgrade_post_hook

  • 各ノードのアップグレード に実行します。これは、ノードのアップグレードアクションの中で 最後 となります。
  • このフックは ノードごと に順に実行されます。
  • タスクが異なるホストに対して実行される必要がある場合、該当するタスクは delegate_to または local_action を使用する必要があります。

2.3. 最新の OpenShift Container Platform 3.10 リリースへのアップグレード

既存の OpenShift Container Platform 3.9 または 3.10 クラスターを最新の 3.10 リリースにアップグレードするには、以下を実行します。

  1. 自動化アップグレードの準備」のステップを満たしていることを確認した上で、最新のアップグレード Playbook を使用していることを確認します。
  2. インベントリーファイルの openshift_deployment_type パラメーターが openshift-enterprise に設定されていることを確認します。
  3. ホストのローリングおよび完全なシステムの再起動を実行する必要がある場合は、インベントリーファイルの openshift_rolling_restart_mode パラメーターを system に設定できます。これを設定しないと、デフォルト値の services が HA マスターのローリングサービスの再起動を実行しますが、システムの再起動は実行しません。詳細については、「クラスター変数の設定」を参照してください。
  4. この時点で、アップグレードを単一フェーズで実行するか、または複数フェーズで実行するかを選択できます。各フェーズでアップグレードされるコンポーネントについての詳細は、「コントールプレーンとノードの別フェーズでのアップグレード」を参照してください。

    インベントリーファイルがデフォルトの /etc/ansible/hosts 以外の場所に置かれている場合、-i フラグを追加してその場所を指定します。以前に atomic-openshift-installer コマンドを使用してインストールを実行したことがある場合は、必要に応じて ~/.config/openshift/hosts で最後に使用されたインベントリーファイルを確認できます。

    • オプション A: 単一フェーズでコントロールプレーンおよびノードをアップグレードします。

      upgrade.yml Playbook を実行し、1 つの Playbook を使用して単一フェーズでクラスターのアップグレードを実行します。ここでも、まずコントロールプレーンをアップグレードしてからノードのインプレースアップグレードが実行されます。

      # ansible-playbook -i </path/to/inventory/file> \
          /usr/share/ansible/openshift-ansible/playbooks/byo/openshift-cluster/upgrades/v3_10/upgrade.yml
    • オプション B: 別々のフェーズでコントロールプレーンおよびノードをアップグレードします。

      1. コントロールプレーンのみを実行するには、upgrade_control_plane.yaml Playbook を実行します。

        # ansible-playbook -i </path/to/inventory/file> \
            /usr/share/ansible/openshift-ansible/playbooks/byo/openshift-cluster/upgrades/v3_10/upgrade_control_plane.yml
      2. ノードのみを実行するには、upgrade_nodes.yaml Playbook を実行します。

        # ansible-playbook -i </path/to/inventory/file> \
            /usr/share/ansible/openshift-ansible/playbooks/byo/openshift-cluster/upgrades/v3_10/upgrade_nodes.yml \
            [-e <customized_node_upgrade_variables>] 1
        1
        必要な <customized_node_upgrade_variables> については、「ノードのアップグレードのカスタマイズ」を参照してください。

        ノードのアップグレードのカスタマイズ」で説明されているようにノードをグループでアップグレードしている場合、すべてのノードが正常にアップグレードされるまで upgrade_nodes.yml Playbook の起動を継続します。

  5. すべてのマスターおよびノードのアップグレードの完了後に、すべてのホストを再起動します。再起動後に追加の機能が有効化されていない場合は、「アップグレードの検証」を実行できます。追加機能が有効化されている場合には、次の手順は以前に有効にした追加機能の内容によって変わります。

    機能次の手順

    集計されたロギング

    EFK ロギングスタックのアップグレード

    クラスターメトリクス

    クラスターメトリクスのアップグレード

2.4. EFK ロギングスタックのアップグレード

既存の EFK ロギングスタックデプロイメントをアップグレードするには、提供されている /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml Ansible Playbook を使用する必要があります。これは既存のクラスターでロギングを最初にデプロイする際に使用する Playbook ですが、既存のロギングデプロイメントをアップグレードする場合にも使用されます。

  1. これをまだ実行していない場合は、「コンテナーログの集計」のトピックの「ロギング Ansible 変数の指定」を参照し、Ansible インベントリーファイルを更新して少なくとも [OSEv3:vars] セクション内に以下の必要な変数を設定します。

    [OSEv3:vars]
    
    openshift_logging_install_logging=true 1
    1
    ロギングスタックをアップグレードする機能を有効にします。
  2. 「ロギング Ansible 変数の指定」で説明されているように、デフォルトを上書きするために指定する必要のあるその他の openshift_logging_* 変数を追加します。
  3. インベントリーファイルの更新が終了したら、「EFK スタックのデプロイ」の説明に従って openshift-logging/config.yml Playbook を実行し、ロギングデプロイメントのアップグレードを完了します。
注記

EFK コンポーネントの Fluentd DeploymentConfig および DaemonSet が次のように設定されている場合、以下に注意してください。

        image: <image_name>:<vX.Y>
        imagePullPolicy: IfNotPresent

最新バージョンの <image_name> は、Pod が再デプロイされるノードに同じ <image_name:vX.Y> のイメージがローカルに保存されている場合にはプルされない可能性があります。その場合は、DeploymentConfig および DaemonSet を手動で imagePullPolicy: Always に設定し、再度プルされるようにします。

2.5. クラスターメトリクスのアップグレード

既存のクラスターメトリクスのデプロイメントをアップグレードするには、提供されている /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml Ansible Playbook を使用する必要があります。これは、既存クラスターでメトリクスを最初にデプロイしている場合に使用する Playbook ですが、既存のメトリクスデプロイメントをアップグレードする場合にも使用されます。

  1. これをまだ実行していない場合は、「クラスターメトリクスの有効化」のトピックの「メトリクス Ansible 変数の指定」を参照し、Ansible インベントリーファイルを更新して少なくとも [OSEv3:vars] セクション内で以下の必要な変数を設定します。

    [OSEv3:vars]
    
    openshift_metrics_install_metrics=true 1
    openshift_metrics_hawkular_hostname=<fqdn> 2
    openshift_metrics_cassandra_storage_type=(emptydir|pv|dynamic) 3
    1
    メトリクスデプロイメントをアップグレードする機能を有効にします。
    2
    Hawkular Metrics ルートに使用します。完全修飾ドメイン名を指定します。
    3
    以前のデプロイメントと同じタイプを選択します。
  2. 「メトリクス Ansible 変数の指定」に説明されているように、デフォルトを上書きするために指定する必要のあるその他の openshift_metrics_* 変数を追加します。
  3. インベントリーファイルの更新が終了したら、「メトリクスコンポーネントのデプロイ」の説明に従って openshift-metrics/config.yml Playbook を実行し、メトリクスデプロイメントのアップグレードを完了します。

2.6. 混在環境についての特別な考慮事項

混在環境のアップグレード (Red Hat Enterprise Linux および Red Hat Enterprise Linux Atomic Host を含む環境など) では、openshift_pkg_version および openshift_image_tag の両方を設定する必要があります。混在環境では、openshift_pkg_version のみを指定する場合、その番号が Red Hat Enterprise Linux および Red Hat Enterprise Linux Atomic Host のイメージに使用されます。

2.7. コンテナー化された GlusterFS を使用する場合の特別な考慮事項

OpenShift Container Platform のアップグレード時に、GlusterFS Pod が実行されているノードのセットをアップグレードする必要があります。

drain および unschedule は daemonset の一部として実行されているために GlusterFS Pod を停止せず、退避しません。そのため、これらのノードをアップグレードする際には特別な考慮が必要になります。

また、複数のノードでアップグレードを同時に実行される可能性もあり、これにより複数のノードが GlusterFS Pod をホストしている場合にデータ可用性の問題が生じる可能性があります。

シリアルアップグレードが実行されている場合でも、次のノードの GlusterFS が終了する前に GlusterFS が自動修復操作のすべてを完了するのに必要な時間が確保される保証はありません。そのため、クラスターの状態が正常でなくなるか、または不明な状態になる可能性があります。したがって、以下の手順を実行することをお勧めします。

  1. コントロールプレーンをアップグレードします (マスターノードおよび etcd ノード)。
  2. 標準 infra ノード (ルーター、レジストリー、ロギング、およびメトリクス) をアップグレードします。

    注記

    これらのグループのノードのいずれかが GlusterFS を実行している場合、この手順のステップ 4 を同時に実行します。GlusterFS ノードは (appinfra などの) クラス内の他のノードと共に 一度に 1 つずつアップグレードする必要があります。

  3. アプリケーションコンテナーを実行する標準ノードをアップグレードします。

    注記

    これらのグループのノードのいずれかが GlusterFS を実行している場合、この手順のステップ 4 を同時に実行します。GlusterFS ノードは (appinfra などの) クラス内の他のノードと共に 一度に 1 つずつアップグレードする必要があります。

  4. GlusterFS を実行する OpenShift Container Platform ノードを一度に 1 つずつアップグレードします。

    1. oc get daemonset を実行して NODE-SELECTOR にあるラベルを検証します。デフォルト値は storagenode=glusterfs です。
    2. daemonset ラベルをノードから削除します。

      $ oc label node <node_name> <daemonset_label>-

      これにより、GlusterFS Pod がこのノード上で終了します。

    3. 追加のラベル (type=upgrade など) をアップグレードする必要のあるノードに追加します。
    4. アップグレード Playbook を GlusterFS を終了した単一ノードで実行するには、-e openshift_upgrade_nodes_label="type=upgrade" を使用します。
    5. アップグレードの完了時に、deamonset セレクターでノードのラベルを変更します。

      $ oc label node <node_name> <daemonset_label>
    6. GlusterFS Pod が再生成され、表示されるまで待機します。
    7. oc rsh を Pod に実行し、すべてのボリュームが自動修復されていることを確認します。

      $ oc rsh <GlusterFS_pod_name>
      $ for vol in `gluster volume list`; do gluster volume heal $vol info; done

      すべてのボリュームが自動修復され、未処理のタスクがないことを確認します。heal info コマンドは所定ボリュームの自動修復プロセスのすべての未処理エントリーを一覧表示します。ボリュームは、ボリュームの Number of entries0 の場合に自動修正済みとみなされます。

    8. アップグレードラベル (type=upgrade など) を削除し、次の GlusterFS ノードに移動します。

2.8. gcePD を使用する場合の特別な考慮事項

デフォルトの gcePD ストレージプロバイダーは RWO (Read-Write Only) アクセスモードを使用するため、レジストリーでローリングアップグレードを実行したり、レジストリーを複数 Pod に拡張したりすることはできません。そのため、OpenShift Container Platform のアップグレード時に以下の環境変数を Ansible インベントリーファイルに指定する必要があります。

[OSEv3:vars]

openshift_hosted_registry_storage_provider=gcs
openshift_hosted_registry_storage_gcs_bucket=bucket01
openshift_hosted_registry_storage_gcs_keyfile=test.key
openshift_hosted_registry_storage_gcs_rootdirectory=/registry

2.9. アップグレードの検証

以下を確認します。

  • クラスターが正常である。
  • マスター、ノード、etcd サービスまたは静的 Pod が正常に実行されている。
  • OpenShift Container Platform、docker-registry、およびルーターバージョンが正しい。
  • 元のアプリケーションが依存として利用可能な状態で、新規アプリケーションの作成が可能である。
  • oc adm diagnostics を実行してもエラーが生じない。

アップグレードを検証するには、以下を確認します。

  1. すべてのノードに Ready のマークが付けられていることを確認します。

    # oc get nodes
    NAME                     STATUS    ROLES        AGE       VERSION
    master1.example.com      Ready     master       47d       v1.10.0+b81c8f8
    master2.example.com      Ready     master       47d       v1.10.0+b81c8f8
    master3.example.com      Ready     master       47d       v1.10.0+b81c8f8
    infra-node1.example.com  Ready     infra        47d       v1.10.0+b81c8f8
    infra-node2.example.com  Ready     infra        47d       v1.10.0+b81c8f8
    node1.example.com        Ready     compute      47d       v1.10.0+b81c8f8
    node2.example.com        Ready     compute      47d       v1.10.0+b81c8f8
  2. コントロールプレーンの静的 Pod が実行されていることを確認します。

    # oc get pods -n kube-system
    NAME                                 READY     STATUS    RESTARTS   AGE
    master-api-master1.example.com           1/1       Running   4          1h
    master-controllers-master1.example.com   1/1       Running   3          1h
    master-etcd-master1.example.com          1/1       Running   6          5d
    [...]
  3. 必要なバージョンの docker-registry および router イメージを実行していることを確認します (デプロイされている場合)。

    # oc get -n default dc/docker-registry -o json | grep \"image\"
        "image": "openshift3/ose-docker-registry:v3.10",
    # oc get -n default dc/router -o json | grep \"image\"
        "image": "openshift3/ose-haproxy-router:v3.10",
  4. マスター上で診断ツールを使用し、一般的な問題を検索します。

    # oc adm diagnostics
    ...
    [Note] Summary of diagnostics execution:
    [Note] Completed with no errors or warnings seen.
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.