OTAでOCP4とK8sをお手軽アップデート

Red Hatの福岡オフィスでソリューションアーキテクトをしている田中司恩です。 この記事はOpenShift Advent Calendar 2019 - Qiita 15日目のエントリになります。

早いもので12月も残すところ半月。アドベントカレンダーも後半戦に突入ですね。 書く方も大変ですが、みなさんいろんな視点で良い記事を書かれているので読んでいてとても勉強になります。 残りの記事も楽しみです!

さて今回はOpenShift Container Platform 4(OCP4)の特徴的な機能の1つ、OTA(Over-The-Air)アップデート、通称OTAを紹介します。

はじめに

[図1]

OTAアップデート
OTAアップデート

OTAはOCP4のクラスターを複雑な操作をすることなく更新できる機能です。 本番運用中のインフラ環境を定期的にアップデートしていくのは大変な作業が伴います。 セキュリティパッチやOSの更新、Kubernetesのアップデート、などなど…

OTAはボタンをポチッと押すだけでそれらのアップデートが実行できるので、インフラ運用の負荷軽減に役立ちます。 また、OTAはデフォルトでオンになっている機能ですので、新しいバージョンのリリースを検知したらすぐに更新が実行できます*1

OCP 4.1で実行されるKubernetes(K8s)はv1.13でした。OCP 4.2になりK8sはv1.14へバージョンが上がっています。OTAでアップグレードすると、OCPだけでなくK8sも同時にアップグレードできます。 このお手軽さはOCP4ならではの機能です。OTAはIPI、UPIどちらでクラスターを作成した場合でも可能です。

(注意事項)

  • 自動でクラスターのアップデートが完了するのは、全てのノードがRHCOSで実行されている場合です*2
  • RHELノードは、RHCOSノードのアップデート実行後に手動でopenshift-ansibleのPlaybookを実行する必要があります
  • クラスターのバージョンを以前に戻す、ロールバックはサポートされていません

OTAに関するドキュメントは下記になります。

アップグレードチャネル

アップデート先のバージョンを選択するために、アップグレードチャネルという概念が導入されています。 OCP 4.1とOCP 4.2それぞれのバージョンに対応するアップグレードチャネルは下記の通りです*3

  • OCP 4.1

    • prerelease-4.1:プレリリース
    • stable-4.1:安定チャネル
  • OCP 4.2

    • candidate-4.2:リリース候補
    • fast-4.2:安定チャネルの前にリリースされる
    • stable-4.2:安定チャネル

基本的にはstable-を利用し、いち早くテストしたい場合などにはfast-を利用します。 OTA実行の際にはこのチャネルを切り替えて、任意のアップデートバージョンを選択できます。

アップグレードチャネルについては下記のナレッジに記載があります(英語)

OTAの実行

アップデートの実行はWeb GUIまたはCLIで実行できます。この記事ではGUIでの方法について紹介します。 下記はOCP4.2(v4.2.9)のクラスターの例です。今回はv4.2.9→4.2.10のバージョンアップをやってみます。

まず、GUIのメニューから、Administration > Cluster Settings > Overview へ移動します。 OTAを実行できるバージョンがある場合は、Update Nowが表示されます。

[図2]

現在のクラスターバージョン
現在のクラスターバージョン

Channelの下のstable-fast-などのリンクをクリックしてアップグレードチャネルを切り替えます*4。今回はstable-4.2を選択します。

[図3]

アップグレードチャネルの選択
アップグレードチャネルの選択

Update Nowを押し、アップデート先のバージョンを選択画面に遷移します。Update Nowを押してもすぐにOTAが開始されるわけではないのでご安心を。今回はSelect New Versionから4.2.10を選択します。 最後にUpdate を押すとアップデートが開始します。

[図4]

OTAの開始
OTAの開始

Cluster Settings > Cluster Operators を確認すると、現在進行中のOperatorのアップデートの様子が確認できます*5。 また、アップデートの実行中はローリングアップデートが実行されます。稼動中のPodの数やノードの数が多いと完了までに時間がかかります。 アップデート中にUpdate StatusがFailingになることがありますが、正常に進行していれば問題ないので作業完了まで気長に待ちましょう。

アップデートが完了するとUpdate Statusは下記のような表示になり、無事に作業完了したことを確認できます。

[図5]

アップデートの完了
アップデートの完了

ページ下のUpdate Historyを確認すると、開始から完了までにかかった時間を確認できます。

[図6]

アップデートの履歴"
アップデートの履歴

OCP4.1 → 4.2のアップデート

次に、K8sのバージョンアップを伴うOTAをやってみます。基本的な操作は先ほどと同じです。今回は4.1.27から4.2.10へのアップデートしてみます*6

まず、現在のOCP4.1のクラスターのバージョンを確認します。

[図7]

現在のクラスターバージョン
現在のクラスターバージョン

次にアップグレードチャネルを現在のstable-4.1からstable-4.2に変更します。

[図8]

