エアギャップ(インターネット接続無し)環境での OCP(Openshift Container Platform) の導入/運用手順を紹介するシリーズです。今回は「エアギャップ環境にインストールした OCP をアップグレードする」手順を紹介します。OCP はバグ修正を含むメンテナンスが随時行われており、比較的バージョンアップ頻度が高い印象があります。これはこれで安心して使えることになるのですが、バージョンアップ頻度が高いということは、サポート中バージョンがサポート切れになるスピードも比較的早い、ということを意味しています。そのため運用環境のサポート状態を維持するには OCP のアップグレードが欠かせません。
インターネット接続環境であれば(インターネット上で RedHat 社が提供している仕組みを使って)比較的簡単にアップグレードできるのですが、エアギャップ環境となるとそうはいかなくなります。エアギャップ環境での OCP インストール手順はググればいくつかの情報が見つかるのですが、私が調べた限りでは(英語含めて)エアギャップ環境での OCP アップグレード手順は(詳しくは記事内で紹介しますが)ちとややこしい手順が必要なせいか、見つけることはできませんでした。詳しそうな人に聞いても「理論的にはできると思う」という答や、「できるかどうかで言うとできるんだけど、ケース・バイ・ケースの対応が多くてドキュメント化が難しい」という回答の多い作業のようでした。事例的にもあまり多くないのだと思っています。
今回のブログはそんなエアギャップ環境での OCP アップグレード手順の紹介します。おそらくですが、公開されているドキュメントという観点でもかなり貴重なもののはず、だと思っています。
【大まかな流れ】
エアギャップ環境の OCP クラスタアップグレードする場合、大きくは以下の流れを実施することになります:
(0)最終的にアップグレードしたい OCP バージョンを確定させ、アップグレードパスを確認
(1)インターネット接続環境下でアップグレードに必要なイメージファイルを取得する
(2)(1)で取得したイメージファイルをエアギャップ環境に持ちこんでミラーレジストリを更新し、OCP をアップグレードする
(3)(1)と(2)をアップグレードパスに必要な回数だけ繰り返す
ではこの流れで実際にエアギャップ環境の OCP をアップグレードする手順を紹介します。
【(0)最終的にアップグレードしたい OCP バージョンを確定させ、アップグレードパスを確認】
以前のブログでエアギャップ OCP クラスタをインストールする手順を紹介した際は OCP 4.13.0 というバージョンでの手順を紹介しました。これを「どのバージョンに上げるか?」を確定させる必要があります。この辺りはバージョンアップ戦略やポリシーにも依存する部分があり、「常に最新バージョンにする」という場合は現時点でリリースされている最新バージョン(数字がもっとも大きいもの)が目的のバージョンになります。一方で「契約内容やバージョンによる長期サポートの有無、延長サポートの有無を考慮して、最も長い期間サポートされるバージョン(数字が大きいものとは限らない)」が目的になることもあります。この辺りは個別事情になるのですが、今回は LTS でもある OCP 4.14 を目指すこととして、(OCP 4.13.0 から)OCP 4.14.0 へのアップグレードを紹介することとします。この辺り、個別の環境と異なっている場合は適宜読み替えてください。
現在のバージョンと、アップグレード先のバージョンが確定したら、次はアップグレードパスを確認します。OCP は現在のバージョンとアップグレード先バージョンの組み合わせによって、1回のアップグレード作業で実現できたり、できなかったり(2回になるか、3回になるか、・・・)します。その点を考慮した上で、目的のバージョンまで1回の作業でアップグレードできるのか、できない場合は間にどのようなバージョンアップを挟んで実現するのか、を決める必要があるのですが、この「間にどのようなバージョンアップを挟んで実現するのか」のことをアップグレードパスと呼びます。以前に私のブログでもアップグレードパスの調べ方含めて紹介したことがありました:
https://dotnsf.blog.jp/archives/1083194426.html
実際に OCP 4.13.0 から OCP 4.14.0 へのアップグレードを実施するという前提でのアップグレードパスを確認してみましょう。インターネット接続がある環境でこちらにアクセスします(RedHat アカウントでのログインが必要です):
https://access.redhat.com/labs/ocpupgradegraph/update_path
以下のような画面が表示されます:
この画面内にアップグレード作業の内容を入力していきます。まず Current Channel は現在稼働中の環境のチャネルなので "stable-4.13" 、Architecture は "x86_64" を指定します。そして "Current OpenShift Version" に現在のバージョンである "4.13.0" を、"Target OpenShift Version" には "4.14.0" をそれぞれ指定し、最後に "Generate" ボタンをクリックします:
すると画面下部に以下のような結果が表示されます。つまり 4.13.0 から 4.14.0 へのアップグレードパスは 4.13.0 → 4.13.19 → 4.14.0 と、間に一度 4.13.19 へのアップグレードを挟んで2回に分けて実施する必要がある、ということがわかります:
このアップグレードパスを理解した上で実際に OCP をアップグレードしていきましょう。
【(1)インターネット接続環境下でアップグレードに必要なイメージファイルを取得する】
4.13.0 を 4.14.0 にアップグレードする手順として、最初に 4.13.0 を 4.13.19 にアップグレードする必要があることがわかりました。というわけで、まずは 4.13.0 から 4.13.19 へのアップグレードを想定した準備を行います。
ここでの作業はインターネット接続環境下で実施します。以前に OCP 4.13.0 をインストールした時のブログエントリでも説明したインターネット接続環境と同様の準備を実施します(podman や oc、oc-mirror などもインストールします)。4.13.0 インストールの時はバスチョンサーバーに /data/imageset-config-4.13.0.yaml というOCP 4.13.0 向けイメージファイル取得用のファイルを以下の内容で用意しました:
実はここがエアギャップ OCP アップグレードのややこしい所ではあるのですが、この「以前に OCP をインストールした時」の環境がそのまま残っていて、同ファイル( /data/imageset-4.13.0.yaml )を使ってダウンロードしたイメージファイル /data/mirror-ocp/mirror_seq1_000000.tar が残っている場合は再度 OCP 4.13.0 用のイメージファイルをダウンロードする必要はありません。逆に残っていない場合(そもそも異なるマシンが用意されていたり、同じマシンでも /data/mirror-ocp/mirror_seq1_000000.tar が残っていない場合)は再度同ファイルをダウンロードする必要があります。この辺りは少しわかりにくい部分ですが、最初に(OCP インストール時に) /data/mirror-ocp/mirror_seq1_000000.tar をダウンロードした時の /data/mirror-ocp/ フォルダ内に記録された関連ファイル含めてイメージファイルが残っている場合は、ここからの差分ファイルだけを用意するだけでアップグレードできます。逆に関連ファイルがなかったりする場合は(既に 4.13.0 環境があるので、なんとなく無駄なような気がするかもしれませんが)4.13.0 インストール用のイメージファイル /data/mirror-ocp/mirror_seq1_000000.tar を再度ダウンロードし直す所から実施する必要がある、という点に注意してください。イメージファイルのダウンロード手順はインストール手順を確認してください。
ここまでできたら、改めて 4.13.0 インストール用のイメージダウンロードファイル /data/imageset-4.13.0.yaml の、 4.13.0 から 4.13.19 へのアップグレード版に相当する /data/imageset-4.13.0-4.13.19.yaml を以下の内容で用意します:
元のファイル imageset-4.13.0.yaml からの違いが2か所あります(赤字で記しています)。まず maxVersion の値を '4.13.0' から '4.13.19' に変えています。今回必要なのは(4.13.0 のイメージが存在している前提で)4.13.0 から 4.13.19 への差分となるイメージなので minVersion は '4.13.0' のままでいいのですが、maxVersion は '4.13.19' に変更します。また途中のバージョンのイメージは不要なので shortestPath: true の行を追加しています。他は 4.13 ベースのままの差分ということもあってそのままです。
そしてこのファイルを使って以下を実行し、4.13.0 から 4.13.19 へアップグレードするための差分イメージファイルを作成します:
コマンド実行が成功すると /data/mirror-ocp/mirror_seq2_000000.tar という巨大なファイルが作られます。ここで重要な点は、できあがるファイル名の seq に続く数字が1ではなく2になっていることです。これは単にファイル名だけの問題ではなく(作った後にファイル名を変えればいいという問題ではなく)既に1に該当するファイルやフォルダが(/data/mirror-ocp/ 以下に)作成されていて、その続きであることを認識して2が生成されている、ということです。「1があっての2」として作られたファイルであることを再度認識しておく必要があります。
同様にして 4.13.19 から 4.14.0 にアップグレードするための差分イメージファイルも用意します。まずは /data/imageset-4.13.19-4.14.0.yaml を以下の内容で作成します:
imageset-4.13.0-4.13.19.yaml からの変更点として、チャネルはアップグレード先である "stable-4.14" に変更します。また 4.13.19 から 4.14.0 への最小差分を取得したいので minVersion を "4.13.19"、maxVersion を "4.14.0" にして shortestPath を true にします。加えてオペレーターも 4.14 ベースに変えたいのでカタログ URL のタグ部分を "v4.14" に変更します。
このファイルを使って 4.13.19 から 4.14.0 への差分イメージファイルを作成します:
このコマンドが成功すると /data/mirror-ocp/mirror_seq3_000000.tar という差分イメージファイルが作成されます。このファイルも上述と同様に「2があっての3」のファイルです。
次にアップグレード後のバージョンの「ダイジェスト値」を調べます。インストール時にはダイジェスト値を意識する必要はなかったのですが、アップグレード時はこのダイジェスト値を指定してアップグレードを実行することになります(例えば 4.13.19 にアップグレードする場合は、"4.13.19" という文字列を指定するのではなく、"4.13.19 のダイジェスト値"(正確には x86_64 アーキテクチャの "4.13.19 のダイジェスト値")を指定してアップグレードを実行します)。この値もインターネットに接続された環境で調べる必要があります。
(x86_64 アーキテクチャの)4.13.19 のダイジェスト値は以下のコマンドで調べることができます:
実行後に /data/4.13.19.digest というテキストファイルが作られ、その中は "sha256:" で始まる1行の内容になっています:
この "sha256:" に続く部分が 4.13.19 のダイジェスト値です。この値もアップグレード時に必要なものです。
同様にして 4.14.0 のダイジェスト値も調べて /data/4.14.0.digest というファイルに格納しておきます:
ここまでできればインターネット接続環境で実施するアップグレードのための手順はほぼ終わりですが、インターネット接続環境で実施する作業の最後にアップグレード後のバージョンに合わせた oc や oc-mirror を用意します。
今回の場合は 4.14.0 向けの oc や oc-mirror ツールを用意します。それぞれ /data/oc-4.14.0, /data/oc-mirror-4.14.0 という名前でファイルを用意します:
ここまでの手順で以下のファイルが /data/ 以下に揃っているはずです(赤字はコメント):
これら全てのファイルが必要です(OCP 4.13.0 をインストールした時につかったミラーイメージファイル mirror_seq1_000000.tar と全く同じファイルがバスチョンサーバーに残っている場合は一番上のファイルは不要です)。これまでと同様に、これらのファイルを USB メディアなどを使ってバスチョンサーバーに持ち込む必要があります。
OCP アップグレードを実施する際にインターネット接続環境で行う作業は以上です。
【(2)(1)で取得したイメージファイルをエアギャップ環境に持ちこんでミラーレジストリを更新し、OCP をアップグレードする】
(1)はインターネット接続環境で実施する内容でしたが、ここから先はエアギャップ環境内での作業となります。まずは(1)の作業で用意したファイル群を USB メモリ等を使ってエアギャップ環境のバスチョンサーバー内に持ち込みます。以下ではこれらのファイルが全てバスチョンサーバーの /data/ フォルダ以下に用意されているものと仮定して説明を続けます(赤字はコメント):
エアギャップ環境の OCP をアップグレードするには、エアギャップ環境内のミラーレジストリをアップグレード先バージョンのものに更新する必要があります。今回の場合、まずはミラーレジストリを 4.13.19 仕様に更新して OCP 4.13.19 にアップグレードし、続けてミラーレジストリを 4.14.0 仕様に更新して OCP 4.14.0 にアップグレードする、という順序になります(エアギャップ環境でなければ、RedHat 提供の公開レジストリを使うことができるのでミラーレジストリを用意したり更新したりする必要はありません)。
というわけで、早速現在 4.13.0 使用のミラーレジストリを 4.13.19 仕様に更新・・・ したくなるのですが、その前に1点確認が必要です。 現在の 4.13.0 仕様のミラーレジストリ(以前のブログで 4.13.0 をインストールした時のミラーレジストリ)を作った時に使った mirror_seq1_000000.tar は、今回用意した mirror_seq1_000000.tar と全く同じファイルでしょうか? 4.13.0 から 4.13.19 への差分いらーイメージは mirror_seq2_000000.tar ですが、このファイルは「seq1 (mirror_seq1_000000.tar)がある前提での seq2」のファイルになっています。この "seq1" と全く同じファイルを使って現在のミラーレジストリが作られているのだとしたら、そのまま seq2 を適用できるのですが、同じ設定で seq1 を作り直したのだとしたら、そのままでは seq2 を適用できず、ミラーレジストリを調整する必要があります。
OCP インストール時とは違う mirror_seq1_000000.tar ファイルを用意している場合は seq2 の前提となっている seq1(今回用意した mirror_seq1_000000.tar )でミラーレジストリを上書きしてからでないと seq2 は正しく適用できないので(ごちゃごちゃ書いてますが、初期インストール時に使ったものと全く同じ環境が残っているかどうか自信がない場合はとりあえず)、まずは今回持ち込んだ /data/mirror-ocp/mirror_seq1_000000.tar を使ってミラーレジストリを上書きします。具体的には root 権限でターミナルを開き、トークンでログイン(ウェブコンソールの「ログインコマンドのコピー」からログイン)して、以下のコマンドを実行します:
このコマンドが正常に終了していると "~/oc-mirror-workspace/" 以下に "results-xxxxxxxxxx" という名前のフォルダが作られています("xxxxxxxxxx" 部分は実行時のタイムスタンプ)。OCP インストール時にも同様のコマンドを実行しているので、"~/oc-mirror-workspace/" 以下にはタイムスタンプの異なる複数のフォルダができているはずです。今回作られたフォルダを判別するにはフォルダの作成時タイムスタンプで判断する必要があります。注意してください。
では、新たに作成された ~/oc-mirror-workspace/results-xxxxxxxxxx/ フォルダの情報を使ってミラーレジストリを更新します:
これでアップグレード前のミラーレジストリの調整は完了です。
ここまでの作業が完了しているとアップグレード用のミラーレジストリ差分イメージを適用することができるようになります。まずは 4.13.0 から 4.13.19 への差分イメージ(mirror_seq2_000000.tar)でミラーレジストリを上書きし、その結果できあがったフォルダ("~/oc-mirror-workspace/results-yyyyyyyyyy/" "yyyyyyyyyy" 部分のタイムスタンプで判断)の情報を適用します(mirror_seq1_000000.tar のインポートを飛ばした場合はトークンでログインしてから実行する必要があります):
これでミラーレジストリには 4.13.0 インストール用だけでなく、4.13.19 アップグレード用のイメージも上書きされています。確認する場合は以下のコマンドを実行します:
実行結果が以下のように "4.13.19" という文字を含む内容になっていればミラーレジストリ内に 4.13.19 アップグレード用のイメージが含まれた状態になっています:
これでミラーレジストリは(現在の 4.13.0 から)4.13.19 にアップグレードできる状態になりました。早速アップグレードを実行してみましょう。まずはアップグレード先である 4.13.19 のダイジェスト値を確認します(青字は実行結果):
"sha256:" で始まる1行のテキストが表示されます。この値を用いて以下の命令を実行することで 4.13.19 へのアップグレード指示を実行します:
実行条件によっては警告が表示されることもありますが、エラーになっていなければ無視してください。最後に "Requested upgrade to ..." と表示されていれば成功です:
アップグレードの様子はウェブブラウザから確認できます。まずは以下のコマンドでウェブコンソールにログインするためのパスワードを確認します:
パスワードが確認できたらウェブブラウザでウェブコンソール(https://console-openshift-console.apps.ocp.xxx.localdomain/)を開き、ID は "kubeadmin" 、パスワードは上で確認したものを指定してログインします:
ログイン後、左上のメニューから Administration - Cluster Settings を選択します。上述のアップグレードコマンド(oc adm upgrade)が成功していると、Details タブ内で 4.13.19 へのアップグレードが進行中(Upgrade to 4.13.19 in progress)であることが分かります:
アップグレードは少しずつ進行してゆきます。しばらく待っているとアップグレードは完了し、新しいバージョン(4.13.19) に切り替わったことが確認できます:
同画面下部には OCP バージョンの更新履歴も表示されています:
ここまでの作業でエアギャップ環境の OCP が 4.13.0 から 4.13.19 へアップグレードできました。ミラーレジストリ更新時のややこしさはありましたが、基本的には 「ミラーレジストリ内に更新先バージョンのイメージを上書き」→「アップグレード」 という流れでアップグレードできます。
では同様にして 4.13.19 から 4.14.0 にアップグレードしてみましょう。まずはミラーレジストリを差分イメージファイルで上書きしておきます。上記同様に 4.13.19 から 4.14.0 への差分イメージ(mirror_seq3_000000.tar)でミラーレジストリを上書きし、その結果できあがったフォルダ("~/oc-mirror-workspace/results-zzzzzzzzzz/" "zzzzzzzzzz" 部分のタイムスタンプで判断)の情報を適用します(※):
※今回のミラーレジストリ更新では 4.mm.nn の mm 部分が変わるバージョンアップを行います。それが原因なのかどうかは分からないのですが、この 4.13.19 から 4.14.0 への差分イメージである mirror_seq3_000000.tar で上書きする場合は oc mirror コマンド実行時に "--continue-on-error" オプションが必須でした。
4.14.0 イメージで上書きできているか確認する場合は以下のコマンドを実行します:
実行結果が以下のように "4.14.0" という文字を含んでいることを確認します:
次に 4.14.0 のダイジェスト値を確認します(青字は出力結果):
4.14.0 のダイジェスト値を指定してアップグレード指示を実行します:
上述と同様にウェブブラウザで管理コンソールを開き、左上メニューから Administration - Cluster Settings を選択します。おそらく今回は前回のようにアップグレード実行中の画面にはならず、以下のようなエラーメッセージが表示されているはずです:
これはエラーというよりは確認メッセージで、アップグレード前のバージョン(4.13.19)からアップグレード後のバージョン(4.14.0)に上げることで API の互換性が失われてしまうものが含まれているための警告が表示されています。今回のようにマイナーバージョンが上がるタイプのアップグレードだと起こり得るようです。
この場合、以下のコマンドを追加で実行することで「互換性がないことを理解した上で 4.13 から 4.14 へアップグレードする」ことを指示できます:
このコマンドを実行後に先ほどの画面に戻るとアップグレードが再開されていることが確認できます:
しばらく待つとアップグレードが完了し、無事に 4.14.0 に切り替わったことが確認できます:
これで OCP クラスタ(サーバー)は 4.14.0 にアップグレードできました。最後に OCP クライアントである oc, oc-mirror を 4.14.0 のものに切り替えます(cp コマンドの前の "\" は強制上書き指定):
"oc version" コマンドでサーバー・クライアントとも 4.14.0 に切り替わったことを確認します:
無事に目的であった OCP 4.14.0 へのアップグレードがエアギャップ環境内で実現できました。 このエアギャップ環境での OCP アップグレードはミラーレジストリの状態や、現在のミラーレジストリを作った時の環境が残っているかどうかによって手順が変わったりすることもあり、手順として説明するにはかなりややこしい内容でした。そんなこともあって「理論的にはできるはずだけど、これまで資料が見つからなかった」のかもしれません。
私が知る限り、インターネットに公開された情報としてはこれが初めてだったと思っていますが、私と同じように手順が分からずに苦しんでいる人の助けになれば幸いです。
・エアギャップ環境(インターネット接続のない環境)で OCP を導入/運用する上で必要な前提理解
・エアギャップ環境(インターネット接続のない環境)で OCP を導入する手順
・エアギャップ環境(インターネット接続のない環境)で OCP にアプリケーションを導入する手順
・エアギャップ環境(インターネット接続のない環境)に導入した OCP をエアギャップ環境内でアップグレードする手順
インターネット接続環境であれば(インターネット上で RedHat 社が提供している仕組みを使って)比較的簡単にアップグレードできるのですが、エアギャップ環境となるとそうはいかなくなります。エアギャップ環境での OCP インストール手順はググればいくつかの情報が見つかるのですが、私が調べた限りでは(英語含めて)エアギャップ環境での OCP アップグレード手順は(詳しくは記事内で紹介しますが)ちとややこしい手順が必要なせいか、見つけることはできませんでした。詳しそうな人に聞いても「理論的にはできると思う」という答や、「できるかどうかで言うとできるんだけど、ケース・バイ・ケースの対応が多くてドキュメント化が難しい」という回答の多い作業のようでした。事例的にもあまり多くないのだと思っています。
今回のブログはそんなエアギャップ環境での OCP アップグレード手順の紹介します。おそらくですが、公開されているドキュメントという観点でもかなり貴重なもののはず、だと思っています。
【大まかな流れ】
エアギャップ環境の OCP クラスタアップグレードする場合、大きくは以下の流れを実施することになります:
(0)最終的にアップグレードしたい OCP バージョンを確定させ、アップグレードパスを確認
(1)インターネット接続環境下でアップグレードに必要なイメージファイルを取得する
(2)(1)で取得したイメージファイルをエアギャップ環境に持ちこんでミラーレジストリを更新し、OCP をアップグレードする
(3)(1)と(2)をアップグレードパスに必要な回数だけ繰り返す
ではこの流れで実際にエアギャップ環境の OCP をアップグレードする手順を紹介します。
【(0)最終的にアップグレードしたい OCP バージョンを確定させ、アップグレードパスを確認】
以前のブログでエアギャップ OCP クラスタをインストールする手順を紹介した際は OCP 4.13.0 というバージョンでの手順を紹介しました。これを「どのバージョンに上げるか?」を確定させる必要があります。この辺りはバージョンアップ戦略やポリシーにも依存する部分があり、「常に最新バージョンにする」という場合は現時点でリリースされている最新バージョン(数字がもっとも大きいもの)が目的のバージョンになります。一方で「契約内容やバージョンによる長期サポートの有無、延長サポートの有無を考慮して、最も長い期間サポートされるバージョン(数字が大きいものとは限らない)」が目的になることもあります。この辺りは個別事情になるのですが、今回は LTS でもある OCP 4.14 を目指すこととして、(OCP 4.13.0 から)OCP 4.14.0 へのアップグレードを紹介することとします。この辺り、個別の環境と異なっている場合は適宜読み替えてください。
現在のバージョンと、アップグレード先のバージョンが確定したら、次はアップグレードパスを確認します。OCP は現在のバージョンとアップグレード先バージョンの組み合わせによって、1回のアップグレード作業で実現できたり、できなかったり(2回になるか、3回になるか、・・・)します。その点を考慮した上で、目的のバージョンまで1回の作業でアップグレードできるのか、できない場合は間にどのようなバージョンアップを挟んで実現するのか、を決める必要があるのですが、この「間にどのようなバージョンアップを挟んで実現するのか」のことをアップグレードパスと呼びます。以前に私のブログでもアップグレードパスの調べ方含めて紹介したことがありました:
https://dotnsf.blog.jp/archives/1083194426.html
実際に OCP 4.13.0 から OCP 4.14.0 へのアップグレードを実施するという前提でのアップグレードパスを確認してみましょう。インターネット接続がある環境でこちらにアクセスします(RedHat アカウントでのログインが必要です):
https://access.redhat.com/labs/ocpupgradegraph/update_path
以下のような画面が表示されます:
この画面内にアップグレード作業の内容を入力していきます。まず Current Channel は現在稼働中の環境のチャネルなので "stable-4.13" 、Architecture は "x86_64" を指定します。そして "Current OpenShift Version" に現在のバージョンである "4.13.0" を、"Target OpenShift Version" には "4.14.0" をそれぞれ指定し、最後に "Generate" ボタンをクリックします:
すると画面下部に以下のような結果が表示されます。つまり 4.13.0 から 4.14.0 へのアップグレードパスは 4.13.0 → 4.13.19 → 4.14.0 と、間に一度 4.13.19 へのアップグレードを挟んで2回に分けて実施する必要がある、ということがわかります:
このアップグレードパスを理解した上で実際に OCP をアップグレードしていきましょう。
【(1)インターネット接続環境下でアップグレードに必要なイメージファイルを取得する】
4.13.0 を 4.14.0 にアップグレードする手順として、最初に 4.13.0 を 4.13.19 にアップグレードする必要があることがわかりました。というわけで、まずは 4.13.0 から 4.13.19 へのアップグレードを想定した準備を行います。
ここでの作業はインターネット接続環境下で実施します。以前に OCP 4.13.0 をインストールした時のブログエントリでも説明したインターネット接続環境と同様の準備を実施します(podman や oc、oc-mirror などもインストールします)。4.13.0 インストールの時はバスチョンサーバーに /data/imageset-config-4.13.0.yaml というOCP 4.13.0 向けイメージファイル取得用のファイルを以下の内容で用意しました:
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: local: path: /data/mirror-ocp mirror: platform: # architectures: # - "x86_64" channels: - name: stable-4.13 type: ocp minVersion: '4.13.0' maxVersion: '4.13.0' graph: true operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.13 full: false packages: - name: local-storage-operator channels: - name: stable additionalImages: - name: registry.redhat.io/ubi8/ubi:latest - name: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.2 - name: docker.io/rancher/busybox:1.31.1 helm: {}
実はここがエアギャップ OCP アップグレードのややこしい所ではあるのですが、この「以前に OCP をインストールした時」の環境がそのまま残っていて、同ファイル( /data/imageset-4.13.0.yaml )を使ってダウンロードしたイメージファイル /data/mirror-ocp/mirror_seq1_000000.tar が残っている場合は再度 OCP 4.13.0 用のイメージファイルをダウンロードする必要はありません。逆に残っていない場合(そもそも異なるマシンが用意されていたり、同じマシンでも /data/mirror-ocp/mirror_seq1_000000.tar が残っていない場合)は再度同ファイルをダウンロードする必要があります。この辺りは少しわかりにくい部分ですが、最初に(OCP インストール時に) /data/mirror-ocp/mirror_seq1_000000.tar をダウンロードした時の /data/mirror-ocp/ フォルダ内に記録された関連ファイル含めてイメージファイルが残っている場合は、ここからの差分ファイルだけを用意するだけでアップグレードできます。逆に関連ファイルがなかったりする場合は(既に 4.13.0 環境があるので、なんとなく無駄なような気がするかもしれませんが)4.13.0 インストール用のイメージファイル /data/mirror-ocp/mirror_seq1_000000.tar を再度ダウンロードし直す所から実施する必要がある、という点に注意してください。イメージファイルのダウンロード手順はインストール手順を確認してください。
ここまでできたら、改めて 4.13.0 インストール用のイメージダウンロードファイル /data/imageset-4.13.0.yaml の、 4.13.0 から 4.13.19 へのアップグレード版に相当する /data/imageset-4.13.0-4.13.19.yaml を以下の内容で用意します:
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: local: path: /data/mirror-ocp mirror: platform: # architectures: # - "x86_64" channels: - name: stable-4.13 type: ocp minVersion: '4.13.0' maxVersion: '4.13.19' shortestPath: true graph: true operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.13 full: false packages: - name: local-storage-operator channels: - name: stable additionalImages: - name: registry.redhat.io/ubi8/ubi:latest - name: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.2 - name: docker.io/rancher/busybox:1.31.1 helm: {}
元のファイル imageset-4.13.0.yaml からの違いが2か所あります(赤字で記しています)。まず maxVersion の値を '4.13.0' から '4.13.19' に変えています。今回必要なのは(4.13.0 のイメージが存在している前提で)4.13.0 から 4.13.19 への差分となるイメージなので minVersion は '4.13.0' のままでいいのですが、maxVersion は '4.13.19' に変更します。また途中のバージョンのイメージは不要なので shortestPath: true の行を追加しています。他は 4.13 ベースのままの差分ということもあってそのままです。
そしてこのファイルを使って以下を実行し、4.13.0 から 4.13.19 へアップグレードするための差分イメージファイルを作成します:
# umask 0022 # mkdir -p /data/mirror-ocp # cd /data # oc mirror --config=imageset-config-4.13.0-4.13.19.yaml file:///data/mirror-ocp
コマンド実行が成功すると /data/mirror-ocp/mirror_seq2_000000.tar という巨大なファイルが作られます。ここで重要な点は、できあがるファイル名の seq に続く数字が1ではなく2になっていることです。これは単にファイル名だけの問題ではなく(作った後にファイル名を変えればいいという問題ではなく)既に1に該当するファイルやフォルダが(/data/mirror-ocp/ 以下に)作成されていて、その続きであることを認識して2が生成されている、ということです。「1があっての2」として作られたファイルであることを再度認識しておく必要があります。
同様にして 4.13.19 から 4.14.0 にアップグレードするための差分イメージファイルも用意します。まずは /data/imageset-4.13.19-4.14.0.yaml を以下の内容で作成します:
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: local: path: /data/mirror-ocp mirror: platform: # architectures: # - "x86_64" channels: - name: stable-4.14 type: ocp minVersion: '4.13.19' maxVersion: '4.14.0' shortestPath: true graph: true operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 full: false packages: - name: local-storage-operator channels: - name: stable additionalImages: - name: registry.redhat.io/ubi8/ubi:latest - name: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.2 - name: docker.io/rancher/busybox:1.31.1 helm: {}
imageset-4.13.0-4.13.19.yaml からの変更点として、チャネルはアップグレード先である "stable-4.14" に変更します。また 4.13.19 から 4.14.0 への最小差分を取得したいので minVersion を "4.13.19"、maxVersion を "4.14.0" にして shortestPath を true にします。加えてオペレーターも 4.14 ベースに変えたいのでカタログ URL のタグ部分を "v4.14" に変更します。
このファイルを使って 4.13.19 から 4.14.0 への差分イメージファイルを作成します:
# umask 0022 # mkdir -p /data/mirror-ocp # cd /data # oc mirror --config=imageset-config-4.13.19-4.14.0.yaml file:///data/mirror-ocp
このコマンドが成功すると /data/mirror-ocp/mirror_seq3_000000.tar という差分イメージファイルが作成されます。このファイルも上述と同様に「2があっての3」のファイルです。
次にアップグレード後のバージョンの「ダイジェスト値」を調べます。インストール時にはダイジェスト値を意識する必要はなかったのですが、アップグレード時はこのダイジェスト値を指定してアップグレードを実行することになります(例えば 4.13.19 にアップグレードする場合は、"4.13.19" という文字列を指定するのではなく、"4.13.19 のダイジェスト値"(正確には x86_64 アーキテクチャの "4.13.19 のダイジェスト値")を指定してアップグレードを実行します)。この値もインターネットに接続された環境で調べる必要があります。
(x86_64 アーキテクチャの)4.13.19 のダイジェスト値は以下のコマンドで調べることができます:
# oc adm release info quay.io/openshift-release-dev/ocp-release:4.13.19-x86_64 | sed -n 's/Pull From: .*@//p' > /data/4.13.19.digest
実行後に /data/4.13.19.digest というテキストファイルが作られ、その中は "sha256:" で始まる1行の内容になっています:
この "sha256:" に続く部分が 4.13.19 のダイジェスト値です。この値もアップグレード時に必要なものです。
同様にして 4.14.0 のダイジェスト値も調べて /data/4.14.0.digest というファイルに格納しておきます:
# oc adm release info quay.io/openshift-release-dev/ocp-release:4.14.0-x86_64 | sed -n 's/Pull From: .*@//p' > /data/4.14.0.digest
ここまでできればインターネット接続環境で実施するアップグレードのための手順はほぼ終わりですが、インターネット接続環境で実施する作業の最後にアップグレード後のバージョンに合わせた oc や oc-mirror を用意します。
今回の場合は 4.14.0 向けの oc や oc-mirror ツールを用意します。それぞれ /data/oc-4.14.0, /data/oc-mirror-4.14.0 という名前でファイルを用意します:
# mkdir -p /tmp/oc # cd /tmp/oc # wget https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/4.14.0/oc-mirror.tar.gz # tar -xf oc-mirror.tar.gz # chmod +x oc-mirror # cp oc-mirror /data/oc-mirror-4.14.0 # wget https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/4.14.0/openshift-client-linux-4.14.0.tar.gz # tar xzvf openshift-client-linux-4.14.0.tar.gz oc # cp oc /data/oc-4.14.0
ここまでの手順で以下のファイルが /data/ 以下に揃っているはずです(赤字はコメント):
- /data/mirror-ocp/mirror_seq1_000000.tar (OCP 4.13.0 のミラーイメージ) - /data/mirror-ocp/mirror_seq2_000000.tar (OCP 4.13.0 から 4.13.19 の差分ミラーイメージ) - /data/mirror-ocp/mirror_seq3_000000.tar (OCP 4.13.19 から 4.14.0 の差分ミラーイメージ) - /data/oc-4.14.0 (oc 4.14.0) - /data/oc-mirror-4.14.0 (oc-mirror 4.14.0) - /data/4.13.19.digest (4.13.19 のダイジェスト値が記載されたファイル) - /data/4.14.0.digest (4.14.0 のダイジェスト値が記載されたファイル)
これら全てのファイルが必要です(OCP 4.13.0 をインストールした時につかったミラーイメージファイル mirror_seq1_000000.tar と全く同じファイルがバスチョンサーバーに残っている場合は一番上のファイルは不要です)。これまでと同様に、これらのファイルを USB メディアなどを使ってバスチョンサーバーに持ち込む必要があります。
OCP アップグレードを実施する際にインターネット接続環境で行う作業は以上です。
【(2)(1)で取得したイメージファイルをエアギャップ環境に持ちこんでミラーレジストリを更新し、OCP をアップグレードする】
(1)はインターネット接続環境で実施する内容でしたが、ここから先はエアギャップ環境内での作業となります。まずは(1)の作業で用意したファイル群を USB メモリ等を使ってエアギャップ環境のバスチョンサーバー内に持ち込みます。以下ではこれらのファイルが全てバスチョンサーバーの /data/ フォルダ以下に用意されているものと仮定して説明を続けます(赤字はコメント):
- /data/mirror-ocp/mirror_seq1_000000.tar (OCP 4.13.0 のミラーイメージ) - /data/mirror-ocp/mirror_seq2_000000.tar (OCP 4.13.0 から 4.13.19 の差分ミラーイメージ) - /data/mirror-ocp/mirror_seq3_000000.tar (OCP 4.13.19 から 4.14.0 の差分ミラーイメージ) - /data/oc-4.14.0 (oc 4.14.0) - /data/oc-mirror-4.14.0 (oc-mirror 4.14.0) - /data/4.13.19.digest (4.13.19 のダイジェスト値が記載されたファイル) - /data/4.14.0.digest (4.14.0 のダイジェスト値が記載されたファイル)
エアギャップ環境の OCP をアップグレードするには、エアギャップ環境内のミラーレジストリをアップグレード先バージョンのものに更新する必要があります。今回の場合、まずはミラーレジストリを 4.13.19 仕様に更新して OCP 4.13.19 にアップグレードし、続けてミラーレジストリを 4.14.0 仕様に更新して OCP 4.14.0 にアップグレードする、という順序になります(エアギャップ環境でなければ、RedHat 提供の公開レジストリを使うことができるのでミラーレジストリを用意したり更新したりする必要はありません)。
というわけで、早速現在 4.13.0 使用のミラーレジストリを 4.13.19 仕様に更新・・・ したくなるのですが、その前に1点確認が必要です。 現在の 4.13.0 仕様のミラーレジストリ(以前のブログで 4.13.0 をインストールした時のミラーレジストリ)を作った時に使った mirror_seq1_000000.tar は、今回用意した mirror_seq1_000000.tar と全く同じファイルでしょうか? 4.13.0 から 4.13.19 への差分いらーイメージは mirror_seq2_000000.tar ですが、このファイルは「seq1 (mirror_seq1_000000.tar)がある前提での seq2」のファイルになっています。この "seq1" と全く同じファイルを使って現在のミラーレジストリが作られているのだとしたら、そのまま seq2 を適用できるのですが、同じ設定で seq1 を作り直したのだとしたら、そのままでは seq2 を適用できず、ミラーレジストリを調整する必要があります。
OCP インストール時とは違う mirror_seq1_000000.tar ファイルを用意している場合は seq2 の前提となっている seq1(今回用意した mirror_seq1_000000.tar )でミラーレジストリを上書きしてからでないと seq2 は正しく適用できないので(ごちゃごちゃ書いてますが、初期インストール時に使ったものと全く同じ環境が残っているかどうか自信がない場合はとりあえず)、まずは今回持ち込んだ /data/mirror-ocp/mirror_seq1_000000.tar を使ってミラーレジストリを上書きします。具体的には root 権限でターミナルを開き、トークンでログイン(ウェブコンソールの「ログインコマンドのコピー」からログイン)して、以下のコマンドを実行します:
# cd # oc mirror --continue-on-error --from=/data/mirror-ocp/mirror_seq1_000000.tar docker://registry.ocp.xxx.localdomain:5000
このコマンドが正常に終了していると "~/oc-mirror-workspace/" 以下に "results-xxxxxxxxxx" という名前のフォルダが作られています("xxxxxxxxxx" 部分は実行時のタイムスタンプ)。OCP インストール時にも同様のコマンドを実行しているので、"~/oc-mirror-workspace/" 以下にはタイムスタンプの異なる複数のフォルダができているはずです。今回作られたフォルダを判別するにはフォルダの作成時タイムスタンプで判断する必要があります。注意してください。
では、新たに作成された ~/oc-mirror-workspace/results-xxxxxxxxxx/ フォルダの情報を使ってミラーレジストリを更新します:
# cd oc-mirror-workspace # oc apply -f ~/oc-mirror-workspace/results-xxxxxxxxxx # oc apply -f ~/oc-mirror-workspace/results-xxxxxxxxxx/release-signatures/
これでアップグレード前のミラーレジストリの調整は完了です。
ここまでの作業が完了しているとアップグレード用のミラーレジストリ差分イメージを適用することができるようになります。まずは 4.13.0 から 4.13.19 への差分イメージ(mirror_seq2_000000.tar)でミラーレジストリを上書きし、その結果できあがったフォルダ("~/oc-mirror-workspace/results-yyyyyyyyyy/" "yyyyyyyyyy" 部分のタイムスタンプで判断)の情報を適用します(mirror_seq1_000000.tar のインポートを飛ばした場合はトークンでログインしてから実行する必要があります):
# cd # oc mirror --continue-on-error --from=/data/mirror-ocp/mirror_seq2_000000.tar docker://registry.ocp.xxx.localdomain:5000 # cd oc-mirror-workspace # oc apply -f ~/oc-mirror-workspace/results-yyyyyyyyyy # oc apply -f ~/oc-mirror-workspace/results-yyyyyyyyyy/release-signatures/
これでミラーレジストリには 4.13.0 インストール用だけでなく、4.13.19 アップグレード用のイメージも上書きされています。確認する場合は以下のコマンドを実行します:
# podman image search --list-tags --limit=1000 registry.ocp.xxx.localdomain:5000/openshift/release
実行結果が以下のように "4.13.19" という文字を含む内容になっていればミラーレジストリ内に 4.13.19 アップグレード用のイメージが含まれた状態になっています:
これでミラーレジストリは(現在の 4.13.0 から)4.13.19 にアップグレードできる状態になりました。早速アップグレードを実行してみましょう。まずはアップグレード先である 4.13.19 のダイジェスト値を確認します(青字は実行結果):
# cat /data/4.13.19.digest
sha256:f8ba6f54eae419aba17926417d950ae18e06021beae9d7947a8b8243ad48353a
"sha256:" で始まる1行のテキストが表示されます。この値を用いて以下の命令を実行することで 4.13.19 へのアップグレード指示を実行します:
# oc adm upgrade --allow-explicit-upgrade --allow-upgrade-with-warnings --to-image quay.io/openshift-release-dev/ocp-release@sha256:f8ba6f54eae419aba17926417d950ae18e06021beae9d7947a8b8243ad48353a
実行条件によっては警告が表示されることもありますが、エラーになっていなければ無視してください。最後に "Requested upgrade to ..." と表示されていれば成功です:
アップグレードの様子はウェブブラウザから確認できます。まずは以下のコマンドでウェブコンソールにログインするためのパスワードを確認します:
# cat ~/config/auth/kubeadmin-password
パスワードが確認できたらウェブブラウザでウェブコンソール(https://console-openshift-console.apps.ocp.xxx.localdomain/)を開き、ID は "kubeadmin" 、パスワードは上で確認したものを指定してログインします:
ログイン後、左上のメニューから Administration - Cluster Settings を選択します。上述のアップグレードコマンド(oc adm upgrade)が成功していると、Details タブ内で 4.13.19 へのアップグレードが進行中(Upgrade to 4.13.19 in progress)であることが分かります:
アップグレードは少しずつ進行してゆきます。しばらく待っているとアップグレードは完了し、新しいバージョン(4.13.19) に切り替わったことが確認できます:
同画面下部には OCP バージョンの更新履歴も表示されています:
ここまでの作業でエアギャップ環境の OCP が 4.13.0 から 4.13.19 へアップグレードできました。ミラーレジストリ更新時のややこしさはありましたが、基本的には 「ミラーレジストリ内に更新先バージョンのイメージを上書き」→「アップグレード」 という流れでアップグレードできます。
では同様にして 4.13.19 から 4.14.0 にアップグレードしてみましょう。まずはミラーレジストリを差分イメージファイルで上書きしておきます。上記同様に 4.13.19 から 4.14.0 への差分イメージ(mirror_seq3_000000.tar)でミラーレジストリを上書きし、その結果できあがったフォルダ("~/oc-mirror-workspace/results-zzzzzzzzzz/" "zzzzzzzzzz" 部分のタイムスタンプで判断)の情報を適用します(※):
# cd # oc mirror --continue-on-error --from=/data/mirror-ocp/mirror_seq3_000000.tar docker://registry.ocp.xxx.localdomain:5000 # cd oc-mirror-workspace # oc apply -f ~/oc-mirror-workspace/results-zzzzzzzzzz # oc apply -f ~/oc-mirror-workspace/results-zzzzzzzzzz/release-signatures/
※今回のミラーレジストリ更新では 4.mm.nn の mm 部分が変わるバージョンアップを行います。それが原因なのかどうかは分からないのですが、この 4.13.19 から 4.14.0 への差分イメージである mirror_seq3_000000.tar で上書きする場合は oc mirror コマンド実行時に "--continue-on-error" オプションが必須でした。
4.14.0 イメージで上書きできているか確認する場合は以下のコマンドを実行します:
# podman image search --list-tags --limit=1000 registry.ocp.xxx.localdomain:5000/openshift/release
実行結果が以下のように "4.14.0" という文字を含んでいることを確認します:
次に 4.14.0 のダイジェスト値を確認します(青字は出力結果):
# cat /data/4.14.0.digest
sha256:e2c70fca183e380c6121a1c847806f11e839482123277235a8579db472b9ccf2
4.14.0 のダイジェスト値を指定してアップグレード指示を実行します:
# oc adm upgrade --allow-explicit-upgrade --allow-upgrade-with-warnings --to-image quay.io/openshift-release-dev/ocp-release@sha256:e2c70fca183e380c6121a1c847806f11e839482123277235a8579db472b9ccf2
上述と同様にウェブブラウザで管理コンソールを開き、左上メニューから Administration - Cluster Settings を選択します。おそらく今回は前回のようにアップグレード実行中の画面にはならず、以下のようなエラーメッセージが表示されているはずです:
これはエラーというよりは確認メッセージで、アップグレード前のバージョン(4.13.19)からアップグレード後のバージョン(4.14.0)に上げることで API の互換性が失われてしまうものが含まれているための警告が表示されています。今回のようにマイナーバージョンが上がるタイプのアップグレードだと起こり得るようです。
この場合、以下のコマンドを追加で実行することで「互換性がないことを理解した上で 4.13 から 4.14 へアップグレードする」ことを指示できます:
# oc -n openshift-config patch cm admin-acks --patch '{"data":{"ack-4.13-kube-1.27-api-removals-in-4.14":"true"}}' --type=merge
このコマンドを実行後に先ほどの画面に戻るとアップグレードが再開されていることが確認できます:
しばらく待つとアップグレードが完了し、無事に 4.14.0 に切り替わったことが確認できます:
これで OCP クラスタ(サーバー)は 4.14.0 にアップグレードできました。最後に OCP クライアントである oc, oc-mirror を 4.14.0 のものに切り替えます(cp コマンドの前の "\" は強制上書き指定):
# \cp /data/oc-4.14.0 /usr/local/bin/oc # \cp /data/oc-mirror-4.14.0 /usr/local/bin/oc-mirror
"oc version" コマンドでサーバー・クライアントとも 4.14.0 に切り替わったことを確認します:
無事に目的であった OCP 4.14.0 へのアップグレードがエアギャップ環境内で実現できました。 このエアギャップ環境での OCP アップグレードはミラーレジストリの状態や、現在のミラーレジストリを作った時の環境が残っているかどうかによって手順が変わったりすることもあり、手順として説明するにはかなりややこしい内容でした。そんなこともあって「理論的にはできるはずだけど、これまで資料が見つからなかった」のかもしれません。
私が知る限り、インターネットに公開された情報としてはこれが初めてだったと思っていますが、私と同じように手順が分からずに苦しんでいる人の助けになれば幸いです。
・エアギャップ環境(インターネット接続のない環境)で OCP を導入/運用する上で必要な前提理解
・エアギャップ環境(インターネット接続のない環境)で OCP を導入する手順
・エアギャップ環境(インターネット接続のない環境)で OCP にアプリケーションを導入する手順
・エアギャップ環境(インターネット接続のない環境)に導入した OCP をエアギャップ環境内でアップグレードする手順