Red Hat - Open Innovation Labsのブログ - TECH PLAY

TECH PLAY

Red Hat  - Open Innovation Labs

Red Hat - Open Innovation Labs の技術ブログ

全900件

Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 How to handle failures with Mutiny の翻訳記事です。 先週、Mutiny での障害処理についていくつか質問を受けました。だから、もう少し説明が必要なのかもしれない。 失敗はイベント まず、Mutiny はイベント駆動型のリアクティブプログラミングライブラリです。Mutiny では、イベントを処理します。上流の Uni や Multi はこれらのイベントを伝播し、あなたはそれらを処理できます。これらのイベントは、 アイテム、完了、キャンセル と... 失敗 があります Multi.createFrom().range( 0 , 10 ) .onItem().invoke(i -> System.out.println( "Received item " + i)) .onCompletion().invoke(() -> System.out.println( "We are done!" )) .onCancellation().invoke(() -> System.out.println( "The downstream does not want our items anymore!" ) ) .onFailure().invoke(t -> System.out.println( "Oh no! We received a failure: " + t.getMessage()) ) 失敗を受けた時の対処法は? 先ほどのスニペットのようにアクションを呼び出す以外にも、失敗を受けたときにできることは複数あります。 よくあるのはリカバリすることです。あなたは、特定のアイテムを渡すか、別の Uni でリカバリできます。 upstream .onFailure().recoverWithItem(failure -> "hello (fallback)" ) .subscribe().with(i -> System.out.println( "Received: " + i)); upstream .onFailure().recoverWithUni(failure -> getAnotherUni(failure)) .subscribe().with(i -> System.out.println( "Received: " + i)); Multi では、あなたは別の Multi を提供したり、ストリームを完成させたりすることでリカバリできます。 upstream .onFailure().recoverWithCompletion(); もしあなたがシステムを信頼していれば、 リトライ する事もできます。注意点としては、まず安全にリトライできるかどうかを確認する必要があります upstream .onFailure().retry() .withBackOff(Duration.ofSeconds( 1 ), Duration.ofSeconds( 10 )).atMost( 10 ) .subscribe().with(i -> System.out.println( "Received: " + i)); あなたは失敗を変換することもできます。例えば、低レベルの失敗をよりビジネスに適したものにマッピングできます。2 番目の障害を下流に伝播し、低レベルの障害を隠します。 Uni.createFrom().failure( new IOException( "boom" )) .onFailure().transform(t -> new BusinessException(t)) 失敗は終端 失敗は終端イベントです。上流で失敗が伝播した場合は、正常に動作できないことを意味します。Uni の場合は、アイテムを持っていても失敗しても構わないので、それはそれで問題ありません。でも Multi の場合はちょっと複雑です。 リカバリしたとしても、失敗を処理することで、残りの流れを手に入れられません。あなたの上流は... 壊れています 以下のコードを見てみましょう。 List<String> list = Multi.createFrom().range( 0 , 10 ) .onItem().invoke(v -> { if (v == 7 ) { throw new IllegalArgumentException( "We don't like seven!" ); } }) .onFailure().recoverWithItem( 7 ) .map(integer -> integer.toString()) .onItem().invoke(s -> System.out.println(s)) .collectItems().asList() .await().indefinitely(); これは、[1,2,3,4,5,6,7] を生成します。そして、残りの流れを生成しません。 7 で onItem().invoke() ステージが呼び出されると、失敗が発生します。それが流れを止めます。上流からそれ以上のアイテムを処理することはありません。 では、どうすればいいのか?隔離しましょう! ステージ が失敗を送信すると、ストリームを終了する失敗を送信します。そして、上流への購読をキャンセルします(正常に動作していないため、アイテムが足りないことを通知します)。そのため、上流から他のアイテムを処理し続ける必要がある場合は、その失敗を隔離して、上流への購読をキャンセルしないようにすればいいだけです。 これを達成するもっとも一般的なアプローチは以下です。 List<String> list = Multi.createFrom().range( 0 , 10 ) .onItem().transformToUniAndConcatenate(i -> // Isolate the failure in this block Uni.createFrom().item(i) .onItem().invoke(v -> { if (v == 7 ) { throw new IllegalArgumentException( "We don't like seven!" ); } }) .onFailure().recoverWithItem( 7 ) ) .map(integer -> integer.toString()) .onItem().invoke(s -> System.out.println(s)) .collectItems().asList() .await().indefinitely(); 基本的には、失敗する可能性のある操作を隔離します。もし失敗したら、リカバリーします。しかし、キャンセルはそのアイテムをキャンセルするだけで、完全なストリームはしません。それは次の 1 つのアイテムなどを受け取ることを意味します。このコードは、期待されるリストを生成します。 まとめ これで失敗を処理して、優雅に流れを続けることができるようになりました。 Mutiny についてもっと詳しく知りたい方は、以下の動画をチェックしてみてください。 youtu.be
こんにちは、レッドハットの Specialist Solution Architect の松田です。 初のオンライン開催となった、Red Hat Forum APAC 2020も終わり、今年も残りわずかとなりました。 さて、レッドハットにはクラウドネイティブアプリの開発に役立つ、ミドルウェアラインナップが充実していることをご存知ですか? ここでは、レッドハットのミドルウェアに関する注目ニュースを、各製品技術に特化したソリューションアーキテクトが、ご紹介します。 今回は 11 月号となります。 想定読者 エンタープライズアーキテクト アプリケーション開発者 システムの提案をするSIerの方 特集1 : 異なるデータセンター間の同期を行う AMQ Streams(Kafka) MirrorMaker2 medium.com 特集2 : Process Automation Managerのコンポーネントとデプロイメントアーキテクチャ Process Automation Manager(PAM)は、ビジネスプロセス・ビジネスルールのモデリングおよび実行管理基盤となるミドルウェアです。 PAMの各種コンポーネントについての解説と、実行環境のデプロイ方法とその構成例について紹介します。 speakerdeck.com 直近GAになった製品群 最近リリースとなったMiddleware製品群のリストをご紹介します。 見逃している製品が無いか、是非一度ご確認ください。 Red Hat build of Quarkus 1.7 Red Hat AMQ Interconnect 1.9 Red Hat AMQ Broker 7.7 Quarkusについて詳しく知りたい方は、こちらもどうぞ(過去記事より再掲)→ Quarkus Technical Deep Dive - Japanese - Speaker Deck 好評開催中!クラウドネイティブアプリ開発関連のWebinar全6回 Cloud Nativeを見据えたアプリケーションアーキテクチャとレガシーモダナイゼーション コンテナ時代の開発ツールチェインと開発プロセスのベストプラクティス クラウド/コンテナを前提とした時代のアプリケーション実行環境の選択 マイクロサービス/サーバーレス実践入門 これからのシステム連携を実現するデジタル基盤とアプローチ Cloud Nativeなデータパイプラインの作り方とオープンハイブリッドクラウドへの展開 各回とも、オンデマンドで視聴出来ます。(お名前とメールアドレス等の登録のみで視聴可能です) 下記リンクよりぜひご登録ください。 www.redhat.com
Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 Preview the new way to start coding with Quarkus の翻訳記事です。 Maven プラグインや code.quarkus.io を使って Quarkus プロジェクトを生成したことがありますか? もしそうであれば、なぜ Quarkus の拡張機能の幅が広いのに、REST API のサンプルアプリケーションしか生成できないのかと疑問に思ったかもしれません。もちろん、アプリの依存関係になる拡張機能を選べます。 拡張機能の中には、余分なコードなしで新しい機能を提供しているものもあるので、これはとてもクールです。しかし、いくつかの拡張機能は動作するために設定やコードを必要とし、かなり限定的なものになっています。 新しいコード生成システムの導入 というわけで、Quarkus 1.7.0.Final の新しいコード生成システムのプレビューをご紹介することにワクワクしています。それは Codestarts といいます。アイデアは簡単です。あなたはあなたの拡張機能を選択し、それらはあなたが始めるためのコード例を提供できます。 このプレビュー版は、まだ始まったばかりで、3つの Codestarts の例が含まれています。 RESTEasy 拡張機能を選択したときのJava、Kotlin、Scala での伝説的な RESTEasy の例 Qute 拡張機能を選択した時の、Java の可愛くて甘いテンプレートエンジン Qute あなたが例を提供する任意の拡張機能を選択しない場合、Java の強固で強力な Quarkus コマンドモード 試しにやってみる? アプリケーションを作成するための Quarkus Maven プラグインに機能フラグを追加しました。 mvn io.quarkus:quarkus-maven-plugin:create -DcodestartsEnabled` ビルドツールとして Maven を使用したコマンドモードの Quarkus プロジェクト mvn io.quarkus:quarkus-maven-plugin:create -DcodestartsEnabled \ -DprojectGroupId=org.acme -DprojectArtifactId=go-go-commando cd go-go-commando # Windows での./mvnw.cmd ./mvnw package java -jar target/go-go-commando-1.0-SNAPSHOT-runner.jar 前回と同様でビルドツールとして Gradle を使用 mvn io.quarkus:quarkus-maven-plugin:create -DcodestartsEnabled \ -DprojectGroupId=org.acme -DprojectArtifactId=go-go-commando-gradle \ -DbuildTool=GRADLE cd go-go-commando-gradle # Windows での ./gradlew.bat ./gradlew build java -jar build/go-go-commando-gradle-1.0-SNAPSHOT-runner.jar RESTEasy と Qute の例で Kotlin の Quarkus プロジェクト mvn io.quarkus:quarkus-maven-plugin:create -DcodestartsEnabled \ -DprojectGroupId=org.acme -DprojectArtifactId=kotlin-with-rest-is-qute \ -Dextensions=kotlin,resteasy,qute cd kotlin-with-rest-is-qute # Windows での./mvnw.cmd ./mvnw quarkus:dev Scala で SmallRye リアクティブメッセージング Kafka と空の Quarkus プロジェクト mvn io.quarkus:quarkus-maven-plugin:create -DcodestartsEnabled \ -DprojectGroupId=org.acme -DprojectArtifactId=scala-kafka \ -Dextensions=scala,quarkus-smallrye-reactive-messaging-kafka \ -DskipExample cd scala-kafka # Windows での./mvnw.cmd ./mvnw quarkus:dev 新しいプロジェクトの README.md に、(選択した拡張機能とビルドツールに関連した)説明を追加しました。 お気に入りのツール/拡張機能を使用して、空白の Quarkus アプリケーションを起動 Codestarts でも大きな改善点を導入しています 😅 笑ってはいけませんが、これはコミュニティからの正当な要求だったのです。Codestarts を使うと、 -DskipExample を追加することで空白の Quarkus アプリを生成できます。 Codestarts に欠けているいくつかの機能に気づくかも 生成された例のパッケージ名は org.acme に固定されています。カスタマイズできるようにしてもあまり意味がないと思っていたのですが、損だと思ったら教えてください。 プロジェクトには複数の例が含まれるので、競合を避けなければなりません。これが、アプリでREST パス を定義できなくなった理由です。 バグを募集中 Codestarts は安定化のために Quarkus 1.7.x ではまだプレビューモードになっています。できるだけ早くデフォルトの動作にしたいと思っています。だから、それを試してみて、あなたがバグを見つけたら報告してください:-) Codestarts の例に貢献 拡張機能を持っていて、その拡張機能の Codestarts を提供したい場合 Doc: https://github.com/quarkusio/quarkus/blob/master/independent-projects/tools/codestarts/codestarts.adoc Codestarts の例 dir: https://github.com/quarkusio/quarkus/tree/master/devtools/platform-descriptor-json/src/main/resources/codestarts ご質問やご提案がございましたら、 Zulip や Quarkus Development のメーリングリスト からお気軽にお問い合わせください。 ここでは、Codestarts の コアコード と、Quarkus アプリケーションを足場にするために使用される Codestarts 基盤 をご紹介した。 果てしなく新しい遊び場への扉が開きました 次の Quarkus リリースに向けて、すでに新しい Codestarts を準備しています。そして、自分だけの個人/会社の Codestarts を使うことができるとしたらどうでしょうか?続く...
Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 Quarkus 1.8.1.Final released - Bugfixes, RESTEasy Multipart extension の翻訳記事です。 本日、Quarkus 1.8.1.Final をリリースし、いくつかのバグフィックスとドキュメントの改善を行いました。 また、新しい RESTEasy Multipart 拡張機能を導入し、マルチパートで繰り返し発生するエンコーディングの問題を修正しました。 これは 1.8.0.Final を使っている人なら誰でも安心してアップグレードできます。 何が新しいの? このリリースは、1.7.0.Final で発見された様々なバグを修正し、いくつかのドキュメントの更新を提供するメンテナンスリリースです。 1.8.1.Final の完全な変更履歴 は GitHub で入手できます。 RESTEasy マルチパート RESTEasy でのマルチパートリクエストのデフォルトエンコーディングは US-ASCII でした。これは 2020 年にはあまり便利ではありません。 quarkus-resteasy-multipart 拡張機能のおかげで、デフォルトのエンコーディングが UTF-8 になり、必要に応じて設定できます。マルチパートの作業をする場合は、この拡張機能を使用するようにしてください。 これについての詳細は、 JSON REST サービスの記述ガイド を参照してください。 参加しよう 私たちはあなたのフィードバックをとても大切にしていますので、バグを報告し、改善を依頼してください...一緒に何か素晴らしいものを作りましょう! Quarkusのユーザーや好奇心の強い人は、恥ずかしがらずに歓迎コミュニティに参加してください。 GitHub にフィードバックを提供する; コードを作成して PRを行う ; Zulip や メーリングリスト で議論する; なにか質問があれば Stack Overflow で投稿してください。
Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 Quarkus 1.8 released - Multiple Persistence Units, Micrometer, jbang, GraalVM 20.2 の翻訳記事です。 夏の間、Quarkus 1.8 を焼くために頑張ってきました。 それはいくつかのピカピカの新機能が付属していますが、中でも以下のような機能があります。 Hibernate ORM 拡張機能のための複数の永続化ユニットのサポート 新しい Micrometer の拡張機能 簡単な Quarkus ベースのスクリプティングのため jbang を統合 GraalVM 20.2 へのアップデート いつものように、バグ修正や使い勝手の改善、ドキュメントの改善なども行われています。 移行ガイド 既存のアプリケーションの移行をお考えですか? 1.8 への移行ガイドはこちらです 。 Java 11 に対応した GraalVM 20.2 は、推奨される GraalVM のバージョンです。 何が新しいの? 複数の永続性ユニット これまで、Quarkus の標準設定では、Hibernate ORM 拡張機能は 1 つの永続化ユニットしかサポートしていませんでした。 persistence.xml を使用することでこの制限を回避することができますが、実用的ではありません。 1.8 では、Hibernate ORM 拡張機能に複数の永続化ユニットのサポートが導入されています。この機能はまだ実験的なものです。ですが、不安定というわけではありません。もしかしたら、フィードバックによっては設定方法に手を加えるかもしれません。この機能をお使いの方は、Zulip や私たちの quarkus-dev メーリングリストへのフィードバックをお願いします。 この新機能の詳細とアプリケーションでの使用方法については、 Hibernate ORM 拡張機能ガイド を参照してください。 標準の Hibernate ORM エンティティは複数の永続化ユニットに属することができます。ですが、Panache エンティティは 1 つの永続化ユニットにしか属することができません。 Micrometer 拡張機能 Micrometer は、アプリケーションからメトリクスを収集するために広く使われているライブラリです。既存の MicroProfile Metrics の実装に比べて大きな利点は、みなさんの通常のモニタリング・ツールに多くのダッシュボードが利用できることです。 Quarkus 1.8 では、 quarkus-micrometer と呼ばれる Micrometer の新しい拡張機能が導入されています。それについて詳細を学ぶためには このガイド を参考にしてみてください。 jbang を使ったスクリプト Quarkus 1.8 は jbang との統合を提供しています。これは Maven や Gradle の実行に必要なJava のスクリプトやアプリケーションを書けます。 Quarkus スタックを使用したクイックスクリプトの作成が簡単になりました。 jbang を使ったスクリプトガイド で詳しく説明しています。 GraalVM 20.2 Quarkus のアプリケーションからネイティブの実行ファイルをビルドしている場合は、推奨バージョンである GraalVM 20.2 にアップデートする時期になっています。このバージョンはこれからの時期におすすめのバージョンです。 SmallRye OpenAPI SmallRye OpenAPI のユーザーは、生成された API ドキュメントを保存する機能をしばしば要求します。 新しい quarkus.smallrye-openapi.store-schema-directory プロパティは、まさにこれを実現します。 Quartz quarkus.quartz.instance-name 設定プロパティを設定することで、Quartz の設定が可能になりました。 1.8 からは、Quartz ジョブで CDI インジェクションを使用できるようになりました。 拡張ポイント(トリガーリスナー、ジョブリスナー、プラグイン)の設定が変更されていますの。この機能をご利用の方は、 更新されたドキュメント を参照して設定を移行してください。 MongoDB with Panache の Kotlin をサポート 私たちの拡張機能の中には、Kotlin を適切にサポートするためにいくつかの追加が必要なものがあります。これは、MongoDB with Panache 拡張機能の場合です。 MongoDB with Panache と Kotlin を使用している場合は、プロジェクトに quarkus-mongodb-panache-kotlin 拡張機能を追加してください。 完全な変更ログ 1.8.0.CR1 と 1.8.0.Final の完全な変更ログはGitHubで入手できます。 ADOPTERS.md Quarkusの使用に関する情報を共有するために、リポジトリのルートに ADOPTERS.mdファイル を追加しました。 Quarkusを使用していて、私たちのブログでインタビューを受けたい場合、または単にこのファイルに追加したい場合は、私たちにご連絡ください。 貢献者 Quarkusには現在 356人の貢献者 がいます。皆様、本当にありがとうございました。 特に1.8リリースについてはみなさんのおかげです。 Aaron Coburn, Alex Soto, Alexey Loubyansky, Andreas Eberle, Andrej Petras, Andy Damevin, Antonio Goncalves, antonwiens, Bill Burke, Bobby Alex Philip, Charlie Powicki, Clement Escoffier, Daniel Platz, Dmitry Shohov, Enercido Alcantara, Erin Schnabel, Fabian Stäber, Falko Modler, Foivos Zakkak, Galder Zamarreño, Garima Monga, Gautier de Saint Martin Lacaze, George Gastaldi, Georgios Andrianakis, ghokun, Guillaume Le Floch, Guillaume Smet, Gunnar Morling, Gwenneg Lepage, Gytis Trikleris, Jaikiran Pai, Jan Martiška, Juri Berlanda, Justin Lee, Katia Aresti, kdnakt, Ken Finnigan, ketoketo, Kevin Viet, Knut Wannheden, Ladislav Thon, Laurent Broudoux, Luca Burgazzoli, Leandro, Loïc Hermann, Loïc Mathieu, Manyanda Chitimbo, MarceloArraes, Martin Kouba, Martin Schoene, Matej Novotny, Matthias Harter, Max Rydahl Andersen, Michael Simons, Michał Górniewski, Michał Szynkiewicz, Moncef, Moritz Becker, noelo, Pasquale Congiusti, Paul Carter-Brown, Phillip Kruger, Radim Vansa, Rafael T. C. Soares (A.K.A Tuelho), Raffael Hertle, Ramiz Ismailov, Roberto Cortez, Rohan Maity, Romain Quinio, Rostislav Svoboda, Sanne Grinovero, Sebastian Daschner, Sergey Beryozkin, Steffen Vinther Sørensen, Stuart Douglas, Stéphane Épardaud, Thomas Segismont, TNM Technologies, tomekl007, Yashar Imanlou and Yoann Rodière 参加しよう 私たちはあなたのフィードバックをとても大切にしていますので、バグを報告し、改善を依頼してください...一緒に何か素晴らしいものを作りましょう! Quarkusのユーザーや好奇心の強い人は、恥ずかしがらずに歓迎コミュニティに参加してください。 GitHub にフィードバックを提供する; コードを作成して PRを行う ; Zulip や メーリングリスト で議論する; なにか質問があれば Stack Overflow で投稿してください。
Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 MicroProfile OpenAPI for everyone の翻訳記事です。 MicroProfile OpenAPI は、主に JAX-RS エンドポイントに OpenAPI を追加するために使用されます。このブログ記事では、Quarkus で使用されている場合に、 SmallRye の実装 がどのように拡張され、いくつかの追加機能と、より多くのウェブフレームワークをサポートしているかを見ていきます。 Quarkus を使用 サンプルコードは こちら にあります。 code.quarkus.io を使ってプロジェクトを初期化できます - SmallRye OpenAPI 拡張機能を確実に含むことを確認してください。 JAX-RS まずは Quarkus での基本的な JAX-RS の例を見てみましょう。 message と to フィールドを持つ Greeting オブジェクトがあります。そして、greeting 用の GET 、 POST 、 DELETE エンドポイントを作成します。 通常の Quarkus のセットアップとは別に、JAX-RS エンドポイントを作成するためには、 pom.xml に次のように記述する必要があります。 <dependency> <groupId> io.quarkus </groupId> <artifactId> quarkus-smallrye-openapi </artifactId> </dependency> <dependency> <groupId> io.quarkus </groupId> <artifactId> quarkus-resteasy </artifactId> </dependency> <dependency> <groupId> io.quarkus </groupId> <artifactId> quarkus-resteasy-jsonb </artifactId> </dependency> Quarkus では、 Application クラスは必要ありません。Endpointクラスを追加すればいいだけです。 @Path( "/jax-rs" ) @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class JaxRsGreeting { @GET @Path( "/hello" ) public Greeting helloJaxRs() { return new Greeting( "Hello" , "JAX-RS" ); } @POST @Path( "/hello" ) public Greeting newHelloJaxRs(Greeting greeting) { return greeting; } @DELETE @Path( "/hello/{message}" ) public void deleteHelloJaxRs( @PathParam( "message" ) String message) { // Here do the delete... } } 今のところ MicroProfile OpenAPI アノテーションはまだ追加していません。ですが、 quarkus-smallrye-openapi 拡張機能を追加したので、すでに /openapi の下に Schema ドキュメントが生成されています。 --- openapi : 3.0.3 info : title : Generated API version : "1.0" paths : /jax-rs/hello : get : responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : requestBody : content : application/json : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /jax-rs/hello/{message} : delete : parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content components : schemas : Greeting : type : object properties : message : type : string to : type : string 詳細は quarkus.io/guides/rest-json を 参照してください。 OpenAPI MicroProfile OpenAPI を使用して、生成されたスキーマドキュメントに詳細な情報を追加できます。 config を使用したヘッダ情報 SmallRye に追加した機能の一つに、ヘッダ情報を追加する機能があります。MicroProfile の設定では、通常はアノテーションを使って Application クラスに追加するものです。これは、 Application クラスを必要としないため Quarkus では便利です。そのため、 application.properties に以下を追加することで、ヘッダ情報を得られます。 mp.openapi.extensions.smallrye.info.title=OpenAPI for Everyone %dev.mp.openapi.extensions.smallrye.info.title=OpenAPI for Everyone (development) %test.mp.openapi.extensions.smallrye.info.title=OpenAPI for Everyone (test) mp.openapi.extensions.smallrye.info.version=1.0.0 mp.openapi.extensions.smallrye.info.description=Example on how to use OpenAPI everywhere mp.openapi.extensions.smallrye.info.contact.email=phillip.kruger@redhat.com mp.openapi.extensions.smallrye.info.contact.name=Phillip Kruger mp.openapi.extensions.smallrye.info.contact.url=https://www.phillip-kruger.com mp.openapi.extensions.smallrye.info.license.name=Apache 2.0 mp.openapi.extensions.smallrye.info.license.url=http://www.apache.org/licenses/LICENSE-2.0.html 次に、 /openapi の下にある生成されたスキーマドキュメントのヘッダを見てください。 --- openapi : 3.0.3 info : title : OpenAPI for Everyone (development) description : Example on how to use OpenAPI everywhere contact : name : Phillip Kruger url : https://www.phillip-kruger.com email : phillip.kruger@redhat.com license : name : Apache 2.0 url : http://www.apache.org/licenses/LICENSE-2.0.html version : 1.0.0 # Rest of the schema document... 操作に OpenAPI アノテーションを追加 MicroProfile OpenAPI のアノテーションを使用して、 Tag アノテーションなどのエンドポイントをさらに記述できます。 @Path( "/jax-rs" ) @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Tag(name = "JAX-RS Resource" , description = "Basic Hello World using JAX-RS" ) ① public class JaxRsGreeting { //... } MicroProfile OpenAPI アノテーションの使用例 操作 ID を自動生成 スキーマドキュメントを使用してクライアントスタブを生成するツールもあります。これらは、スキーマドキュメント内の operationId が必要です。これはクライアントスタブメソッドの名前に使用されます。SmallRye では、メソッド名( METHOD )、クラスとメソッド名( CLASS_METHOD )、パッケージとクラスとメソッド名( PACKAGE_CLASS_METHOD )のいずれかを使用して自動生成するサポートを追加しました。これを行うには、 application.properties に次のように追加します。 mp.openapi.extensions.smallrye.operationIdStrategy=METHOD これで、スキーマドキュメント内の各操作の operationId が表示されます。 --- openapi : 3.0.3 # Header omitted... /jax-rs/hello : get : tags : - JAX-RS Resource operationId : helloJaxRs ① responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - JAX-RS Resource operationId : newHelloJaxRs ① requestBody : content : application/json : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /jax-rs/hello/{message} : delete : tags : - JAX-RS Resource operationId : deleteHelloJaxRs ① parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content 自動生成された操作 ID OpenAPI のバージョンを変更 API ゲートウェイによっては、動作するために特定の OpenAPI バージョンが必要な場合があります。SmallRye 拡張機能で生成されたスキーマドキュメントは 3.0.3 をバージョンとして生成されます。ですが、これらのバージョン間にはわずかな違いしかないので、 3.0.0 、 3.0.1 、 3.0.2 に変更できます。これを application.properties に追加することで実現できます。 mp.openapi.extensions.smallrye.openapi=3.0.2 これで生成されたバージョンになります。 --- openapi: 3.0.2 # Rest of the document... 詳細は quarkus.io/guides/openapi-swaggerui を参照してください。 Spring Web 最近、SmallRye OpenAPI に Spring Web のサポートが追加されました。これは、Quarkus で Spring Web を使用する際にデフォルトの OpenAPI ドキュメントが表示されるだけでなく、MicroProfile OpenAPI を使用して Spring Web のエンドポイントをさらに記述できることを意味します。 現在のアプリケーションに Spring Rest Controller を追加してみましょう。まず、これを pom.xml に追加します。 <dependency> <groupId> io.quarkus </groupId> <artifactId> quarkus-spring-web </artifactId> </dependency> これまで見てきた JAX-RS と同じようなエンドポイントを Spring Web を使って作成できます。 @RestController @RequestMapping(value = "/spring" , produces = MediaType.APPLICATION_JSON_VALUE) @Tag(name = "Spring Resource" , description = "Basic Hello World using Spring" ) public class SpringGreeting { @GetMapping( "/hello" ) public Greeting helloSpring() { return new Greeting( "Hello" , "Spring" ); } @PostMapping( "/hello" ) public Greeting newHelloSpring( @RequestBody Greeting greeting) { return greeting; } @DeleteMapping( "/hello/{message}" ) public void deleteHelloSpring( @PathVariable(name = "message" ) String message) { // Here do the delete... } } Spring の注釈はスキャンされ、スキーマドキュメントに追加されます。 --- openapi : 3.0.3 # Header omitted... /spring/hello : get : tags : - Spring Resource operationId : helloSpring responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - Spring Resource operationId : newHelloSpring requestBody : content : '_/_' : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /spring/hello/{message} : delete : tags : - Spring Resource operationId : deleteHelloSpring parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content 詳細は quarkus.io/guides/spring-web を参照してください。 Vert.x Reactive Routes Quarkus では、Reactive Routes を使用して Vert.x エンドポイントを構築できます。Spring Web と同様に、エンドポイントは OpenAPI スキーマで利用可能になり、MicroProfile OpenAPI を使ってさらに記述できます。Quarkus で Vert.x Reactive Route を追加するには、 pom.xml に次のように記述する必要があります。 <dependency> <groupId> io.quarkus </groupId> <artifactId> quarkus-vertx-web </artifactId> </dependency> これでエンドポイントを作成できます。 @ApplicationScoped @RouteBase(path = "/vertx" , produces = "application/json" ) @Tag(name = "Vert.x Resource" , description = "Basic Hello World using Vert.x" ) public class VertxGreeting { @Route(path = "/hello" , methods = HttpMethod.GET) public Greeting helloVertX() { return new Greeting( "Hello" , "Vert.x" ); } @Route(path = "/hello" , methods = HttpMethod.POST) public Greeting newHelloVertX( @Body Greeting greeting) { return greeting; } @Route(path = "/hello/:message" , methods = HttpMethod.DELETE) public void deleteHelloVertX( @Param( "message" ) String message) { // Here do the delete... } } これで Vert.x Routes が OpenAPI で利用できるようになりました。 --- openapi : 3.0.3 # Header omitted... /vertx/hello : get : tags : - Vert.x Resource operationId : helloVertX responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - Vert.x Resource operationId : newHelloVertX requestBody : content : '_/_' : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /vertx/hello/{message} : delete : tags : - Vert.x Resource operationId : deleteHelloVertX parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content 詳細は quarkus.io/guides/reactive-routes を参照してください。 Panacheで生成されたエンドポイント Quarkus では、Panache を使用してJAX-RS エンドポイントを生成できます。 pom.xml に quarkus-smallrye-openapi 拡張機能がある場合、これらの生成されたクラスもスキャンされ、OpenAPI スキーマドキュメントに追加されます。 詳細は quarkus.io/guides/rest-data-panache を参照してください。 他のWebフレームワーク また、Schema ドキュメントのその部分を yaml ファイルで提供することで、他のエンドポイントをドキュメントに追加できます。例えば、いくつかのメソッドを公開しているサーブレットを持っていて、それらをスキーマドキュメントに追加したいとしましょう。Servlet は一例であり、どんな Web フレームワークでも動作します。 そこでまず、Quarkus でサーブレットのサポートを追加するために、これを pom.xml に追加します。 <dependency> <groupId> io.quarkus </groupId> <artifactId> quarkus-undertow </artifactId> </dependency> これで、例えばこのような Servlet エンドポイントを作成できるようになりました。 @WebServlet( "/other/hello/*" ) public class ServletGreeting extends HttpServlet { private static final Jsonb JSONB = JsonbBuilder.create(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "application/json" ); Greeting greeting = new Greeting( "Hello" , "Other" ); PrintWriter out = response.getWriter(); out.print(JSONB.toJson(greeting)); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "application/json" ); Greeting greeting = JSONB.fromJson(request.getInputStream(), Greeting. class ); PrintWriter out = response.getWriter(); out.print(JSONB.toJson(greeting)); } @Override protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Here do the delete... } } ここで、これらのエンドポイントにマップする OpenAPI Schema ドキュメントが必要になります。 src/main/resources/META-INF にある openapi.yml というファイルに追加する必要があります。 --- openapi : 3.0.3 tags : - name : Other Resource description : Basic Hello World using Something else paths : /other/hello : get : tags : - Other Resource operationId : helloOther responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - Other Resource operationId : newHelloOther requestBody : content : application/json : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /other/hello/{message} : delete : tags : - Other Resource operationId : deleteHelloOther parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content これは他のエンドポイントとマージされ、ドキュメント内のすべてのパスを公開します。そのため、最終的には /openapi の出力は以下のようになります。 --- openapi : 3.0.2 info : title : OpenAPI for Everyone (development) description : Example on how to use OpenAPI everywhere contact : name : Phillip Kruger url : https://www.phillip-kruger.com email : phillip.kruger@redhat.com license : name : Apache 2.0 url : http://www.apache.org/licenses/LICENSE-2.0.html version : 1.0.0 tags : - name : Other Resource description : Basic Hello World using Something else - name : Spring Resource description : Basic Hello World using Spring - name : JAX-RS Resource description : Basic Hello World using JAX-RS - name : Vert.x Resource description : Basic Hello World using Vert.x paths : /other/hello : get : tags : - Other Resource operationId : helloOther responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - Other Resource operationId : newHelloOther requestBody : content : application/json : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /other/hello/{message} : delete : tags : - Other Resource operationId : deleteHelloOther parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content /jax-rs/hello : get : tags : - JAX-RS Resource operationId : helloJaxRs responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - JAX-RS Resource operationId : newHelloJaxRs requestBody : content : application/json : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /jax-rs/hello/{message} : delete : tags : - JAX-RS Resource operationId : deleteHelloJaxRs parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content /spring/hello : get : tags : - Spring Resource operationId : helloSpring responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - Spring Resource operationId : newHelloSpring requestBody : content : '_/_' : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /spring/hello/{message} : delete : tags : - Spring Resource operationId : deleteHelloSpring parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content /vertx/hello : get : tags : - Vert.x Resource operationId : helloVertX responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' post : tags : - Vert.x Resource operationId : newHelloVertX requestBody : content : '_/_' : schema : $ref : '#/components/schemas/Greeting' responses : "200" : description : OK content : application/json : schema : $ref : '#/components/schemas/Greeting' /vertx/hello/{message} : delete : tags : - Vert.x Resource operationId : deleteHelloVertX parameters : - name : message in : path required : true schema : type : string responses : "204" : description : No Content components : schemas : Greeting : type : object properties : message : type : string to : type : string JAX-RS、Spring Web、Vert.x Reactive Routes、Servlet のリソースが含まれています。 Swagger UI Quarkus では、デフォルトで Swagger UI が含まれており、 localhost:8080/swagger-ui をブラウズすると、すべてのエンドポイントを含むUIが表示されます。 まとめ 今回の記事では、Quarkus が MicroProfile OpenAPI 仕様を拡張し、エンドポイントのドキュメント化をより簡単にする方法を見てみました。また、それを使ってどのような Web フレームワークを文書化するかについても見てみました。 何か問題を見つけたり、提案があれば、 SmallRye OpenAPI プロジェクトに移動して、そこで議論しましょう。
この記事は Red Hat Blog の Role of APIs in an increasingly digital world を、許可をうけて翻訳したものです。 COVID-19は世界に非常に大きな影響をもたらしました。私たちがビジネスを行う方法、働く場所、サービスを提供する方法、コミュニケーションの方法に影響を与えています。私たちは新しいやり方でこれらのことを実現していかなければなりませんが、アプリケーション・プログラミング・インターフェース(API)はその手助けとなります。 デジタル主導の世界では、アプリケーションは経済や社会の基盤となっており、通常これらのアプリケーションは持っている機能を実行するために、さまざまな他のアプリケーションやシステムと通信し、連携する必要があります。APIはこの変化に対応していくための1つの方法となります。 APIでデジタルトランスフォーメーションを実現 絶えず進化するデジタル経済において、新しいサービスを継続的に実現するためにはAPIが必要ですが、デジタルファースト戦略の必要性からAPIはこれまで以上に優先順位の高いものとなっています。すべての組織は、迅速に変化を起こし、新しいビジネスの進め方に適応する必要性に直面しています。APIの活用により、この変革のプロセスを合理的にすすめることが可能となります。 APIのメリット APIは、分散型クラウドネイティブ開発環境で選択されるアプリケーション連携のための手法であり、開発者や構築中のアプリケーションにさまざまなメリットを提供します。 開発の高速化:API は複雑な接続を簡素化するため、開発者は変化するニーズに素早く対応しやすくなり、最終的には開発サイクルを加速させることができます。 再利用性:API は積み木のように再利用することができるため、開発プロセスをさらに高速化し、開発生産性を向上させます。 自動化:API はアプリケーションやサービス間の通信を簡素化することで自動化を可能にし、手動のプロセス、電話、ファックス、時間のかかるポイントツーポイントの連携の必要性を無くすことができます。 コラボレーション:多くの場合、社内のアプリケーションも外部のアプリケーションやシステムと連携する必要があります。API は、本来通信するように想定されていないような社内外のネットワークにおけるアプリケーション間のシンプルなインターフェイスとして機能することで、サードパーティとのコラボレーションを促進し、APIが無ければ実現できないような他社との協業も実現可能にします。 イノベーション:アプリケーション同士を個別に連携するやり方では、実装と保守にコストと時間がかかりがちです。API は低コストでシンプルであるため、様々な試みやイノベーションが促進されます。 現在と未来のためのAPI:必須のユースケース APIは様々なユースケースにおいて利点があります。COVID-19の文脈では、組織が経済的混乱と戦っていくために、APIが役立つ主要なユースケースとして以下の4つがあります。 リモートサービス 現在、多くのサービスプロバイダーが物理的に顧客と離れており、多くの企業がビジネスのやり方を変えています。事業継続を可能にするために、多くの企業は顧客にリモートでのサービス提供を続けています。 遠隔医療は、APIがリモートサービスを可能にするのにどのように役立つかを示す好例です。患者がオフィスに来られない場合、特定の医療サービスをリモートで提供することができます。しかし、このような状況では、どのようなビデオ会議システムでも機能するわけではありません。なぜなら、その技術は保険会社の承認を得ていなければならず、政府の厳しい医療規制を満たすだけの安全性が求められるからです。 そのため、患者が医療従事者と対面するためには、専用のビデオシステムを用意する必要があります。医療提供者はこれらの新しいビデオシステムへの接続を急いでおり、APIは必要な接続を行うためのより安全で信頼性の高い方法の一部となります。 一例として、あるヘルスケアテクノロジー企業は、ヘルスケアプロバイダーが自社のシステムから消費できるAPIを開発し、プロバイダーはあらゆるアプリやウェブサイトに遠隔医療診断機能を追加することができるようになりました - AIの推論エンジンと症状、検査結果、状態の豊富なデータベースに裏打ちされています。このAPIは、カスタム症状チェッカー、トリアージアプリ、チャットボット、さらには音声対応の健康アシスタントを構築するなど、さまざまなクリエイティブな方法で使用することができます。最近では、医療従事者がコロナウイルスの症状を遠隔で診断できるようにするCOVID-19リスクアセスメントAPIの構築にも同じ技術を使用しています。 サプライチェーンの再構築 COVID-19の出現により、多くの企業は経済とそのサプライチェーンを全く新しい方法で見直すことを余儀なくされています。トイレットペーパーや医療用マスクのように、以前は日常的なサプライチェーンを持つ製品は、今ではほとんどの消費者が店頭でこれらの製品を見つけたり、オンラインで注文することができないほど需要が高くなっています。 このような時代に顧客にサービスを提供したい小売業者は、需要の変化に対応するためにサプライチェーンを再構築する方法を見つけなければなりません。APIはこのユースケースに適しています。 例えば、APIを使用することで、アプリケーションが受注、生産台数、製品の欠陥などのデータを追跡して共有できるようになりますが、これらの情報はすべて、サプライチェーンの混乱に対応するためにメーカーにとって重要なものです。また、生産現場のチームメンバーがハンドヘルドデバイスを介してデータにアクセスしたり、通信したりできるようにするためにも、APIは非常に重要です。 ある世界的な医療技術プロバイダーは、病院や医療従事者が必要とする製品の製造を急ピッチで進めなければなりませんでした。同社は、サプライチェーンの変化に対応するために製造プロセスの早急な再構築を進めていますが、それにはAPIとAPI管理が欠かせません。 また、あるヨーロッパのメーカーは、保護マスク、保護医療キット、医療用防護服セット、人工呼吸器など、中国からの寄付金をスロベニアに届けるために、サプライチェーンを一時的に変更しています。同社のITチームは、DevOpsアプローチとAPI管理を採用し、必要な変更をできるだけ早く行えるようにしました。 情報の共有 COVID-19 の危機は、企業のコミュニケーションの方法とその中身を大きく変えました。医療提供者、医療研究機関、政府機関、企業、その他の組織は、重要なコロナウイルスのデータを相互に共有し、従業員、顧客、さらには一般の人々にも重要なメッセージを伝えなければならないため、情報の共有はこれまで以上に重要になっています。 例えば、COVID-19の治療法やワクチンの研究に関わる関係者は、以前よりもはるかに迅速にデータを共有できるようにならなければなりません。わずかな情報が、ウイルスと戦い、命を救い、世界経済を回復させる鍵となる可能性があります。このような緊急性を考慮した場合、APIは世界中の多くの組織を効率的かつ安全に接続する方法となります。 ある調査会社は、世界保健機関やホワイトハウス科学技術局などのパートナーと協力して、COVID-19に関する最新の調査結果、裏付け、データへの迅速かつ直接的なアクセスを世界の医療業界に提供しています。同社は、何千ものレポートを提供し、オンラインコロナウイルスダッシュボードを提供しています。情報を発信する方法の急速な変化の中で、同社はAPIとAPI管理を利用して、情報を共有するための新しい接続方法を形成しています。 もう一つの例として、欧州の独立系・非営利のテレビ放送局は、自国でのステイホームの命令により、通常よりも高い視聴率を記録しています。この放送局は、市民がアクセスする必要のあるコロナ情勢に関する重要な情報を提供しています。健康の危機に関する最新ニュースを国民に伝え続けるために、同放送局はコンテンツと自文字多重放送のAPIを活用しています。 行政サービス COVID-19のような危機において、APIは市民のニーズに迅速に対応するために必要な柔軟性を政府機関に提供してくれます。例えば、何百万人もの市民や企業に補助金を迅速に提供するためには、金融取引にアプローチする新しい方法が必要であり、APIを使うことで適切なシステムが適切な形で接続することができるようになります。 例えば、アルゼンチン保健省は最近APIによるデータアクセスの仕組みを実装して、新たに国によるデジタル健康ネットワークを構築し、健康に関する共通サービスへのアクセシビリティを向上させました。同省はAPIを利用して異なるデータソースを統合し、臨床記録、処方箋、公共情報をより簡単に利用できるようにしています。 APIを利用することで、アルゼンチンのどの医療センターでも、患者の相互識別システムによって検証された情報を要求して転送することができるようになりました。医師は患者の医療情報に網羅的にアクセスできるようになり、最高品質のケアを提供するために協力し合うことができるようになりました。APIは患者の医療情報保護の一環としても利用できます。一般的な医療に加えて、政府はこの同じシステムを使用することで、アルゼンチン国民が常に最新情報を得られるようにし、国内外のCOVID-19の患者数が追跡できるようになっています。 もう一つの例として、あるヨーロッパの郵政局では、顧客体験を向上させるために新しいITプラットフォームを構築し、複数のチャネルでより適切なサービスがよりタイムリーに提供できるようにしています。この政府機関では、今起こっている問題に対してより迅速に対応できるようになっています。この機関は市民の年金分配を管理していますが、多くの市民は通常、12,800か所のうちの1か所に出向いて支払いを受ける必要があります。国の強制的なロックダウンに対応し、ソーシャルディスタンスを保つために郵便局への訪問時間をずらす必要がありました。郵便局は、APIを使って構築されたオンラインと電話のチャットボットを介して、個人の指定した時間帯と支店を通信する新サービスを48時間以内で展開することができました。 さらに、ヨーロッパのある政府はAPIを使用して、COVID-19のロックダウン中に、定期的に更新される地図やデジタルハンドブックなどの重要な更新情報を公共の交通機関、企業、市民に提供しています。複数の交通機関からの最新情報を集約し、全国の様々な関係者に配信することも、必要なアプリケーションやシステムを接続するAPIを利用することで容易に実現できました。 API戦略の再考 上記の創意工夫に富んだ例はAPIのユースケースのほんの一例に過ぎません。他にも多くの組織が現在直面しているリアルタイムの状況に対処するだけでなく、将来も役立ち得るAPI戦略を立てています。 私たちの世界は瞬く間に変化する可能性があり、「未知なる未知」、つまり予測することができない変化にも備えなければなりません。現在使用しているアプリケーションとの接続性はもちろん、明日出現するかもしれない革新的なイノベーションへの接続性も提供するように、未知なる未来に向けたAPIの設計を行うことで、アプリケーション間の接続はより速く、より安全に、より簡単にできるようになっていくのです。 参考情報 Argentine Ministry of Health improves patient experience with national data network Santalucia digitalizes customer experience with Red Hat E-book: API Owners manual
OpenStackを担当しているソリューションアーキテクトの輿水です。 Red Hat OpenStack Platform Distributed Computes Nodes(以下DCN)はOpenStackのコントロール部分をセントラルサイトに集約し、計算リソースやストレージをエッジサイトに分散させる仕組みです。実装自体はRHOSP 10の頃より行われており、機能改善・増強が続けられています。RHOSP 16.1で大きく変わった点は、デプロイモデルとRed Hat Ceph Storage 4との統合によるストレージ機能の強化です。 DCNのデプロイモデル 現在のRHOSPはOpenStack Directorを利用してデプロイされた環境がサポート対象となっています。DCNをOpenStack Directorを利用してデプロイする際、RHOSP 16までは単一のheatスタックを利用していましたが、16.1からはエッジサイトごとにheatスタックを利用するマルチスタックデプロイが可能になりました。デプロイモデルの違いは以下の通りです。 RHOSP 16 以前のデプロイモデル RHOSP 16.1 デプロイモデル エッジサイトでのストレージ これまでのバージョンでは、エッジサイトではCompute Nodeのローカルのストレージのみが利用可能でしたが、16.1よりエッジサイトごとにCephクラスターを持つ事が構成がサポートされるようになりました。エッジサイトで稼働するワークロードはそのサイトのローカルのCephクラスターを利用します。また、イメージサービス(glance)マルチストアがサポートされ、各エッジサイトにイメージプールを持ち、セントラルサイトとエッジサイト間で非同期でイメージのコピーを行えるなど、管理性や性能が向上しています。 エッジサイトでは、Ceph単体ではなく、ComputeとCephが同一ノードで稼働するHCI Nodeを利用します。HCI NodeはCephの管理機能を含むため可用性を考慮して最低3台必要です。また、HCI Node以外に、Compute機能のみを持つCompute Nodeを配置することも可能です。なお、エッジサイトにストレージをデプロイする場合は、セントラルサイトにもブロックストレージをデプロイする必要があります。 エッジサイトにブロックストレージをデプロイしない場合 GlanceのバックエンドにはSwiftを利用します エッジサイトのCompute Nodeはキャッシュイメージのみを持ちます エッジサイトではCinderのようなボリュームサービスは不可です エッジサイトにブロックストレージをデプロイする場合 GlanceのバックエンドはCeph RBDです イメージはエッジサイトにも保存されます Cinderボリュームサービスは、Ceph RBD driverを介してすべてのサイトで利用可能です HCI Nodeには以下のCeph関連のロールも設定されます。 Block Storage (cinder) volume service Ceph Mon Ceph Mgr Ceph OSD GlanceApiEdge RHOSP 16.1 DCN with Ceph RHOSP 16.1とRed Hat Ceph Storage 4を利用した場合のDCN全体のアーキテクチャーは以下になります。 RHOSP 16.1 DCN 考慮点 DCN利用の際にはいくつかの制限事項があります。 セントラルサイトとエッジサイト間のネットワークのRTTが100ms以下であること セントラルサイトとエッジサイトの接続が切れた場合は、エッジサイトでOpenStackの操作は行えません overcloudのイメージはセントラルサイトにあるundercloudからダウンロードされます インスタンスイメージは、ブロックストレージがエッジサイトにない場合、glanceイメージは最初の使用時にWANを経由して、インスタンスが起動するノードのローカルにコピーまたはキャッシュされます。glanceイメージにサイズ制限はありませんが、転送時間がネットワーク帯域幅や遅延に依存します。 ネットワーク構成については特に考慮が必要なため、詳細は公開ドキュメントを参考にしてください。 公開ドキュメント access.redhat.com ストレージやネットワークん関して、まだ制約も多いですが、DCNの機能はRHOSP 16.1のマイナーバージョンで更に機能向上が図られておりますので、機会があればまた記事にしてゆきたいと思います。
みなさんこんにちは。レッドハットの杉村です。Ansible のテクニカルサポートをしています。 Ansible から Windows Active Directory を操作してみるというものを紹介したことがありました。 rheb.hatenablog.com その環境を使いまして、今回は Ansible Tower の認証をこの Active Directory を使って行う方法について紹介してみようと思います。Windows 2019 で Active Directory はあらかじめ構築されているものとして進めます。 Ansible Tower 3.7.2 (RHEL 8.2) Windows 2019 (192.168.0.158) 設定のためのドキュメントはこちらです。 docs.ansible.com Active Directory への接続を確認 まず Active Directory 上に接続のためのユーザを1つ作ります。このユーザを通して Tower は検索を行います。 Domain Users として、binduser ユーザを作成しました。 「属性エディター」のタブで、distinguishedName を調べておきます。 次に、Ansible Tower からこの Active Directory に LDAP 接続してみます。接続を確認するためには、ldapsearch コマンドを使うのが便利です。標準ではインストールされていませんので、openldap-clients パッケージをインストールしてください。 $ sudo dnf install openldap-clients binduser を使って接続できることを確認してみます。 $ ldapsearch -x -H ldap://192.168.0.158 \ -D "CN=binduser,CN=Users,DC=ANSIBLE,DC=JP,DC=REDHAT,DC=COM" \ -b "CN=Users,DC=ANSIBLE,DC=JP,DC=REDHAT,DC=COM" \ -w <binduserのパスワード> ここで覚えておかなければいけないオプションはこのようになっています。 オプション 値 -H LDAPサーバのURL (Active Directory) -D bind DN -b base DN (どのツリーから探すか) -w bind DN に対応するパスワード search result として、0 Success が出力されていれば正しく接続できています。 # search result search: 2 result: 0 Success # numResponses: 28 # numEntries: 27 これで LDAP としての接続が確認できたので、Ansible Tower で設定していきます。 Ansible Tower での設定 admin ユーザでログインして、「設定」→「認証」→「LDAP」の画面で設定します。これまでに調べた値を利用して、次のようにフォームに入力してください。 LDAPサーバーURI: ldap://192.168.0.158 LDAPバインドDN: CN=binduser,CN=Users,DC=ANSIBLE,DC=JP,DC=REDHAT,DC=COM LDAPバインドパスワード: <binduserのパスワード> LDAPユーザーDNテンプレート: (空欄) LDAPグループタイプ: PosixGroupType LDAP要求グループ: (空欄) LDAP拒否グループ: (空欄) LDAP START TLS: off LDAPユーザー検索: [ "CN=Users,DC=ANSIBLE,DC=JP,DC=REDHAT,DC=COM", "SCOPE_SUBTREE", "(sAMAccountName=%(user)s)" ] LDAPグループ検索: [ "CN=Users,DC=ANSIBLE,DC=JP,DC=REDHAT,DC=COM", "SCOPE_SUBTREE", "(objectClass=group)" ] LDAPユーザー属性マップ: { "first_name": "givenName", "last_name": "sn", "email": "mail" } LDAPグループタイプパラメーター: { "name_attr": "cn" } 他の欄はデフォルト設定のままで、「保存」を押して設定を保存してください。 Active Directory でユーザを作成 アカウント名を user46 としてユーザを一つ作りました。「姓」「名」「電子メール」の欄は Ansible Tower の設定に反映されるので、適切に入力してください。 作成したユーザで Ansible Tower からログイン ユーザ名とパスワードでログインできることを確認してください。Active Directory 側で設定した項目がうまくマッピングされています。 ログインはできましたが、いまのところ何も権限が付与されていません。適宜 admin ユーザなどの管理者権限を持つユーザからそれぞれに対して適切なパーミッションを付与して使う必要があります。 「LDAP組織マップ」や「LDAPチームマップ」の設定で自動的に「組織」や「チーム」にユーザを割り当てることにより、このパーミッションの付与作業を軽減することもできます。今回は触れることができませんでしたが、詳しくはこちらのドキュメントをご確認ください。 docs.ansible.com Ansible Towerの評価ライセンスリクエストはこちらからご利用いただけますのでお試しください。 www.ansible.com Happy Automation!
CodeReady Containers Red Hatの福岡オフィスでソリューションアーキテクトをしている田中司恩です。今回から数回に分けてCodeReady Containersに関する記事を書いていきます。 先日、Red Hat CodeReady Containers(Red Hat CRC)の兄弟ディストリビューションにあたる、 CodeReady Containers for OKD(CRC for OKD) がリリースされました。これにより、同じCRCの名称を持つ2つの製品が存在することになりました。 CRCに関するまとまった情報があまりないため、本記事では現時点でのCRCに関する情報をまとめてご紹介いたします。 目次 About CodeReady Containers CodeReady Containersの種類 Red Hat CodeReady Containers(Red Hat CRC) CodeReady Containers for OKD(CRC for OKD) CRCのバージョン情報(2020.9.26時点) CRCの入手 Red Hat CRC CRC for OKD CRCのインストール方法 (参考)Red Hat CRCのセットアップ動画 CRCのサポート ドキュメント code-ready.github.io Red Hat 製品ドキュメント リンク Red Hat Developer ブログ記事 OpenShift Advent Calendar 2019 記事 次回記事 About CodeReady Containers 公式ドキュメント より引用 Red Hat CodeReady Containers brings a minimal OpenShift 4 cluster to your local computer. This cluster provides a minimal environment for development and testing purposes. CodeReady Containers is mainly targeted at running on developers' desktops. For other use cases, such as headless or multi-developer setups, use the full OpenShift installer. (翻訳)Red Hat CodeReady Containers は、最小限の OpenShift 4 クラスターをローカルコンピュータにもたらします。このクラスタは、開発とテストを目的とした最小限の環境を提供します。CodeReady Containersは主に開発者のデスクトップ上での実行をターゲットにしています。ヘッドレスやマルチ開発者のセットアップなど、その他の使用例については、フル OpenShift インストーラを使用してください。 CodeReady Containersの種類 2020年9月26日現在、2つのCodeReady Containersがあります Red Hat CodeReady Containers(Red Hat CRC) CodeReady Containers for OKD 4(CRC for OKD) Red Hat CodeReady Containers(Red Hat CRC) Red Hatが提供しているCRC。CRC for OKDがリリースされるまではCRCといえばこちらのこと。インターネット上の情報の多くはこちらを指す。 開発、テスト目的のためRed Hat Developerで紹介、提供されている。 Red Hat Developer | CodeReady Containers Overview https://developers.redhat.com/products/codeready-containers/overview developers.redhat.com ノートパソコンのOpenShift。CodeReadyコンテナーを使用すると、ローカルマシンのOpenShiftクラスターを数分で起動して実行できます。 CodeReady Containersは、開発およびテストの目的で、最小限の事前設定されたOpenShift 4.1以降のクラスターをローカルのラップトップまたはデスクトップコンピューターに提供します。CodeReadyコンテナーは、Linux、macOS、およびWindows 10のネイティブハイパーバイザーをサポートするRed Hat Enterprise Linux仮想マシンとして提供されます。 CodeReadyコンテナーは、OpenShift 4クラスターでのローカル開発およびテスト用に設計されています。OpenShift 3クラスターをローカルで実行するには、Red Hat Container Development Kit(CDK)を参照してください 。 CodeReadyコンテナーは、OpenShiftクラスターの構築を開始する最も早い方法です。ローカルコンピューターで実行してセットアップとテストを簡略化し、コンテナーベースのアプリの開発に必要なすべてのツールを使用してクラウド開発環境をローカルでエミュレートするように設計されています。 なお、開発、テスト目的の定義は、 Appendix 1 (Software and Support Subscriptions) という文章で定義されている。 www.redhat.com CodeReady Containers for OKD(CRC for OKD) OpenShift 4の兄弟ディストリビューションであるOKD 4のCRC版。OKDの公式サイトで紹介され、ダウンロード先へのリンクがある。 Code Ready Containers for OKD: local OKD 4 cluster for development www.okd.io CRCのバージョン情報(2020.9.26時点) (Red Hat CRC、CRC for OKD共通) CRC 1.16 OpenShift Container Platform: v4.5.9 Kubernetes:1.18.3 CRCの入手 Red Hat CRC Red Hat Developerのサイトにダウンロードリンクあり Red Hatアカウントの認証 cloud.redhat.comへ遷移後、Red Hat OpenShift Cluster Manager内のCRCのページから各プラットフォーム用のバイナリを入手可能 Pull Secretも同じページから入手可能 Red Hat Developer Programへの登録 参考記事: Red Hat Developer Programに参加して最新技術を学習しよう - 赤帽エンジニアブログ rheb.hatenablog.com なお、CRCの実行自体にサブスクリプションの適用などの作業は不要 CRC for OKD OKDの公式サイトにダウンロードリンクあり(2021/3/15現在、ダウンロード先へアクセス不可になっています) 認証なしで直接各プラットフォーム用のバイナリの入手が可能 Pull Secretはcloud.redhat.comから入手が必要(要Red Hat アカウント) Red Hat Developer Programへの登録により無償で入手可能 www.okd.io CRCのインストール方法 (Red Hat CRC、CRC for OKD共通) インストール概要 CRCアーカイブをダウンロード アーカイブの展開し、 crc バイナリをPATH環境変数の通った場所にコピー セットアップ実行 クラスターの起動 インストールコマンド実行例 $ wget https://mirror.openshift.com/pub/openshift-v4/clients/crc/latest/crc-linux-amd64.tar.xz $ tar xzf crc-linux-amd64.tar.xz $ sudo mv crc-linux-1. 16 .0-amd64/crc /usr/ local /bin $ crc setup $ crc start -p pull-secret.txt (参考)Red Hat CRCのセットアップ動画 初期のv1.0.0の頃の物。基本は現在も同じ。 Local OpenShift development environment on Windows | Red Hat Developer https://developers.redhat.com/openshift/local-openshift-windows youtu.be Local OpenShift development environment on MacOS | Red Hat Developer https://developers.redhat.com/openshift/local-openshift-macos youtu.be CRCのサポート CRCは コミュニティサポート です。 公式ドキュメント より引用 The goal of Red Hat CodeReady Containers is to deliver an OpenShift environment for development and testing purposes. Issues occurring during installation or usage of specific OpenShift applications are outside of the scope of CodeReady Containers. Report such issues to the relevant project. For example, OpenShift tracks issues on GitHub . (翻訳)Red Hat CodeReady Containersの目標は、開発とテストを目的としたOpenShift環境を提供することです。特定の OpenShift アプリケーションのインストールまたは使用中に発生する問題は、CodeReady Containers の範囲外です。そのような問題は、関連するプロジェクトに報告してください。例えば、OpenShift は GitHub で問題を追跡しています。 ブログ記事 より引用 If you encounter any issues using CodeReady Containers, see the Troubleshooting Red Hat CodeReady Containers guide . If this does not resolve your issue, create a bug in Bugzilla with the ‘crc’ component . (翻訳)CodeReadyコンテナーを使用して問題が発生した場合は、Red Hat CodeReadyコンテナーの トラブルシューティングガイド を参照してください。これで問題が解決しない場合は、 「crc」コンポーネントを使用してBugzillaにバグを作成します 。 (参考)bugzillaへのレポート方法 rheb.hatenablog.com ドキュメント code-ready.github.io github.ioでホストされているドキュメント。英語版。 code-ready.github.io Red Hat 製品ドキュメント Red Hat 製品ドキュメントへのリンク。日本語版あり(v1.14まで。2021/3/15、時点) Red Hat 製品ドキュメント access.redhat.com リンク Red Hat Developer ブログ記事 Red Hat OpenShift 4 on your laptop: Introducing Red Hat CodeReady Containers - Red Hat Developer developers.redhat.com How to run Red Hat CodeReady Containers on Windows 10 Enterprise developers.redhat.com OpenShift Operators on your laptop using Red Hat CodeReady Containers and Red Hat Marketplace developers.redhat.com Develop and test a Quarkus client on Red Hat CodeReady Containers with Red Hat Data Grid 8.0 developers.redhat.com OpenShift Advent Calendar 2019 記事 OpenShift Advent Calendar 2019 OpenShift 4 をMacにインストールする - Qiita qiita.com 【OpenShift 4】CodeReady Containers 1.2.0をWindowsで動かそうとしたら大変だった話 - Qiita qiita.com 次回記事 次回は実践的な使い方として、CRCをリモート接続して使う方法をご紹介します。
こんにちは、Red Hat SSA の小杉です。 Red Hat にはクラウドネイティブアプリの開発に役立つ、ミドルウェアラインナップが充実していることをご存知ですか? ここでは、Red Hat のミドルウェアに関する注目ニュースを、各製品技術に特化したソリューションアーキテクトが、ご紹介します。 今回は 10 月号となります。 想定読者 エンタープライズアーキテクト アプリケーション開発者 システムの提案をするSIerの方 特集1 : 【DX推進】待ったなし "New Normal時代の DXプラットフォーマー” 〜 実現の近道は行動力とIT活用力 〜セミナーで伝えきれなかったお話 medium.com 特集2 : 【最新事例】最適化問題を解決する OptaPlanner のコミュニティイベントの振り返り Business Optimizerは、 Red Hat Decision Manager に含まれるAI制約ソルバーです。 限られたリソース内で、様々な制約を満たしつつ、最良の結果を得たいというようなケースにおいて、どの組合せが最適かを現実的な時間で探索することができます。 9月1日〜3日の間、OptaPlanner Week と題して、Business Optimizer のアップストリーム版である、 OptaPlanner のコミュニティイベントが開催されました。 各セッションについては、オンデマンドで視聴可能となっております。 今回の特集では、イベントの各セッションについての概要紹介と、ユースケースについての最新事例をご紹介します。 イベントスケジュールと各セッション概要 speakerdeck.com Day 1 www.youtube.com Day 2 www.youtube.com Day 3 www.youtube.com ユースケースについての最新事例 Satish Kale 氏のセッション、 Business use cases and the impact of Optaplanner から、内容を要約してご紹介します。 speakerdeck.com 直近GAになった製品群 最近リリースとなったMiddleware製品群のリストをご紹介します。 見逃している製品が無いか、是非一度ご確認ください。 Red Hat Data Grid 8.1 Red Hat AMQ Clients 2.8(Red Hat AMQ 2020.Q3) 好評開催中!クラウドネイティブアプリ開発関連のWebinar全6回 Cloud Nativeを見据えたアプリケーションアーキテクチャとレガシーモダナイゼーション コンテナ時代の開発ツールチェインと開発プロセスのベストプラクティス クラウド/コンテナを前提とした時代のアプリケーション実行環境の選択 マイクロサービス/サーバーレス実践入門 これからのシステム連携を実現するデジタル基盤とアプローチ Cloud Nativeなデータパイプラインの作り方とオープンハイブリッドクラウドへの展開 各回とも、オンデマンドで視聴出来ます。(お名前とメールアドレス等の登録のみで視聴可能です) 下記リンクよりぜひご登録ください。 www.redhat.com
OpenStackを担当しているソリューションアーキテクトの輿水です。 Red Hat OpenStack Platform 13から16.1へのアップグレード手順の中で、アップグレード前に既存環境のバックアップを取得することをお願いしているので、今回はバックアップ方法に触れたいと思います。バックアップ手順に関して、ロングライフリリースであるRHOSP 13と16では、Director(undercloud)のバックアップ・リストアに関するドキュメントに加えて、underclodおよびovercloudのControl Planeのバックアップ・リストアに関するドキュメントが公開されています。 Red Hat OpenStack Platform 13のバックアップとリストア バックアップ対象となるのはOpenStack Director( undercloud )及びOpenStack Control Plane( Controller Node )です。Compute Nodeは含まれません。バックアップツールとしてBashで書かれたオープンソースの災害復旧ソリューション Relax and Recover(ReaR)を使用します。ReaRではISO/USB/eSATA/PXEといった様々なブートメディア用フォーマットがサポートされていますが、本手順ではISOブートフォーマットを使用し、ブートイメージの転送にはNFSを使用します。 バックアップの流れ バックアップ(NFS)サーバの準備 NFSサーバーのインストールとNFSサービスに必要なポートをファイアーウォールで開放する バックアップサーバに任意のバックアップディレクトリを作成 バックアップディレクトリをundercloudおよび各Controller Nodeに対してexport undercloudと各Controller Nodeでの事前準備 Relax and Recover (ReaR) パッケージおよびISOイメージを生成するためのパッケージをインストール バックアップディレクトリを作成 バックアップサーバのバックアップディレクトリをmount ReaR設定ファイルを作成 undercloudのバックアップ 各Controller Nodeのバックアップ undercloudのバックアップ undercloudでReaRコマンドを実行します。この操作によってバックアップサーバのバックアップディレクトリにundercloudのISOイメージが作成されます。この間、OpenStackサービスに影響は発生しません。 Controller Nodeのバックアップ Control Planeのバックアップを実施するためにはPacemekrおよび各Controller Nodeで稼働しているすべてのコンテナを停止する必要があります。この間にデータベースのバックアップも実施します。Pacemakerとコンテナを停止している間は、Computeに対するControl Planeサービスが停止するため、インスタンスの作成やイ移行などのOpenStackの操作を行うことはできません。 はじめにController Nodeのいずれかでmysqlコマンドでデータベースのバックアップを作成します。次にPacemaker停止のコマンドを実行します。Pacemakerが停止したことを確認した後に、各Controller Nodeでコンテナを停止します。コンテナ停止後、ReaRコマンドを実行します。これにより各Controller NodeのISOイメージがバックアップサーバに作成されます。 ISOイメージが生成されたら、Controller NodeのいずれかでPacemekr起動を行い、各Controller Nodeでコンテナを起動します。Pacemakerとコンテナが起動すれば、OpenStackの操作が可能になります。 リストア手順 ブート可能なISOイメージを読み込み、リストアが必要なノードをブートします。Relax-and-Recover ブートメニューが表示されるので、対象となるノード名を確認してリストアを行ってください。リストア後はノードの電源をオフにして、通常のブートデバイスで起動することを確認してください。 ▽Red Hat OpenStack Platform 13 バックアップとリストアの公開ドキュメント access.redhat.com Red Hat OpenStack Platform 16のバックアップとリストア RHOSP 16の場合でも、 ReaRを使ってバックアップする処理は同様ですが、RHOSP 13では各サーバで手動でコマンドを実行していた処理を、RHOSP 16ではAnsibleを利用して実行するようになっています。backup-and-restoreのRoleは既に準備されており、環境固有の値を示すyamlファイルを作成しそれを指定することで一連の処理を行うことができます。Ansible Playbookの実行はundercloudで行います。RHOSP 13の手順では各サーバにログインし、手動でmysqlコマンドやpcsコマンドを実行していましたがRHOSP 16ではそのようなコマンドを意識する必要はありません。 (例)undercloudのバックアップ取得 (undercloud) [stack@undercloud ~]$ cat <<'EOF' > ~/bar_rear_create_restore_images-undercloud.yaml # Playbook # Using ReaR on the undercloud node. - become: true hosts: undercloud name: Create the recovery images for the undercloud roles: - role: backup-and-restore EOF . (undercloud) [stack@undercloud ~]$ ansible-playbook \ -v -i ~/tripleo-inventory.yaml \ --extra="ansible_ssh_common_args=-o StrictHostKeyChecking=no" \ --become \ --become-user root \ --tags bar_create_recover_image \ ~/bar_rear_create_restore_images-undercloud.yaml バックアップのコマンドは煩雑かつクリティカルなものも多いので、自動化されていると便利です。準備されてるplaybookの内容はGitで見ることができるので興味があれば参照してください。 github.com ▽Red Hat OpenStack Platform 16.1 バックアップとリストアの公開ドキュメント access.redhat.com 以上、Red Hat OpenStack Platformのバックアップについてでした。今後はOpenStack環境の維持・運用について記事を出してゆきたいと思ってます。
OpenStackを担当しているソリューションアーキテクトの輿水です。 前回Red Hat OpenStack Platform 16.1のリリースについて記載しましたが、ロングライフリリースRHOSP 13からRHOSP 16へのアップグレードについて説明いたします。この説明は「RHOSP 13からRHOSP 16.1」のみが対象であり、他のバージョンの移行について検討されている場合は弊社までご連絡ください。また、OpenStack Data Processing サービス (sahara)はRHOSP 16からはサポートされなくなったため、RHOSP 13でSaharaを使用している場合はアップグレードを実施せず、弊社までお問い合わせください。 ロングライフリリースのアップグレードパスは2種類あります。 in-place アップグレード 既存環境でサービスのアップグレードを実施します。Red Hat Customer Portalで日本語ドキュメントが公開されておりますので、詳細なコマンドなどの手順はそちらを参照してください。in-placeアップグレードで考慮する点は以下です。 既存環境のアップグレードなので追加のハードウェアは不要 既存ワークロードがRHOSP 13と16.1で動作することを検証しておく必要がある 移行前に既存のRHOSP 13を最新にしておく必要がある(アップグレード前にRHOSP 13のマイナーアップデートが必要になる場合がある) アップグレード中、OpenStackサービスのダウンタイムが発生する 大規模環境ではアップグレードが完了するまでの時間が長時間になる 手順の中でロールバックが難しい点がある Parallel Cloud Migration 新しいRHOSP 16.1環境を作成し、ワークロードを既存環境から新しい環境に移行する方法です。Parallel Cloud Migrationの基本的な考え方としては、既存環境と同スケールの環境を作るのではなく、既存環境よりは規模の小さい「control planeと数台のCompute Node」で構成される新環境を作成し、徐々にワークロードを新規環境に移行します。それに伴い移行元環境で使用しなくなったリソース(Compute Node)を新環境に移設し、そこに更にワークロードを移行します。この方法は、移行計画をお客様と十分に検討する事が必須のため、弊社までご相談ください。 追加のハードウェアが必要 移行前に既存のRHOSP 13を最新にする必要はない ロールバックや再試行、検証が容易 移行作業は、既存環境の構成をコピーするなどの工夫が必要で、自動化できるものもあるが、移行作業にはかなりの労力が必要になる ワークロードの移行はコールドマイグレーション前提のため、ワークロードのダウンタイムが発生する in-place アップグレード手順 この記事では大まかなステップのみを記載しています。詳細な手順やコマンド、設定内容については公開ドキュメントを参照してください。 access.redhat.com 環境構成例 Controllerが3台ありPacemakerで冗長化されている標準的な構成です。Ceph StorageやHCI構成は含んでいません。 Leapp RHOSP 13から16.1へのアップグレードではRHEL 7から 8.2へのアップグレードを伴うため、ユーティリティーLeappを使用します。Leappを使用するためのOpenStack側の必要条件と制限は以下になります。 RHEL 7と RHEL 8(8.2)のサブスクリプションが必要 カーネルベースのNIC名が使用されているかどうかを確認 SSHのrootログイン権限パラメーターPermitRootLoginの設定 Open vSwitchバージョンの置き換え:openvswitch2.11を削除しopenvswitch2.13をインストールする アップグレード前の事前準備 既存のundercloudとovercloudのcontrol planeをバックアップする access.redhat.com RHOSP 13のマイナーバージョンを最新にする access.redhat.com アップグレード前に既存のRHOSP13を検証する validation用のスクリプトが準備されているので、それを検証を行ってください。 undercloudのアップグレード Red Hat OpenStack Platform directorパッケージの削除 RHEL 7に関連付けられたRed Hat OpenStack Platform 13パッケージを削除します。 undercloudのOSのアップグレード undercloudにLeappユーティリティをインストールします。Open vSwitchのバージョンを置き換えた後に、LeappコマンドでOSをアップグレードします。この過程でundercloudノードの再起動が必要になりますがovercloudのサービスには影響しません。 directorのアップグレード undercloudにdirectorのインストールと設定を行うためのコマンドラインツールをインストールします。 Ceph Storageを使用する場合はCeph-ansible パッケージが必要です。Ceph Storageを使用しない場合はCeph-ansible パッケージをインストールしないでください。undercloudで利用するコンテナーイメージの準備、directorのパラメータ設定を行った上で、openstack undercloud upgradeを実行します。このスクリプトにより、undercloudのサービスもすべて自動的に起動されます。 overcloudのアップグレード overcloudのアップグレードのプロセスにおいてovercloudサービスにダウンタイムが発生します。 アップグレード中、影響を受ける項目 OpenStack platformサービス アップグレード中、影響を受けない項目 インスタンス Ceph Storage OSD(インスタンス向けのバックエンド) Linuxネットワーク Open vSwitchネットワーク undercloud アップグレードのテストのためのCompute Nodeの選択 overcloudのアップグレードプロセスでは「同じロールのノードをすべてアップグレードする」または「個別ノードを別々にアップグレードする」のいずれかを行うことができます。全Compute Nodeをアップグレードする前に、個々のCompute Nodeのいくつかでアップグレードのテストをすることで、ワークロードのダウンタイムを最小限に抑えることが可能と考えています。テストには2〜3台の、クリティカルなインスンスが実行されていないCompute Nodeを選択します。 overcloudのアップグレードのための準備 undercloud上でovercloudのアップデートのための準備をします overcloudのためのLeapp設定 undecloudからovercloudに必要なデータをコピーする設定 RHOSP 16.1用の環境ファイルを作成 overcloudのController Nodeアップグレード実施(この間、サービス影響あり) 以下の操作はdirectorにログインして実施します。 3台のController Nodeの中でどれがboot strap controllerなのかを確認し、最初にboot strap controllerノードをアップグレードします。この例ではovercloud-controller-0がboot strap controllerです。openstack overcloud upgrade runコマンドにsystem_upgradeタグを付けてovercloud-controller-0を指定して実行します。これによりLeappによるOSのアップグレードが行われ、再起動が行われます。アップグレードを実施している間、control planeの機能が停止するため、overcloudの操作を行うことはできません(=ダウンタイム)。 openstack overcloud upgrade run --tags system_upgrade --limit overcloud-controller-0 次に外部アップグレードコマンドopenstack overcloud external-upgrade runをsystem_upgrade_transfer_dataタグを付けて実行します。これにより、最新バージョンのデータベースが既存のノードからboot strap controllerにコピーされます。 openstack overcloud external-upgrade run --tags system_upgrade_transfer_data 次にopenstack overcloud upgrade runをsystem_upgradeタグ無しで実行します。このコマンドによりRHOSPのアップグレードが実施されます。 openstack overcloud upgrade run --limit overcloud-controller-0 boot strap controllerノードのアップグレードが完了すると、control planeの機能が回復し、overcloudの操作が可能になります。 2台目のcontroller Nodeをアップグレードします。この例ではovercloud-controller-1です。openstack overcloud upgrade runコマンドをsystem_upgradeタグを付けてovercloud-controller-1を指定して実行します。これによりLeappによるOSのアップグレードが行われ、再起動が行われます。 openstack overcloud upgrade run --tags system_upgrade --limit overcloud-controller-1 次ににopenstack overcloud upgrade runをsystem_upgradeタグ無しで実行します。このコマンド実行時には前のステップでアップグレードしたovercloud-controller-0をオプションに含めてください。このコマンドによりRHOSPのアップグレードが実施されます。 openstack overcloud upgrade run --limit overcloud-controller-0,overcloud-controller-1 3台目のcontrollerノードをアップグレードします。この例ではovercloud-controller-2です。openstack overcloud upgrade runコマンドをsystem_upgradeタグを付けてovercloud-controller-2を指定して実行します。これによりLeappによるOSのアップグレードが行われ、再起動が行われます。 openstack overcloud upgrade run --tags system_upgrade --limit overcloud-controller-1 次ににopenstack overcloud upgrade runをsystem_upgradeタグ無しで実行します。このコマンド実行時には前のステップでアップグレードしたovercloud-controller-0およびovercloud-controller-1をオプションに含めてください。このコマンドによりRHOSPのアップグレードが実施されます。 openstack overcloud upgrade run --limit overcloud-controller-0,overcloud-controller-1,overcloud-controller-2 overcloudのComute Nodeアップグレード実施 アップグレード対象となるCompute Nodeでワークロードが稼働している場合は、他のノードにマイグレーションしておきます。 openstack overcloud upgrade runコマンドをsystem_upgradeタグを付けて、overcloud-compute-0を指定して実行します。これによりLeappによるOSのアップグレードが行われ、再起動が行われます。 openstack overcloud upgrade run --tags system_upgrade --limit overcloud-compute-0 次にopenstack overcloud upgrade runをsystem_upgradeタグ無しで実行します。このコマンドによりRHOSPのアップグレードが実施されます。この操作を対象のCompute Nodeに対して順次実施してください。 openstack overcloud upgrade run --limit overcloud-compute-0 複数のCompute Nodeをまとめてアップグレードする場合は、ノードをコンマ区切りリストで指定してタスクを実行することも可能です。 openstack overcloud upgrade run --tags system_upgrade --limit overcloud-compute-0,overcloud-compute-1,overcloud-compute-2 openstack overcloud upgrade run --limit overcloud-compute-0,overcloud-compute-1,overcloud-compute-2 アップグレード後の最終処理 overcloud imageのアップグレード undercloudに保存されているovercloudイメージ(overcloud-full)を最新のものに置き換え、overcloud環境にインポートします。 Open Virtual Network (OVN) への移行 overcloud上の OpenStack Networking (neutron) サービスを ML2/OVS ドライバーから ML2/OVN ドライバーに移行します。 access.redhat.com 以上、とても駆け足でしたが、RHOSP 13からRHOSP 16.1へのアップグレード手順の紹介でした。実際にアップグレードを行う際には、Cephの利用の有無や、センシティブなインスタンスの有無など事前の確認が必要で、検証環境等でのテストが必要になりますので、まずは弊社までご連絡ください。
OpenStackを担当しているソリューションアーキテクトの輿水です。 Red Hat OpenStack Platform ライフサイクル コミュニティ版TrainをベースとしたRed Hat OpenStack Platform 16(以降RHOSPとします)のマイナーアップデートバージョンである16.1がが7月29日にリリースされました。RHOSP 16はロングライフリリースですが、フルサポート対象である16.0のサポート期限は2020年10月27日までとなっており、長期サポートを受けるためには16.1にする必要があります。また、延長ライフサイクルサポート(ELS)は16.1の次のマイナーバージョンが対象予定となっており、これを利用した場合のサポート期限は2025年5月30日です。RHOSP 16全体としては5年間のサポートになっています。 RHOSPはRed Hat Enterprise Linux(以降RHELとします)のひとつのメジャーリリースバージョンのみをサポートします。RHOSPのバージョンとRHELのバージョンは密接に結びついており、各RHOSPに対応するRHELは以下のとおりです。 現在お使いいただいているOpenStack環境について、サポート期限とシステムのライフサイクルを鑑みて、必要があればアップグレードのご検討をお願いいたします。 ロングライフバージョンからロングライフバージョンへのアップグレード RHOSP 10から RHOSP 13へのアップグレードフレームワークはFast Forward Upgradeと呼ばれ、既に提供されております。RHOSP 13と16間のアップグレードはRHOSP 13からRHOSP 16.1がサポート対象となり、そのアップグレードフレームワークがRHOSP 16.1で提供されました。RHOSP 13からRHOSP 16.1へのアップグレードにはRHEL 7から RHEL 8へのアップグレードが含まれます。なお、RHOSP 13からRHOSP 16.0へのアップグレードはサポート対象外ですのでご注意ください。 Red Hat OpenStack Platformのライフサイクルに関する公開ドキュメントは以下になります。 access.redhat.com RHOSP 16.1機能ハイライト Edge/DCN機能強化 「Red Hat Summit 2020セッション Red Hat OpenStack Platform 16 紹介 (2)」でDistributed Compute Nodes(DCN)について触れましたが、16.1では16.0でテクノロジープレビューであった機能がGAになり機能改善・強化がなされています。例えば、以前はエッジサイトで利用できるストレージはローカルのephemeralのみでしたが、16.1ではpersistentストレージが必要なワークロードの稼働が可能になりました。 よりスケーラブルに マルチスタックデプロイとマルチCellのサポートにより管理性が向上しました。マルチスタックのデプロイが可能になったことで、ひとつひとつのクラウドを個別に管理するのではなく単一のDirectorで管理することが可能になり、管理にかかるコストを削減できます。また、障害ドメインを分割することで安定性を向上させます。 効率の向上 例えばCPUが固定されたインスタンスやSR-IOV利用のインスタンスなどセンシティブなワークロードのマイグレーションを容易にすることで、ワークロードへの影響を減らしメンテナンスを容易にする仕組みを取り入れています。 RHOSPの今後 RHOSP 16以前は、RHOSPは半年ごとにリリースされていましたが、16からはリリースサイクルが変更になっており基本的にロングライフリリースのみになります。機能改善などはマイナーアップデートで提供される予定です。コンピュートやネットワーク、ストレージに関連する機能について、実装やサポート状況についてより詳しく知りたい場合は、お気軽にお問い合わせください。
Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 Quarkus 1.7 released - Elasticsearch and Redis clients, Reactive routes and Funqy improvements の翻訳記事です。 いつものように、この新しいQuarkusバージョンには、いくつかのエキサイティングな新機能が搭載されています。しかし、今月は問題の修正と改善に重点を置き、ドキュメントも含めてあらゆるところを改善しました。 Quarkus 1.7、300 以上のプルリクエストがマージされています。 最も顕著な新機能は以下の通りです。 低レベルおよび高レベルの Elasticsearch REST クライアントのための新しい拡張機能 Vert.x Redis クライアント用の拡張機能 Hibernate Envers の拡張機能 JDBC Db2 ドライバのサポート Reactive Routes 機能のたくさんの改善点 Funqy サーバーレスフレームワークには興味深い新機能が追加 また、最近、 ガイドのインデックスページ を新しいデザインと検索エンジンで作り直しました。 移行ガイド 既存のアプリケーションの移行をお考えですか? 1.7 への移行ガイド はこちらです。 一つ重要なのは、GraalVM 19.3 をサポートしなくなったことです。Java 11フレーバーの GraalVM 20.1 は、推奨される GraalVM のバージョンです。 何が新しいの? Elasticsearch REST クライアント Quarkus は低レベルの Elasticsearch REST クライアントをしばらくの間サポートしていましたが、公開されていませんでした。これは Hibernate Search + Elasticsearch 拡張機能で内部的に使われていました。 1.7 では、低レベルの Elasticsearch REST クライアントと高レベルの Elasticsearch REST クライアントの両方が、Quarkus の適切な設定で拡張機能を介して公開されています。このようにして、Elasticsearch クラスタに直接接続できます。 これらのクライアントの使用方法についての詳細は、 新しいElasticsearchガイド に記載されています。 Vert.x Redis クライアント Quarkus 1.7 では、Redis データストアに接続するための新しい拡張機能が導入されています。Eclipse Vert.x Redisクライアントをベースにしています。 これについて知っておくべきことはすべて Redisのガイド にあります。 Hibernate Envers Hibernate Envers はバージョン管理/監査機能を持った Hibernate ORM モジュールです。 JVM モードでは Quarkus で動作していましたが、ネイティブモードでは動作しませんでした。新しい Hibernate Envers 拡張機能で修正されました。 Hibernate ORM ガイドの Hibernate Envers の項 に詳しい情報が掲載されています。 Funqy の改善 Funqy は私たちのサーバーレスフレームワークです。 1.7 で Funqy に 2 つの新機能が追加されました。 Funqy HTTP バインディングにクエリパラメータを注入する機能 Google Cloud Platform への対応 Reactive Routes の改善 ほとんどの Quarkus アプリケーションは RESTEasy と JAX-RS を使用して開発されていますが、 Reactive Routes と呼ばれる別のアプローチを使用して、ルートを宣言してチェーン化もできます。 Reactive Routes は 1.7 でいくつかの改善点がありました。 ルート処理メソッドにリクエストからの要素を注入するために、 @Param 、 @Header 、 @Body アノテーションが追加された Mutiny タイプが完全にサポートされた ルート処理メソッドが void を返さない場合は、 RoutingExchange をパラメータとして渡さないようにすることで、物事を単純化できる Db2 JDBC ドライバ 1.6 では、リアクティブな Db2 ドライバのサポートが含まれています。1.7 は Db2 JDBC ドライバに新しい拡張機能をもたらします。 セキュリティテスト基盤 テストの際には、セキュリティを完全に無効にしたり、特定の ID を使用すると便利かもしれません。 Quarkus 1.7 では、 セキュリティテストガイド で説明されているように、すべてのことを可能にする @TestSecurity アノテーションが導入されています。 セキュリティ文書の全体を通して、それをより身近なものにするために大規模な再編成を受けました。 拡張レジストリ この機能は将来への道を開きます。複数の拡張機能レジストリをサポートするようになりました。これは、独自の拡張機能レジストリをホストして、Quarkus ツールに統合できるということです。 この面ではまだ進展が見られませんが、すぐに実際のユースケースが見られることを期待しています。 S2I イメージ デフォルトの S2I イメージは、UBI ベースの Java 11 イメージになりました : registry.access.redhat.com/ubi8/openjdk-11 . 完全な変更ログ 1.7.0.CR1 と 1.7.0.Final の完全な変更ログはGitHubで入手できます。 ADOPTERS.md Quarkusの使用に関する情報を共有するために、リポジトリのルートに ADOPTERS.mdファイル を追加しました。 Quarkusを使用していて、私たちのブログでインタビューを受けたい場合、または単にこのファイルに追加したい場合は、私たちにご連絡ください。 貢献者 Quarkusには現在 341人の貢献者 がいます。皆様、本当にありがとうございました。 特に1.7リリースについてはみなさんのおかげです。 In particular for the 1.7 release, thanks to Aaron Coburn, Abel Salgado Romero, Adrian, Alex Soto, Alexander Schwartz, Alexey Loubyansky, Andrea Boriero, Andrea Cosentino, Andreas Eberle, Andrej Petras, Andrew Guibert, Andy Damevin, Arne Mejlholm, Aurea Munoz, Bill Burke, Boosey, Bret McGuire, Carlos Eduardo Panarello, Charlie Powicki, Clement Escoffier, Daniel Newport, Daniel Zwicker, David Horvat, Davide D’Alto, Dirk Van Haerenborgh, Dmitriy Chaban, Dominika Vagnerova, ekans, Emanuel Alves, Emmanuel Bernard, Erin Schnabel, Falko Modler, Foivos Zakkak, Francesco Bellentani, Galder Zamarreño, Garima Monga, Geoffrey De Smet, George Gastaldi, Georgios Andrianakis, Guillaume Le Floch, Guillaume Smet, Gunnar Morling, Gwenneg Lepage, Gytis Trikleris, Harald Reinmueller, Heiko W. Rupp, Helber Belmiro, Hugh Lunnon, Ioannis Canellos, Ivan Greene, J Lannoy, Jaikiran Pai, Jan Martiška, Jason T. Greene, Jens Reimann, Joe White, Katia Aresti, kdnakt, Ken Finnigan, Ladislav Thon, Loïc Hermann, Loïc Mathieu, Machareder, Manyanda Chitimbo, Marcelo Rubim, Mario Fusco, Martin Kouba, Matthias Harter, Max Rydahl Andersen, Michael Simons, Michał Szynkiewicz, Miguel Serra, Moritz Becker, Nebrass Lamouchi, Paul Carter-Brown, Paul Robinson, Paulo Casaes, Pedro Igor, Peter Palaga, Phillip Krüger, Rafael T. C. Soares, Robbie Gemmell, Roberto Cortez, Rohan Maity, Romain Quinio, Rostislav Svoboda, Sanne Grinovero, Sebastian Daschner, Sergey Beryozkin, Stuart Douglas, Stéphane Épardaud, Thomas Segismont, tibordigana, Timothy Power, TNM Technologies, Vincent Sevel, Yoann Rodière, Zed Spencer-Milnes, Zhiyuan Zheng and Ивашин Алексей Витальевич. 参加しよう 私たちはあなたのフィードバックをとても大切にしていますので、バグを報告し、改善を依頼してください...一緒に何か素晴らしいものを作りましょう! Quarkusのユーザーや好奇心の強い人は、恥ずかしがらずに歓迎コミュニティに参加してください。 GitHub にフィードバックを提供する; コードを作成して PRを行う ; Zulip や メーリングリスト で議論する; なにか質問があれば Stack Overflow で投稿してください。
Red Hatでクラウドインフラ全般を担当しているソリューションアーキテクトの伊藤拓矢です。 ※この記事は記事公開時点での一般公開可能な情報を提供しております。   ■この記事の情報 現在利用可能なRHOSP各バージョンの状態 最新であるRHOSP16.1の機能 OpenShiftとの連携   ■現在利用可能なRHOSP各バージョンの状態 [1]で示されているURLの内容を開くと”ライフサイクルの日付”という項目があり、こちらを参照しますと執筆時20年9月23日現在はRHOSP16、RHOSP13、RHOSP10の3つのバージョンがサポート可能な期間に入っています。 RHOSP15に関しては1年間のサポート期間となっていましたので9月19日にサポートが終了致します。 またRHOSP10に関してはすでに拡張ライフサイクルサポート期間に入っています。 そのため現在からRHOSPを利用するとすると、RHEL7系をホストOSとしているRHOSP13か、RHEL8系をホストOSとしているRHOSP16のどらかをご利用頂くこととなります。 今回のRHOSPからサポート期間が短いショートタームバージョンのリリースが行われないようになりました。 これは10年間開発され続けてきたOpenStackが安定しプラットフォームとして安定的に利用頂くことが可能になっていること、 Upstreamでは半年間のサポート期間しか設けられなかったものにたいして、従来の1年間のサポートとしてもあまり利用が進まないことが挙げられます。 今後は長期サポートが提供されるRed Hat OpenStackのみがリリースされていきます。OpenStack Foundationが開発を続けるOpenStackは従来通りのリリースサイクルとなっています。 最新の機能の提供と安定化したRed Hat OpenStackを実現するべく、長期サポート期間においてコードベースを変更せず最新でリリースされる機能を選択しバックポートを行ったコードが提供されます。 現在最新のRHOSP16.1ではコードベースをTrainとしてUssuriで強化された機能をバックポートして提供しています。   [1]. https://access.redhat.com/ja/node/2606981     さて[1]のURLをご確認いただくとRHOSP16に関しては、RHOSP 16.0、RHOSP 16.1、RHOSP 16.2といったRHOSP X.YとしてYの値が0~2まで設定されていることが分かります。 これはRHOSP16リリースからRHOSP16のマイナーバージョンとホストOSであるRHEL8のマイナーバージョンを固定し、それぞれのサポート期間において安定してご利用頂くことを目的としています。 そのためRHOSP16のトータルサポート期間において、いくつかリリースされるRHEL8のマイナーリリースのいずれかが選択され固定化されます。 RHOSP16.0はRHEL8.1をホストOSとして利用しており、RHEL8.1のサポート期間に準じてRHOSP16.0のサポート期間が設定され、2020年10月27日にサポート期間が終了致します。 RHOSP16.1ではRHEL8.2をホストOSとして利用しているため、2024年4月30日までがサポート期間となります。 図示されていませんが文中にあるRHOSP16.2ではRHEL8.4がホストOSとして利用される予定のためRHEL8.4のライフサイクルに準じたサポート期間となる予定です。       RHEL8のライフサイクル計画は[2]のURLから知ることができます。   [2].  https://access.redhat.com/ja/support/policy/updates/errata#RHEL8_Life_Cycle   ■現在最新のRHOSP16.1の機能 さてRHOSP16.1ではどういった機能が追加/強化されているのでしょうか。 一般的なIaaSとしての機能強化、テレコムのNFVi環境向けもしくはエッジコンピューティングのための機能の強化の3通りに大きく分けて分類されています。   一般的なIaaSとしての機能強化について、いくつか新機能を紹介をしたいと思います。   ・LBaaSを提供しているOctaviaにおいて、Amphoraインスタンスの冗長化をサポート RHOSP16.1では、Octaviaを利用するに当たって使用するインスタンスのactive/standbyトポロジーを実装しました。 また、従来AmphoraインスタンスではUDPトラフィックをロードバランス対象とすることができませんでしたが、これが可能になりました。   ・NFSサービスを提供しているManilaにおいて、ネイティブCephFSドライバをサポート RHOSP16.1では、ネイティブCephFSドライバをサポートしています。   ・NVDIMMを利用したインスタンスの生成 永続化できるメモリであるNVDIMMがホストハードウェアに搭載されている場合、これを利用したインスタンスを生成、管理することができます。 この機能はTP(Technology Preview)としてリリースされており、テスト利用することを想定しておりサポートは提供されません。   ・AMDが提供するSEV機能を利用したインスタンスの生成 SEV機能を用いてメモリ暗号化を使用するインスタンスを生成することができるようになりました。 従来メモリは揮発性があると言われており電源を切ればデータは飛ぶのでセキュリティの高さとしてはディスクに書き込む場合に比べて 比較的高いとされてきました。しかしながらNVDIMMを用いた場合は電源を切ってもデータが飛ぶことがないため物理アクセスを想定したメモリセキュリティに配慮が行われています。 この機能はTP(Technology Preview)としてリリースされており、テスト利用することを想定しておりサポートは提供されません。   ・大規模クラスタを構築するためのミニオンの提供 RHOSP16.1ではテスト環境において700HVホストを一つのクラスタに組み込むことに成功しています。 物理ホストのオペレーションを可能な限り減らしてゼロタッチプロビジョニングを実現するべく、 RHOSPではDirectorと呼ばれるホストがハードウェア情報を収集したりしてデプロイを行っていました。 このDirectorはクラウドに対して1台のホストが担っており大規模HV環境においてはボトルネックとなるケースがありました。 今回からTPとして提供されるようになったミニオンはDirectorの一部機能を担いスケーラビリティの確保に貢献することができます。 この機能はTP(Technology Preview)としてリリースされており、テスト利用することを想定しておりサポートは提供されません。   ■OpenShiftとの連携 リファレンスアーキテクチャの公開 [3] のURLではOpenShift4.4とRHOSP13もしくはRHOSP16を用いたリファレンスアーキテクチャを公開しています。 AWSやGCPといったパブリッククラウドでOpenShiftをデプロイするときは、いくつかの質問に答えてデプロイをすると30分程度でクラスタが立ち上がり、非常に簡単にOpenShiftを利用することができます。 これがオンプレ環境であってもOpenShiftのデプロイで同様な体験をすることができ、パブリッククラウドであってもオンプレのプライベートクラウドであっても即座にOpenShiftを利用することが可能になります。   [3].  https://access.redhat.com/documentation/ja-jp/reference_architectures/2020/html-single/deploying_red_hat_openshift_container_platform_4.4_on_red_hat_openstack_platform_13_and_16.0/index   ・最後に 黎明期からOpenStack Summitや大規模本番環境に適用するといったことでOpenStack周辺で活動してきた筆者として個人的な感想を述べるとOpenStackは誕生から10年を迎え、安定したとても理解しやすいインフラ基盤のソフトウェアとなったと思います。 KubernetesやOpenShiftといったコンテナ基盤を開発者が使いこなすためには、柔軟性があり基盤と対話できるAPIを備えたインフラが非常に重要となります。 オンプレ環境においてOpenStackは柔軟性とKubernetesが必要とするAPIを備えているため相性が良く使いやすいです。     [1]. https://access.redhat.com/ja/node/2606981 [2].  https://access.redhat.com/ja/support/policy/updates/errata#RHEL8_Life_Cycle [3].  https://access.redhat.com/documentation/ja-jp/reference_architectures/2020/html-single/deploying_red_hat_openshift_container_platform_4.4_on_red_hat_openstack_platform_13_and_16.0/index  
Red Hat で OpenShift のサポートエンジニアをしている Daein(デイン) です。 OpenShift 4.5(Kubernetes 1.18) から startupProbe が Beta 機能としてデフォルトで利用できるようになりましたのでどのような機能であるか確認していきます。 関連リリースノートは以下のリンクです。 github.com Probesとは これまで livenessProbe と readinessProbe は、安定的なサービスが提供できるようにコンテナの起動状態を定期的にチェックし、正しく起動できなくなったコンテナを再起動させたり、外部からのアクセスを遮断させたりする機能を提供していました。 詳しい内容や詳細は次のリンク先をご参照ください。 docs.openshift.com kubernetes.io 今回は新しく追加された startupProbe という起動フェーズを別のアプローチで監視できる機能にフォーカスしてみてみたいと思います。 startupProbeが追加された背景 起動まである程度時間が必要なコンテナの場合は livenessProbe の initialDelaySeconds (コンテナ起動後、最初Probeが実施されるまでの秒数を指定する項目)で初期化が成功していたか確認して失敗された場合はコンテナを再起動させて改めてコンテナの初期化が実施できるように構成する必要がありました。ただし、 livenessProbe はコンテナの起動時だけではなく全ライフサイクルをカバーする必要があるため、アプリケーションの起動時間がより長くなったり、大きく変動したりするとそれにフォーカスした設定が難しくなってしまいがちですが、その時 startupProbe を利用して他の Probes と切り分けて設定できます。 Upstream で startupProbe 機能の設計については次のドキュメントをご参照ください。 github.com startupProbeの設定と処理フロー startupProbe は既存 livenessProbe と全く同じ方法で設定できるため、特別な設定などが追加されていません。異る点としては、 startupProbe が設定された場合は、コンテナ起動後、他の Probes より先に評価されて成功と判定されない限り、コンテナが再起動されて次のProbesが開始されない点です。 ちなみに、 readinessProbe と違って startupProbe と livenessProbe は successThreshold を" 1 "しか指定できません。 github.com // Liveness-specific validation if ctr.LivenessProbe != nil && ctr.LivenessProbe.SuccessThreshold != 1 { allErrs = append (allErrs, field.Invalid(idxPath.Child( "livenessProbe" , "successThreshold" ), ctr.LivenessProbe.SuccessThreshold, "must be 1" )) } allErrs = append (allErrs, validateProbe(ctr.StartupProbe, idxPath.Child( "startupProbe" ))...) // Startup-specific validation if ctr.StartupProbe != nil && ctr.StartupProbe.SuccessThreshold != 1 { allErrs = append (allErrs, field.Invalid(idxPath.Child( "startupProbe" , "successThreshold" ), ctr.StartupProbe.SuccessThreshold, "must be 1" )) } 他のProbesを含めてどのような処理フローになるかは以下の図の通りです。 startupProbe process flow chart 設定項目の詳細説明は本記事では割愛していますが、以下のリンク先に詳しく紹介されています。 kubernetes.io 動作確認 startupProbe を利用して起動フェーズ向けの設定のみ別途指定できるので initialDelaySeconds を利用して起動時間を予測してその時間まで監視を遅らせなくても設定ができます。 例えば、 failureThreshold を大きくして監視をスキップしないまま、定期的に初期化の完了をモニターし、実際にコンテナが起動したら直ぐ判定できるので無駄な待機時間の消費を無くす構成ができます。 この構成を実際に確認してみます。 Probes のチェックは Kubelet から実施されるため、監視コンテナの数が多い場合や厳密に監視したい場合は kubeReserved で専用のリソースを十分設定する必要があるかも知れません。 docs.openshift.com apiVersion : machineconfiguration.openshift.io/v1 kind : KubeletConfig metadata : name : set-allocatable spec : machineConfigPoolSelector : matchLabels : custom-kubelet : small-pods kubeletConfig : systemReserved : cpu : 500m memory : 512Mi kubeReserved : cpu : 500m memory : 512Mi 次の通り、テスト用の Pod に対して startupProbe 、 livenessProbe 、 readinessProbe を全て定義して、 startupProbe が成功だと判定されるまで他の Probes が実際に開始されないか確認してみましょう。 startupProbe : httpGet : path : /startup_healthz port : 8080 failureThreshold : 20 periodSeconds : 2 livenessProbe : httpGet : path : /liveness_healthz port : 8080 failureThreshold : 3 periodSeconds : 3 readinessProbe : httpGet : path : /readiness_healthz port : 8080 failureThreshold : 3 periodSeconds : 3 以下の出力で startupProbe が成功するまで livenessProbe と readinessProbe が一切開始されないことが確認できます。 Start time : Tuesday September, 22 2020 08:27:43 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:27:44 ] " GET /startup_healthz HTTP/1.1 " 500 - 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:27:46 ] " GET /startup_healthz HTTP/1.1 " 500 - : 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:28:20 ] " GET /startup_healthz HTTP/1.1 " 500 - 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:28:22 ] " GET /startup_healthz HTTP/1.1 " 500 - < --- 20 回目でstartupProbeが失敗され、コンテナが再起動されるまで他のProbesは一切実施されません。 startupProbe が失敗された場合はコンテナが再起動されて次のようなイベントログが出力されます。 Events: Type Reason Age From Message : Warning Unhealthy 4m41s ( x20 over 5m19s ) kubelet, worker1.ocp45.example.com Startup probe failed: HTTP probe failed with statuscode: 500 Normal Killing 3m52s kubelet, worker1.ocp45.example.com Container testtools failed startup probe, will be restarted startupProbe が失敗される前にアプリケーションから 200 (成功だと判定されるステータスコード)を返すように設定を変更すると次回のチェックで startupProbe が成功だと判定されます。 その後の運用向けの間隔と監視URLを用いて設定した他の Probes が開始されます。 Start time : Tuesday September, 22 2020 08:36:03 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:05 ] " GET /startup_healthz HTTP/1.1 " 500 - 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:07 ] " GET /startup_healthz HTTP/1.1 " 500 - : 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:37 ] " GET /startup_healthz HTTP/1.1 " 500 - 127 . 0 . 0 . 1 - - [ 22 /Sep/ 2020 08:36:37 ] " GET /?fail=false HTTP/1.1 " 200 - < --- 200 ステータスコードを返すようにアプリケーションの設定を変更 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:39 ] " GET /startup_healthz HTTP/1.1 " 200 - < --- このタイミングでstartupProbeが成功だと判定 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:39 ] " GET /liveness_healthz HTTP/1.1 " 200 - < --- livenessProbeが開始 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:41 ] " GET /readiness_healthz HTTP/1.1 " 200 - < --- readinessProbeが開始 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:42 ] " GET /liveness_healthz HTTP/1.1 " 200 - 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:44 ] " GET /readiness_healthz HTTP/1.1 " 200 - 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:45 ] " GET /liveness_healthz HTTP/1.1 " 200 - 10 . 129 . 2 . 1 - - [ 22 /Sep/ 2020 08:36:47 ] " GET /readiness_healthz HTTP/1.1 " 200 - : まとめ 簡単に startupProbe がどのように動作するか見てみました。コンテナの稼働監視が起動フェーズと運用フェーズを分けて別途指定できるようになってより適切な監視ができて安定的なサービス監視及び提供に役に立つ構成が設定できるようになったと思います。また、この切り分けが可能になったことで依存サービスの監視及び起動順序の制御にも startupProbe を活用してより簡単に設定できると思います。皆さんもお試しください。
Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 Announcing Quarkus Supersonic, Subatomic Hackathon Finalist の翻訳記事です。 Quarkus Hackathon Finalists Quarkusコミュニティは、 Supersonic, Subatomic Java ハッカソン のファイナリストを発表することに興奮しています。提出された作品は傑出しており、私たちの期待を大きく上回るものでした。Quarkusのアプリケーションを提出してくださった参加者の皆様、ありがとうございました。 ハッカソンのハイライト 15+ の国から 330+ 人の参加者 35+ のアプリケーションの応募 8+ 時間の取り組みとトレーニングセッション 総合のベストと個々のサブカテゴリーの受賞者は、8月21日(金)日本時間の午後23時~翌午前1時(午前10時~午後12時 米国東部標準時)に Quarkus YouTube Live チャンネルを通じて発表されました。 最終選考委員会はリストを絞り込むのに苦労しましたが、以下の通りです(順不同) 総合のベスト TidePool PopulationHealth IoT Slurpanize Weblith ベスト・サーバレス BrightAct Social Innovation Quarkus Classify ベスト Kubernetes ネイティブ Slurpanize TidePool ベスト IoT PopulationHealth IoT Test Your Trivia ベスト近代化 Weblith Quarkus Spring Data JPA
Red Hatの森若です。 今回は、 crypto-policiesのカスタマイズ機能を紹介します。 crypto-policiesそのものについては、以下の記事で紹介しました。 rheb.hatenablog.com crypto-policiesはあらかじめ定義された数種類のプロファイルから選択することで、システムで利用される多数の暗号化ソフトウェアの設定を一括で行うものです。 まとめて設定をおこなうことで、webサーバのHTTPSでは強力な暗号化スイートを設定しているのに、sshでは脆弱な暗号化アルゴリズムを使ってしまうようなことがなくなります。 このような暗号の強弱にかたよりがある場合、一番弱いサービスを入口として攻撃されると考えるべきでしょう。 RHEL 8.2からは、crypto-policiesが強化されて既存のポリシーを選択・適用するだけでなく、管理者がポリシーをカスタマイズしたり、ポリシー全体を新規に定義できるようになりました。 ポリシーはcrypto-policies独自の設定ファイルでおこない、あらかじめ用意されているポリシーと同様に多数のソフトウェアに適用されます。 ポリシーはどう定義されている? カスタマイズをおこなう前に、プリセットで提供されているポリシーを見てみましょう。旧版では生成済みの設定文字列だけがパッケージに含まれていましたが、8.2からはポリシーの 定義も含まれています。 crypto-policiesのポリシーは、 .pol で終わるファイルにテキストで定義されています。 # rpm -ql crypto-policies| grep pol$ /usr/share/crypto-policies/policies/DEFAULT.pol /usr/share/crypto-policies/policies/EMPTY.pol /usr/share/crypto-policies/policies/FIPS.pol /usr/share/crypto-policies/policies/FUTURE.pol /usr/share/crypto-policies/policies/LEGACY.pol デフォルトのポリシーであるDEFAULT.pol を見てみましょう。 key = values の形式で、それぞれの用途で利用可能なプロトコル、アルゴリズム、パラメータの長さ、真偽値が列挙されています。 それぞれの key の意味は man 7 crypto-policies の CRYPTO POLICY DEFINITON FORMAT の章で確認できます。 # A reasonable default for today's standards. It should provide # 112-bit security with the exception of SHA1 signatures needed for DNSSec # and other still prevalent legacy use of SHA1 signatures. # MACs: all HMAC with SHA1 or better + all modern MACs (Poly1305 etc) # Curves: all prime >= 255 bits (including Bernstein curves) # Signature algorithms: with SHA-1 hash or better (no DSA) # TLS Ciphers: >= 128-bit key, >= 128-bit block (AES, ChaCha20, including AES-CBC) # non-TLS Ciphers: as TLS Ciphers with added Camellia # key exchange: ECDHE, RSA, DHE (no DHE-DSS) # DH params size: >= 2048 # RSA params size: >= 2048 # TLS protocols: TLS >= 1.2, DTLS >= 1.2 mac = AEAD HMAC-SHA2-256 HMAC-SHA1 UMAC-128 HMAC-SHA2-384 HMAC-SHA2-512 group = X25519 X448 SECP256R1 SECP384R1 SECP521R1 \ FFDHE-2048 FFDHE-3072 FFDHE-4096 FFDHE-6144 FFDHE-8192 hash = SHA2-256 SHA2-384 SHA2-512 SHA3-256 SHA3-384 SHA3-512 SHA2-224 SHA1 sign = RSA-SHA2-256 ECDSA-SHA2-256 RSA-SHA2-384 ECDSA-SHA2-384 \ RSA-SHA2-512 ECDSA-SHA2-512 RSA-SHA3-256 ECDSA-SHA3-256 \ RSA-SHA3-384 ECDSA-SHA3-384 RSA-SHA3-512 ECDSA-SHA3-512 \ EDDSA-ED25519 EDDSA-ED448 \ RSA-PSS-SHA2-256 RSA-PSS-SHA2-384 RSA-PSS-SHA2-512 \ RSA-SHA2-224 ECDSA-SHA2-224 RSA-PSS-SHA1 RSA-SHA1 ECDSA-SHA1 tls_cipher = AES-256-GCM AES-256-CCM CHACHA20-POLY1305 AES-256-CBC \ AES-128-GCM AES-128-CCM AES-128-CBC cipher = AES-256-GCM AES-256-CCM CHACHA20-POLY1305 CAMELLIA-256-GCM \ AES-256-CTR AES-256-CBC CAMELLIA-256-CBC AES-128-GCM AES-128-CCM \ CAMELLIA-128-GCM AES-128-CTR AES-128-CBC CAMELLIA-128-CBC # 'RSA' is intentionally before DHE ciphersuites, as the DHE ciphersuites have # interoperability issues in TLS. key_exchange = ECDHE RSA DHE DHE-RSA PSK DHE-PSK ECDHE-PSK protocol = TLS1.3 TLS1.2 DTLS1.2 ike_protocol = IKEv2 min_tls_version = TLS1.2 min_dtls_version = DTLS1.2 # Parameter sizes min_dh_size = 2048 min_dsa_size = 2048 min_rsa_size = 2048 # GnuTLS only for now sha1_in_certs = 1 arbitrary_dh_groups = 1 ssh_certs = 1 ssh_etm = 1 ポリシー全体を独自に定義することもできます。作成したポリシーは /etc/crypto-policies/policies/ 以下に拡張子 .pol で配置することで利用可能になります。 ポリシーモディファイア(またはサブポリシー) ポリシーをカスタマイズする場合は、もとになるポリシーに対する差分を表現した、ポリシーモディファイア(ポリシーを変更するもの、拡張子 .pmod。 サブポリシーともいう)を作成して利用します。 ポリシーの定義に対して、追加・削除・再定義することでカスタマイズをおこないます。 /usr/share/crypto-policies/policies/modules に典型的なポリシーモディファイアの例が置かれています。 NO-CAMELLIA.pmod: 暗号化にCamelliaアルゴリズムを利用しない NO-SHA1.pmod: ハッシュ関数にSHA1を利用しない OSPP.pmod: Common Criteria OSPP プロファイル用 NO-SHA1.pmodをみてみましょう。 # This is example subpolicy dropping the SHA1 hash and signature support hash = -SHA1 sign = -RSA-PSS-SHA1 -RSA-SHA1 -ECDSA-SHA1 ポリシー定義とおなじ key = values の書式ですが、valueの先頭に - がついていることでその値を削除することを示しています。追加する場合には先頭に + をつけ、定義しなおす場合には+も-もつけずに値をそのまま書きます。 自分でポリシーモディファイアを作成した場合には、/etc/crypto-policies/policies/modules に拡張子 .pmod で配置します。 ポリシーの適用 ポリシーの適用は 以前とおなじく、 update-crypto-policies コマンドで行います。ただしポリシーモディファイアがある場合は : で名前をつなげます。ポリシーモディファイアは : で繋げることで複数指定できます。 # update-crypto-policies --set DEFAULT:NO-SHA1 Setting system policy to DEFAULT:NO-SHA1 Note: System-wide crypto policies are applied on application start-up. It is recommended to restart the system for the change of policies to fully take place. メッセージにも出力されていますが、update-crypto-policiesは設定を生成するだけで、現在実行中のソフトウェアの動作は変わりません。再起動することで設定を有効にします。 カスタマイズの制限 カスタマイズが可能といっても、何でも好きに変更できるわけではありません。 たとえばRHEL 8の暗号化ライブラリでは、SSL v3や DESなどは含まれていませんので、設定しても実際に動作することはありません。 特定のソフトウェア、たとえばcurlでだけ動作を変更したいというような場合は、crypto-policiesのポリシーモディファイアは目的にあいません。明示的にオプションを指定してcrypto-policiesでの設定をオーバーライドして使いましょう。 参考リンク 第3章 システム全体の暗号化ポリシーの使用 Red Hat Enterprise Linux 8 | Red Hat Customer Portal RHEL8のドキュメント Hardening Guideの一部です。 https://lab.redhat.com/customize-crypto-policy katacodaでのラボで試してみることができます。
Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろ( @chiroito )です。 この記事は、Quarkus.io のブログ記事、 Quarkus now supports test profiles の翻訳記事です。 Quarkus 1.6のリリースにより、Quarkusはテストプロファイルをサポートするようになりました。これにより、同じモジュール内で複数の異なる設定を簡単にテストすることができます。この記事では、テストプロファイルとは何か、その使用方法の概要を説明します。 @QuarkusTest がどのように動作するのかを復習 テストプロファイルについて説明する前に、 @QuarkusTest 注釈付きテストが実際にどのように動作するかについて簡単に説明します。これらのテストを初めて実行すると、Quarkusテスト拡張機能がQuarkusを起動します。その後、Quarkusはテストの実行中ずっと実行されたままになります。これにより、Quarkusは一度だけ起動されるので、テストが非常に速くなります。しかし、別の設定でQuarkusを再起動することができないため、モジュールごとに1つの設定をテストすることに制限がかかります。テストプロファイルを使用すると、この制限が緩和されます。 テストプロファイル テストプロファイルは io.quarkus.test.junit.QuarkusTestProfile インターフェースによって定義されます。プロファイルを定義するには、このインターフェースの実装を提供する必要があります。このインターフェイスは以下のようになります。 /** * テストプロファイルを定義します。 * テストプロファイルの下で実行されるテストは、他のテストとは異なる設定オプションを持ちます。 * */ public interface QuarkusTestProfile { /** * テストに適用する追加の設定を返します。 * これは、既存の設定 (application.properties を含む) を上書きします。 * しかしながら、既存の設定はこれに統合されます。 * (つまり、特定の設定キーがオーバーライドされていない限り、 * application.propertiesの設定は有効になります)。 */ default Map<String, String> getConfigOverrides() { return Collections.emptyMap(); } /** * 有効な代替案を返します。 * * これは 'quarkus.arc.selected-alternatives' 設定キーを設定するのと同じ効果があります。 * しかし、それがより便利になるかもしれません。 */ default Set<Class<?>> getEnabledAlternatives() { return Collections.emptySet(); } /** * デフォルトの設定プロファイルを上書きできるようにします。 * これは基本的にはテストを実行する前に quarkus.test.profile システムプロパティを設定するだけです。 * */ default String getConfigProfile() { return null ; } } 基本的に、このインターフェイスでは3つのことができます。 Quarkusを別の設定で実行するための設定のオーバーライドを提供することです。これらはオーバーライドなので、明示的にオーバーライドされていない限り、既存の設定が存在することに注意してください。 このプロファイルで有効にしたい CDI @Alternatve Bean を指定します。これにより、アプリケーション内の Bean をテスト専用のものに置き換えることができ、本質的にはモックアウトすることができます。 デフォルトの test プロファイルではなく、別の設定プロファイルで実行します。 このプロファイルを実際に使用するには、以下のように @TestProfile アノテーションを使って指定します。 @QuarkusTest @TestProfile(MyProfile.class) public class MyTestClass { ... } このテストクラスは MyProfile クラスで指定された設定で実行されます。 どのように動くのか @QuarkusTest が実行される前に、Quarkusテスト拡張機能は、テストが使用したいプロファイルをチェックします。これは、前回のテストで使用されたプロファイルと比較します。それらが同じであれば、何も実行されません。現在実行中のQuarkusアプリケーションがすでに正しいプロファイルを使用していることを示しています。異なる場合は、Quarkusが停止され、新しい設定で開始されます。 一般的には、可能な限り高速でテストを実行するためには、Quarkusをできるだけ少ない回数で停止して起動するのがベストです。そのためには、テストをアルファベット順に実行し、特定のプロファイルを必要とするすべてのテストを独自のパッケージに設定することをお勧めします。これにより、同じプロファイルを持つすべてのテストが一緒に実行されるため、Quarkusの再起動回数を最小限に抑えることができます。 前へ…​ これらのプロファイルには、時間の経過とともに追加機能が追加されます。(1.7 ではプロファイルごとのカスタムテストリソースのサポートが含まれます)。他にも何かサポートしてほしいことがあったり、その他のフィードバックがあれば、私たちに知らせてください。