アップグレードチャネルの選択
アップグレードチャネルの選択

最後に、Update now またはUpdates Availableを押してバージョン選択画面へ遷移し、アップデート先のバージョン(今回は4.2.10)を選択し、Updateを押します。

[図9]

OTAの実行
OTAの実行

アップデートが完了し、クラスターのバージョンが4.2.10になっていることが確認できます。

[図10]

アップデートの完了
アップデートの完了

K8sのバージョン確認

K8sのバージョンを確認するとアップデート前(4.1.27)はv1.13.4+2e68ccaでした。

# oc version 
Client Version: openshift-clients-4.2.2-201910250432
Server Version: 4.1.27
Kubernetes Version: v1.13.4+2e68cca

アップデート後(4.2.10)はv1.14.6+17b1cc6になっています。

# oc version 
Client Version: openshift-clients-4.2.2-201910250432
Server Version: 4.2.10
Kubernetes Version: v1.14.6+17b1cc6

OCPのアップデートと共にK8sのバージョンが上がっていることが確認できました*7

アップグレードパスについて

ここからはおまけです。

OCP4のアップグレードパスは複雑です。アップグレード元と先の対応関係は各バージョンのリリースノートに記載されています。 しかし、すべてのバージョンの対応関係を手作業で調べるの大変ですので、簡単に対応図を作成できる下記のナレッジの方法をご紹介します。

OCP4のアップグレード情報を取得するAPIが公開されていて、下記のように利用します。

$ curl -H "Accept: application/json" https://api.openshift.com/api/upgrades_info/v1/graph?channel=<CHANNEL>&arch=<ARCH> | jq '.'
  • <CHANNEL>:アップグレードチャネルで紹介したチャネル
  • <ARCH>:x86_64はamd64、IBM Zはz390x

出力される情報を利用し、Graphvizを用いて図式化します。サンプルスクリプトが下記に公開されています。

graph.sh

#!/bin/sh
#
# Usage:
#
#   cat cincinnati.json | graph.sh >graph.dot
#
# For example:
#
#   curl -sH 'Accept:application/json' 'https://api.openshift.com/api/upgrades_info/v1/graph?channel=prerelease-4.1' | graph.sh | dot -Tsvg >graph.svg
set -e

JQ_SCRIPT='"digraph Upgrades {\n  labelloc=t;\n  rankdir=BT;" as $header |
  (
    [
      .nodes |
      to_entries[] |
      "  " + (.key | tostring) +
             " [ label=\"" + .value.version + "\"" + (
               if .value.metadata.url then " href=\"" + .value.metadata.url + "\"" else "" end
             ) +
             " ];"
    ] | join("\n")
  ) as $nodes |
  (
    [
      .edges[] |
      "  " + (.[0] | tostring) + "->" + (.[1] | tostring) + ";"
    ] | join("\n")
  ) as $edges |
  [$header, $nodes, $edges, "}"] | join("\n")
'

exec jq -r "${JQ_SCRIPT}"

上記のスクリプトを利用してSVGファイルを作成します。 Graphvizの実行コマンドdotjqを使用するため、必要なパッケージをインストールしてください。

  • RHEL8の場合
# yum install graphviz jq
  • macOSの場合
$ brew install graphviz jq

下記は stable-4.2(x86-64)のアップグレードパスを出力する例です。

$ curl -sH 'Accept:application/json' 'https://api.openshift.com/api/upgrades_info/v1/graph?channel=stable-4.2&arch=amd64' | ./graph.sh | dot -Tsvg > stable-4.2.svg

下記のような図が出力されます。SVGファイルはWebブラウザなどで閲覧できます。(2019/12/15時点の図)

[図11]

stable-4.2(x86-64)のアップグレードパス
stable-4.2(x86-64)のアップグレードパス

まとめ

OTAを利用したOCPクラスターのアップデートについてご紹介しました。実際にとても簡単にOCPクラスターの更新を行うことができます。 その上OCPのバージョンアップやセキュリティアップデートだけでなく、K8sのアップデートも複雑なことをすることなくできてしまいます。 なにかと難しくなりがちなインフラの運用管理も、OCP4とOTAをうまく活用することでエンタープライズな環境へのK8sの導入を進めやすくなるのではないでしょうか。 気になる方は是非、OCP4の検証環境を構築してOTAにトライしてみてください!

Let's get Big Ideas!

*1:クラスター内のCluster Version Operatorが更新サービスを定期的にチェック

*2:RHCOS: Red Hat Enterprise Linux CoreOS

*3:nightly-4.1もありますが、ドキュメントに記載が無いので省略します。

*4:ドキュメントにはアップグレードチャネルと書いてますが、GUI上はUpdate Channel。

*5:Update Statusの下のView detailsを選択すると、Cluster Operatorsへ飛びます

*6:2019/12/15時点の最新版へのアップグレードパス

*7:GUIではクラスターのAbout画面でK8sのバージョンが確認できます

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