Red Hatの福岡オフィスでソリューションアーキテクトをしている田中司恩です。 この記事はOpenShift Advent Calendar 2019 - Qiita 15日目のエントリになります。
早いもので12月も残すところ半月。アドベントカレンダーも後半戦に突入ですね。 書く方も大変ですが、みなさんいろんな視点で良い記事を書かれているので読んでいてとても勉強になります。 残りの記事も楽しみです!
さて今回はOpenShift Container Platform 4(OCP4)の特徴的な機能の1つ、OTA(Over-The-Air)アップデート、通称OTAを紹介します。
はじめに
[図1]
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]
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]
アップデートが完了し、クラスターのバージョンが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の実行コマンドdot
とjq
を使用するため、必要なパッケージをインストールしてください。
- 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]
まとめ
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のバージョンが確認できます