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

TECH PLAY

Red Hat  - Open Innovation Labs

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

全900件

OpenShift Advent Calendar 2022 18日目 の投稿です。 こんにちわ。Red HatでOpenShiftのSolution Architectを担当している北山 ( @spchilden ) です。 さて今日は、既存アプリをKubernetesへのきゃりーぱみゅぱみゅさんについて語りたいと思います。 大事なことなので先にお伝えしておくと、12/21 - 12/23とコーチェラ再現Liveがあるので是非参加しましょう。 「 Special Live 2022 -Back To Coachella- 」 イマ再び求められる「Twelve-Factor App」 さて、この1年OpenShiftビジネスに携わっていると、モダンなクラウドネイティブアーキテクチャというより、既存アプリケーションのコンテナ化から始めているユーザーさんと会話させてもらう機会が大きく増えました。 たしかにコミュニティ界隈ではマイクロサービス化を推進するため、Kafkaを使ったデータストリーミングやChange Data Captureを活用したデータ移行などが主流ですが、現場では、まず今あるアプリケーションをまずはコンテナに変えていくことから始めているユーザーさんが大半な気がしています。これを「Replatform」と呼んでたりします。 2022/11に開催された CNDT 2022(Cloud NataiveDays Tokyo) でも少しこの件について触れさせていただきました。 なお、ログインすると動画も見れますので是非。 speakerdeck.com Kubernetesの利用が浸透してきている一方で、とりあえず既存の仮想マシン上で動いていたアプリケーションをコンテナ化すればよいという発想は回避しないといけません。 つまり、Kubernetesでアプリケーションを動かすためには、そのプロセスはやはり「Twelve-Factor App」に従ってReplatformされるべきです。そうしないと、Kubernetes上で運用していても運用の複雑さが増すばかりで、結果としてコンテナ導入メリットを感じられなくなります。 architecturenotes.co ただ、これ。。。 言うは易く行うは難し。 全部アプリケーション改修する予算やノウハウがあれば良いのですが、そう言ってられないのがエンタープライズの世界。 こうした開発者さんの悩みに応えるのが「Konveyor Tackle」です。 Konveyor Tackleの概要 「Konveyor Tackle」とは、KubernetesへのアプリケーションのReplatform、Refactoringを評価、優先順位付けしてくれるプロジェクトです。 はじめてこの名前を聞く方もいらっしゃるかもしれませんが、実はCNCFにもJOINしているオープンソースプロジェクトです。 www.konveyor.io いまのところJavaアプリケーションを対象としたコンテナ化の評価をおこなっていますが、アプリケーション以外にもいくつかの移行ツールが用意されています。 プロジェクト 概要 Tackle Application Inventory アプリケーションの評価(Tackle Pathfinder) および分析(windup)へのゲートウェイ Tackle Pathfinder Kubernetes上にアプリをデプロイするための適合性を評価するアンケートベースのツール Tackle Controls Application InventoryとPathfinderの評価にエンティティを付けて管理するツール Tackle Container Advisor 自然言語処理を使用して、アプリケーションの記述を分析し、アプリケーションをコンテナ化するのに最適なコンテナーイメージを提案 Tackle Data Intensive Validity Advisor (DiVA) アプリケーションのデータ レイヤーを分析し、さまざまなデータ ストアや分散トランザクションへの依存関係を検出 Tackle-DiVA Database Operator Adaption (DiVA-DOA) Kubernetesのマニフェスト(YAML)を生成して、レガシーDBMSシステムを使用するアプリケーションを、HA DB クラスターで動作できるように移行を支援 Tackle Test Generator モダナイズされた後のアプリケーションが同じように動作していることを確認 Tackle Data Gravity Insights モノリシックアプリケーションのコードを洞察し、ドメイン駆動型マイクロサービスにリファクタリングを支援 いっぱいありますね。 今回はこの中からアプリケーションの分析(windup)をご紹介します。 Konveyor Tackleのインストール 今回は「Tackle Operator」を活用して、Tackle v2()をOpenShift v4.11上にインストールします。 事前準備 Tackleをインストールするには、合計5つの永続ボリューム(PV) が必要です。PVC を介して3つの RWO ボリュームと2つのRWX ボリュームが要求されます。 Name Default Size Access Mode Description hub database 5Gi RWO Hub DB hub bucket 100Gi RWX Hub file storage keycloak postgresql 1Gi RWO Keycloak backend DB pathfinder postgresql 1Gi RWO Pathfinder backend DB maven 100Gi RWX maven m2 repository ここで戸惑っちゃうのが、RWXボリューム。…普通無いですよね。 ということで、事前に万能ストレージ「 OpenShift Data Fundation(ODF) 」をインストールしておきます。 (1) Operator Hubから「ODF」を検索してインストール ODF Operator Install (2) OperatorのSubscriptionを定義してインストール実行 詳細はこちら 第2章 動的ストレージデバイスを使用した OpenShift Data Foundation のデプロイ Red Hat OpenShift Data Foundation 4.11 | Red Hat Customer Portal 失敗しないための秘訣は、Install後に待つこと。ODFは様々なコンポーネントから出来ているため、「Installed」の表記に頼らず忍耐強く待ちましょう。 ODF Operator subscription (3) CustomResource(Storage System)の作成 Operatorのインストールが終わったら、今度はCR(Storage System)を作成してODFクラスタを作ります。 詳細はこちら 2.4. OpenShift Data Foundation クラスターの作成 Red Hat OpenShift Data Foundation 4.11 | Red Hat Customer Portal 今回は以下のCR内容で検証しました。CRを作成した後も忍耐強く待ちましょう。 **Backing storage** Deployment type: Full deployment Backing storage type: gp2 **Capacity and nodes** Cluster capacity: 2 TiB Selected nodes: 3 node CPU and memory: 48 CPU and 181.7 GiB memory Zone: 1 zone Taint nodes: Disabled Security and network Encryption: Disabled Network: Default (SDN) (4) ODFクラスタの確認 OpenShiftポータルのAdministrator Perspectiveから[Storage]>[Data Fundation]を選択し、以下の表記に変わればクラスタ作成は完了です。 ODFクラスタが立ち上がってそのボリュームが利用できるまで10分くらい待ちます。 Data Fundation Confirmation Tackle Operatorのインストール ボリュームが用意できたら、次にTackle Operatorをインストールしていきます。 詳細はこちら GitHub - konveyor/tackle2-operator: Tackle Operator fully manages the deployment and life cycle of Tackle on Kubernetes and OpenShift. (1) Operator Hubから「Tackle Operator」を検索してインストール Tackle Operator Install (2) OperatorのSubscriptionを定義してインストール実行 Tackle Operator subscription (3) CustomResource(Tackle)の作成 Tackle Operatorには、CR(Tackle)の作成必須です。Operatorのインストール作業が終わるとすぐに作るように求められます。 また、通常通り[Operaors]>[Installed Operators]から「Tackle Operator」を選択し、[Tackle]タブにある「Create Tackle」からも設定が可能です。 ここで注意することは、先ほど作成したODFの領域をRWXストレージ領域として割り当てることです。通常であればフォームから作成しますが、フォームにストレージを設定する項目がないため今回はYAML形式でCRを記載してください。 CRには、 hub_bucket_storage_class にODFで作成されたRWXのストレージクラス( ocs-storagecluster-cephfs )を設定します。 なお、CRの詳細は こちら からご確認下さい。 apiVersion: tackle.konveyor.io/v1alpha1 kind: Tackle metadata: name: tackle namespace: konveyor-tackle spec: feature_auth_required: 'true' hub_bucket_volume_size: "50Gi" hub_bucket_storage_class: "ocs-storagecluster-cephfs" cache_data_volume_size: "50Gi" (4) Tackle UIの確認 CR(Tackle)によってインストールが終わると、Project[konveyor-tackle]のRouteにTackle UIへの接続URLが払い出されます。 OpenShiftポータルのAdministrator Perspectiveから[Networking]>[Routes]を選択し、[Tackle]のURLにブラウザから接続して以下が表示されたら完了です。 Konveyor Tacle Login Portal ここでのデフォルトのユーザー名とパスワードは以下のとおりです。 Username: admin Password: Passw0rd! ログインすると、始めにパスワードの変更が求められます。 Tackle Controlsによるエンティティ登録 Tackleのポータルには「Application Inventory」「Reports」「Controls」が表示されます。まずは「Tackle Controls」から評価対象の構成要素を作成しておきます。 Tackle ControlsはApplication Inventoryで利用されるエンティティの管理です。これらはStakeholders(利害関係者)、Stakeholder groups(利害関係者グループ)、Job functions(職務)、Business Service(ビジネスサービス)、Tags(タグ タイプ)で構成されています。 Tackle Controls Portal 今回はサンプルのアプリケーション登録のため、必要がない場合は「エンティティ登録」は一旦スキップしていただいても構いません。 (1) Stekeholders(利害関係者)の登録 対象アプリケーションに携わる関係者とその属性を登録します。Tackle Controlsの[Stakeholders] タブから[Create new] を選択して情報を登録します。 Create stakeholders (2) Stekeholder groups(利害関係者グループ)の登録 次に彼らのグループを登録します。Tackle Controlsの[Stakeholder groups] タブから[Create new] を選択して情報を登録します。 Create Stakeholder Groups 必要に応じて、先程登録したStakeholdersをメンバーに加えておきます。 (3) Business Service(ビジネスサービス)の登録 次にビジネスサービス名を登録します。Tackle Controlsの[Business Service] タブから[Create new] を選択して情報を登録します。 Create Business Service 必要に応じて、先程登録したStakeholdersをメンバーに加えておきます。 以上で最小の登録は完了です。 Confirm Stakeholder Windupによる「Analyze(分析)」 次にWindupを使ってアプリケーションを分析してみましょう。 Application Inventryは、Tackle Pathfinderによる評価(Assessment)とWindupによる分析(Analysis)のインターフェイスです。双方行えますが、今回は分析の方を紹介します。 Application Inventory Portal (1) Applicationの登録 まずは、Tackle Application Inventryの[Analysis]タブから[Create new]を選択して以下の情報を登録します。 Name: Customer Description: Legacy Customers management service Business Service: Retail Tags: Tomcat , Java Create new application Applicationの登録が完了するとApplication Inventoryのページに一度戻ります。[Assessment]、[Analysis]の双方にApplicationが登録されていれば完了です。 (2) Analysis(分析)の開始 Tackle Application Inventryの[Analysis]タブから登録したApplicationを選択し、[Analysis]ボタンを押します。 Start Analysis (3) Analysis Mode 立ち上がったポップアップからAnalysisの対象を登録します。 ここではローカルのサンプルをアップロードするため「Upload a local binary」を選択してください。 サンプルに使用するバイナリファイル(.war)は、事前に ここ からダウンロードしておきます。 *1 ダウンロードした customers-tomcat.war ファイルをドラッグアンドドロップするか、ローカル ファイル システムからアップロードします。 Analysis Mode file upload アップロードが完了するまで、おそらく数秒かかります。「Success: Uploaded binary file.」の表示が出るまで少し待ちましょう。登録が完了したら「Next」を押して次に行きます。 (4) Set Targets 次は変換先のターゲットオプションが表示されます。ここでは、移行するテクノロジーを選択します。 サンプルは Linuxコンテナをターゲットとして、独自JDKディストーションの依存を取り除くため、 Containerization 、 Linux 、 OracleJDK to OpenJDK をターゲットとして選択します。 登録が完了したら「Next」を押して次に行きます。 (5) Application Scope 診断するアプリケーションに関する依存関係のスコープが選べます。 今回はアプリケーション内部のライブラリだけで良いため、 Application and internal dependencies only を選択してください。    Scope Setting ここも登録が完了したら「Next」を押して次に行きます。 (6) Application Scope 分析には、カスタムルールエンジンが使用されており、移行ターゲットに応じて多くのルールが付属されています。 またカスタムルールをXMLで独自に作成することで拡張も可能です。 ここではアプリで使用されている特定のライブラリの使用を検出し、削除を提案するカスタム ルールを提供してみます。 サンプルに使用するカスタムルールファイル(.xml)は、事前に ここ からダウンロードしておきます。 *2 ダウンロードしたカスタムルールファイルをドラッグ アンド ドロップするか、ローカル ファイル システムからアップロードします。 Custom Rules カスタムルールの登録が確認できたら「Next」を押して次に行きます。 (7) Options 分析を微調整するためのオプションが表示されますが、今回はデフォルトのまま使用します。 Select Options 「Next」を押して次に行きます。 (8) Reviews 最後に全体の確認を行います。ここまで登録できると以下が表示されています。 Review analysis details Review the information below, then run the analysis. Applications: Customer Mode: Upload a local binary Targets: - openjdk - linux - cloud-readiness Sources: - java Scope: Application and internal dependencies Included packages: Excluded packages: Custom rules: - corporate-framework-config.windup.xml Excluded rules tags: Transaction Report: Disabled 確認して問題がなければ[Run]を押して分析を実行します。 分析を実行する前に、Windup用のコンテナイメージをプルする必要があるため、分析には数分かかる場合があります。 Windupによる「Analyze(分析)」結果レポート レポートが完成したら、リンクをクリックしてレポートにアクセスし、アプリケーション(customers-tomcat.war)をクリックします。 View Report レポートのDashboardにはアプリケーションが使用するテクノロジや依存関係などあらゆる情報が提供されますが、修正が必要な点は「Issues」タブに記載されています。 Issue Mandatory 必須の修正箇所は以下の4件です。 - Legacy configuration - 2件 - Hard coded IP address - 1件 - File system - Java IO - 1件 それぞれのリンクを辿りながら、簡単に詳細を見ていきましょう。 (1) Legacy configuration これは先程カスタムルールで定義した課題がソースコードから見つかったことを示しています。 Legacy Configuration 内容としては、従来のApplicationConfigurationクラスが使用されていることが指摘されています。Springの @PropertySource アノテーションと Environment クラスを使用したアプローチに置き換えるよう推奨されています。 Kubernetesを利用したアプリケーションでは、内部でパラメータ設定を行うのではなくConfigMapやSecretなどで環境変数として取り扱うことが推奨されています。 冒頭の CNDT 2022の資料 とも合わせて確認してください。 (2) Hard coded IP address 次は、ソースコードにDBに接続するためのIPアドレスが定義されていることを指摘されています。 Hard coded IP address プロパティファイル(WEB-INF/classes/persistence.properties)に、アドレスが記載されているため、Kubernetesではサービス名などに置き換える必要があります。 (3) File system - Java IO 最後はローカルにあるプロパティファイル(/opt/config/persistence.properties)を呼び出していることが指摘されています。 File system - Java IO Kubernetes上ではローカルホストに置かれたファイルをマウントすることは推奨されていないため、ConfigMapなどを活用して設定情報を取り扱ってください。 まとめ Konveryor Tackleいかがでしたでしょうか。今回は簡単なアプリケーションを診断にかけてみました。 クラウドネイティブにマイクロサービス化することも重要なことではありますが、まずはReplatformによってコンテナ化するところから始めてみましょう。 その選択肢の一つとして、Konveryor Tackleを使ってみてはいかがでしょうか。 最後に、大事なこともぅ一度お伝えしておくと、12/21 - 12/23とコーチェラ再現Liveがあるので是非楽しみましょう。 「 Special Live 2022 -Back To Coachella- 」 *1 : これは、 Red Hat Modern Application Development Workshop で利用される分析用のサンプルファイルです。 *2 : これは、 Red Hat Modern Application Development Workshop で利用される分析用のサンプルファイルです。
Red Hat のソリューションアーキテクトの瀬戸です。 この記事は Red Hat Developer の How to migrate apps from JBoss EAP 7.x to JBoss EAP 8-Beta を、許可をうけて翻訳したものです。 この記事で消化しているMTRの廃止が決まっていますので、移行方法についてあらためてまとめました。以下の記事を参照してください。(2024年4月) rheb.hatenablog.com この記事では最近リリースされたJBoss EAP 8-Betaについて説明します。JBoss EAP 8 で導入された変更点について解説し、アプリケーションを JBoss EAP 7.4 から移行するために必要な手順を示します。 JBoss EAP 8.0 はJakarta EE 10をサポートします。Jakarta EE 10 は EAP 7 でサポートされている Jakarta EE 8 仕様と比較して Jakarta EE に大きな変更をもたらします。JBoss EAP 8 では以下の機能にも変更が入っています。 Picketbox の削除: JBoss EAP 6.4 から非推奨になっていました。レガシーなセキュリティー設定はElytron セキュリティーサブシステムに移行する必要があります。すでに Elytron に移行済みの EAP ユーザーは変更を加える必要はありません。 PicketLink の削除: JBoss EAP 6.4 から非推奨になっていました。PicketLink で提供されていたシングルサインオン機能には RH SSO を利用することをお勧めします。 OpenID Connect (OIDC) のサポート は、個別の RH-SSO OIDC アダプターのかわりに elytron-oidc-client サブシステムによって提供されるようになります。 SAML サポート は RH-SSO SAML アダプターによって提供されるようになります (Picketlink SAML は削除されました)。JBoss EAP 8.0 GA では、SAML のサポートは新しい RH-SSO SAML Galleon Feature Pack によって提供されます。 Hibernate 6.x: 5.11.x から 6.0.x への移行に関するガイダンスについては、 Hibernate Search の記事 を参照してください。 JDK 8 の削除: JDK 11 または JDK 17 が必要になりました。 Jolokia と Prometheus の削除: Red Hat はこれらの機能をサポートしなくなります。JBoss EAP サーバーは、サーバーメトリクスエンドポイント ( : /metrics) を介してメトリクスを公開します。 Apache Log4j 1.x の APIの 削除: アプリケーションが log4j.jar および Log4jの設定をアプリケーションの一部として含んでいない場合は、それらを更新する必要があります。 新しい maven プラグイン: 新しい eap-maven-plugin は Galleon テクノロジを使用して、アプリケーションで必要なレイヤー構成に基づいてサーバーを構築します。これにより実行時サイズとメモリフットプリントが削減され、外部からの攻撃を受ける可能性のある領域が縮小されます。CVE の影響を受ける JAR が存在しない場合にはEAP は CVE に対して脆弱ではありません。JBoss EAP 8 OpenShift イメージには、EAP 6 と EAP 7 で使用されていたような EAP ランタイムバイナリは含まれていません。このプラグインはサーバー設定をカスタマイズするための JBoss EAP CLI スクリプト ファイルの実行もサポートしています。OpenShift Source to Image ビルド (S2I) はこの変更を組み込み、eap-maven-plugin を利用してサーバーを作成するように再設計されました。詳細については ドキュメント を参照してください。 ブリッジのデプロイが失敗する: 以前はブリッジを使用する時まで誤って構成されているかがわかりませんでした。新しいバージョンではブリッジのデプロイに失敗した場合には追加時に失敗するようになりました。 このベータ版リリースで導入された変更点の詳細については、 リリースノート を参照してください。 JBoss EAP 7.4 から JBoss EAP 8-Beta への移行 アプリケーションを JBoss EAP 7.4 から JBoss EAP 8.0 Beta に移行するためにはコードの変更が必要になります (Jakarta EE 8 から Jakarta EE 10 への移行 ("javax"名前空間から"jakarta"名前空間への変換等) のため)。どういう変更が必要なのかについては こちらの記事 を参照してください。 この移行作業でお客様を支援するためにRed Hat のエンジニアはツール、 Migration Toolkit for Applications と Migration Toolkit for Runtimes (MTR、OpenShiftを使用していないプロジェクト用) および JBoss EAP Server Migration toolの更新に励んでいます。この記事では、これらのツールを使用してアプリケーションを JBoss EAP 7.4 から JBoss EAP 8-Beta に移行します。 この記事では2 つの領域に焦点を当てます。最新バージョンのMTR ツールで特定される必要なコード変更と、standalone.xml ファイルの構成の変更です。 、JBoss EAP 7.4 クイックスタートに、MySQL データベースに接続するためのいくつかの変更を加えたアプリケーションを使用します。これによりモジュールとドライバーの変換を検証できます。このアプリケーションの ソース コード を確認できます。 前提条件 実際の移行作業を開始する前に、実行中のアプリケーションで JBoss EAP 7.4 のインスタンスをセットアップします。これはサーバー構成ファイルの移行プロセスのデモに使います。 JBoss EAP 7.4 クイックスタートのkitchensinkアプリケーションを次のように変更して使用します。 アプリケーションをMySQL データベースに接続するように更新しました。これにより、J2EE モジュールとドライバーの移行をテストできます。 KCS の記事 で説明されているように、Java Server Faces をバージョン 2.2 から 2.3 に更新しました。 次のコマンドを使用して、Podman や Docker を使用して、正しい構成で MySQL のインスタンスを実行できます。 podman run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD =root -e MYSQL_DATABASE =eap mysql JBoss EAP 7.4 zip ディストリビューションを ダウンロード します。ディストリビューションをローカルフォルダー(例: ~/jboss-eap-74) に解凍します。Red Hat アカウントを持っていない場合はアカウントを作成してください。 EAP_HOME 環境変数を設定します。 export EAP_HOME =~/jboss-eap-74 こうすると次のコマンドで JBoss EAP 7.4 を起動できます。 $EAP_HOME /bin/standalone.sh こちらのサンプル アプリケーション をgitを使用してチェックアウトしてください。 ディレクトリを eap-quickstarts/kitchensink フォルダーに変更します。 modules フォルダーの内容を ~/jboss-eap-74/modules フォルダーにコピーします。 cp -r modules/* $EAP_HOME /modules JBoss EAP CLI を実行します。 $EAP_HOME /bin/jboss-cli.sh –-connect JBoss CLI に次のコマンドを入力して MySQL ドライバーとデータソースを設定します。 / subsystem =datasources/jdbc-driver = mysql:add ( driver-name = mysql,driver-module-name = com.mysql ) data-source add --name=mysql --jndi-name=java:/jdbc/mysql --driver-name=mysql --connection-url=jdbc:mysql://127.0.0.1:3306/eap --user-name=root --password=root アプリケーションをビルドし、maven を使用して JBoss EAP 7.4 にデプロイします。 mvn clean install wildfly:deploy このアプリケーションが正常にデプロイされると、 http://127.0.0.1:8080/kitchensink からアクセスできるようになります。 これでアプリケーションを実行している JBoss EAP 7.4 のインスタンスが作成され、JBoss EAP 8.0 Beta に移行する準備が整いました。移行を開始する前にJBoss EAP 7.4 サーバーをシャットダウンし、JBoss EAP 7.4 デプロイメント先を指す環境変数を作成します。 export EAP_PREVIOUS_HOME =~/jboss-eap-74 JBoss EAP 8-Beta ディストリビューションを こちら からダウンロードしてください。 ディストリビューションをローカルフォルダー (例: ~/jboss-eap-8) に解凍します。 EAP_HOME 環境変数を次のように設定します。 export EAP_HOME =~/jboss-eap-8 これでJBoss EAP 7.4 から JBoss EAP 8.0 Beta への移行に進むことができます。 サーバー構成の変更 アプリケーションを JBoss EAP 7.4 にデプロイしたときにサーバー設定に変更を加えて MySQL に接続するモジュールとドライバーを追加しました。これらのモジュールとドライバーがJBoss EAP 8-Beta サーバーに正しく配置され動作することを確認する必要があります。JBoss EAP サーバー移行ツールを使用して、この移行を実行できます。 こちら からサーバー移行ツールをダウンロードします。 アーカイブをローカルフォルダーに解凍し、新しいディレクトリに変更します。次のコマンドを実行します。 ./jboss-server-migration.sh -s $EAP_PREVIOUS_HOME -t $EAP_HOME サーバー移行ツールは、移行プロセス中に一通りの質問をします。 ---------------------------------------------------------- ---- JBoss Server Migration Tool ----------------------- ---------------------------------------------------------- Retrieving servers... INFO SOURCE server name: JBoss EAP, version: 7.4.0.GA. INFO TARGET server name: JBoss EAP, version: 8.0.0.Beta. ---------------------------------------------------------- ---------------------------------------------------------- Server migration starting... INFO --- Migrating modules requested by environment... INFO No modules to migrate. Migrate the source's standalone server? yes/no? スタンドアロン構成を移行するには、 [yes] を選択します。 INFO --- Migrating standalone server... INFO Source's standalone content migrated. INFO Source's standalone configurations found: [standalone-full-ha.xml, standalone-full.xml, standalone-ha.xml, standalone-load-balancer.xml, standalone.xml] Migrate all configurations? yes/no? [no] を選択します。移行する構成を選択します。 Migrate configuration standalone-full-ha.xml ? yes/no? [no] を選択します。standalone-full-ha.xml を移行したくありません。 Migrate configuration standalone-full.xml ? yes/no? [no] を選択します。standalone-full.xml を移行したくありません。 Migrate configuration standalone-ha.xml ? yes/no? [no] を選択します。 standalone-ha.xml を移行したくありません。 Migrate configuration standalone-load-balancer.xml ? yes/no? [no] を選択します。standalone-load-balancer.xml を移行したくありません。 Migrate configuration standalone.xml ? yes/no? [yes] を選択します。standalone.xml を移行したいと考えています。 INFO Migrating standalone configuration standalone.xml... WARN Migration of legacy security domain jboss-web-policy's authorization is not supported and will be ignored. WARN Migration of legacy security domain jaspitest's authentication-jaspi is not supported and will be ignored. WARN Migration of legacy security domain jboss-ejb-policy's authorization is not supported and will be ignored. INFO Legacy security XML configuration retrieved. INFO Unsupported extensions removed: [org.jboss.as.security] INFO Unsupported subsystems removed: [urn:jboss:domain:security:2.0] INFO Referenced paths migrated. INFO Legacy security realms removed from XML configuration. WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.wildfly.extension.elytron.SSLDefinitions (jar:file:/home/philip/Downloads/wildfly-ee-dist-8.0.0.Beta-redhat-00002/jboss-eap-8.0/modules/system/layers/base/org/wildfly/extension/elytron/main/wildfly-elytron-integration-jakarta-19.0.0.Beta16-redhat-00004.jar!/) to method com.sun.net.ssl.internal.ssl.Provider.isFIPS() WARNING: Please consider reporting this to the maintainers of org.wildfly.extension.elytron.SSLDefinitions WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release INFO Legacy security realm ManagementRealm migrated to Elytron. INFO Legacy security realm ApplicationRealm migrated to Elytron. INFO Legacy security domain other migrated to Elytron. Migrate the source's managed domain? yes/no? [no] を選択します。マネージドドメインは使用していません。 Server migration done. INFO ---------------------------------------------------------------------------------------------------------- Task Summary ---------------------------------------------------------------------------------------------------------- server .......................................................................................... SUCCESS standalone ..................................................................................... SUCCESS contents.standalone.migrate-content-dir ....................................................... SUCCESS contents.standalone.migrate-content(path=7d/975dfd92d3b7a35f48054ad2190bdf7ebbeb3b/content) .. SUCCESS contents.standalone.migrate-content(path=b5/fe70630a477a851f755cc04eb5cc3030bb02db/content) .. SUCCESS contents.standalone.migrate-content(path=92/2cdbb0d087989ad5e6ecbd3c0123a34def19b7/content) .. SUCCESS contents.standalone.migrate-content(path=14/99d19995fc5835cb1c07eed113447b4fb46c4e/content) .. SUCCESS contents.standalone.migrate-content(path=3d/25c8107fcc4cf82f234dcf6ad5b8e926e7ec18/content) .. SUCCESS contents.standalone.migrate-content(path=45/9834b7318bd81b320829432fdef5a77bf93a19/content) .. SUCCESS contents.standalone.migrate-content(path=38/c53e35a6ab9d8a40016a5429f7115ff94e3ce7/content) .. SUCCESS standalone-configurations ..................................................................... SUCCESS standalone-configuration(source=standalone.xml) .............................................. SUCCESS ---------------------------------------------------------------------------------------------------------- Migration Result: SUCCESS ---------------------------------------------------------------------------------------------------------- この操作が完了したら、JBoss EAPをインストールしたフォルダーから以下のコマンドを使用して JBoss EAP 8.0 サーバーを起動できます。 ./bin/standalone.sh サーバーが正常に起動したら、次のコマンドで構成をテストできます。 ./jboss-cli.sh --connect   /subsystem=datasources:installed-drivers-list 出力にMySQLドライバーの情報が次のように表示されます。 { "outcome" => "success", "result" => [ { "driver-name" => "mysql", "deployment-name" => undefined, "driver-module-name" => "com.mysql", "module-slot" => "main", "driver-datasource-class-name" => "", "driver-xa-datasource-class-name" => "", "datasource-class-info" => undefined, "driver-class-name" => "com.mysql.cj.jdbc.Driver", "driver-major-version" => 8, "driver-minor-version" => 0, "jdbc-compliant" => false } 次の JBoss CLI コマンドを使用してデータソース接続をテストすることもできます。 /subsystem=datasources/data-source=mysql:test-connection-in-pool 接続が成功すると次のようなレスポンスが返されます。 { "outcome" => "success", "result" => [true] } アプリケーションに必要なドライバーとデータソースが存在することを確信できるようになったので、コード分析セクションに進むことができます。 コード分​​析 JBoss EAP 7.4 で動くアプリケーションのコード分析を実行するには、Migration Toolkit for Runtimes(MTR) の最新バージョンを使用します。このツールは こちら からダウンロードできます。 *1 コマンド ./run_windup.sh を実行してMTR ツールを起動し、 http://127.0.0.1:8080/windup-ui に移動します。 *2 MTRの初期ページ (図1) で、 [ Create Project ] をクリックします。 図1: Migration Toolkit for applications の開始ページ プロジェクト名 (eap7-eap8 など) を入力し、 [Next] をクリックします。 次に、分析するアーティファクト(アプリケーション)をアップロードする必要があります (図2)。 図2: Migration Toolkit for Applications にアーティファクトを追加 アプリケーションをビルドして作成したWARファイルをWeb コンソールからアップロードします。WAR ファイルは eap-quickstarts/kitchensink/target フォルダーにあります。 [次へ] をクリックし て進みます。 次に変換ターゲットを選択します (図3): [Application server migration to EAP 7] ボックスから [eap8] を選択します。 図3: Migration Toolkit for Applications でターゲットを選択するページ [Next] をクリックして続行します。 次の画面で、選択したパッケージのリストに org を追加し、 [Next] をクリックします。 後続のページをクリックして進み、 [Save and Run] を選択して分析を開始します。分析が終了したら、分析リスト行の右側にあるグラフの記号をクリックして、レポートを読み込みます。 レポートから、ツールがこのアプリケーションを移行するために 87 のストーリー ポイントを見積もっていることがわかります。ストーリー ポイントの見積もりは、時間 (時間や日など) とは関係ありません。これは、他の分析からのレポートに対して測定するための指標です。 kitchensink.war をクリックして、対処すべき問題の詳細を表示します (図4)。 図4: Migration Toolkit for Applications ダッシュボード ビュー ダッシュボード ビューで [Issues] タブをクリックして、 解決するインシデントのリストを表示します。 この記事では、 [Migration Mandatory] (移行に必須な項目)に焦点を当てます (図 5)。 図5: Migration Toolkit for Applications のissuesの一覧 この分析の結果は、私たちの予想と一致しています (つまり、"javax"への参照を"jakarta"に変更)。他のいくつかの変更点も強調表示されています (たとえば、アプリケーションは Java Server Faces を使用しています)。そのため、JBoss EAP 8-Beta バージョンと一致するようにバージョンを更新する必要があります。 これらの項目を個別に調べてコードを手動で変更するか、 Openrewrite などのツールを使用してこれらの変更を自動化するかを選択できます。Openrewriteを使用して Java EE 8 から Jakarta EE 9 に移行する方法については、 こちらの記事 を参照してください。 レポートに記載されている変更の 1 つは、図 6 に示されている pom.xml ファイルの依存関係を更新することです。 図6: Migration Toolkit for Applications コードの変更例 この例では、groupId と artifactId の変更に加えて、version.server.bom プロパティを変更する必要があります。pom.xml で、以下を置き換えます。 <version . server . bom> 7.4.0.GA </version . server . bom> を <version . server . bom> 8.0.0.Beta-redhat-00004 </version . server . bom> 注意: このガイドは JBoss EAP のベータ版リリースを扱っているため、早期アクセス Maven リポジトリーをプロジェクトに追加する必要があります。これは GA リリースでは必要ないため、移行ツールキットの規則の対象外です。これらのリポジトリを追加するには、pom.xml ファイルの repositories ブロックに以下を追加します。 <repository> <id> redhat-ea-maven-repository </id> <name> Red Hat Early Access Maven Repository </name> <url> https://maven.repository.redhat.com/earlyaccess/all/ </url> <releases> <enabled> true </enabled> <updatePolicy> never </updatePolicy> </releases> <snapshots> <enabled> true </enabled> <updatePolicy> never </updatePolicy> </snapshots> <layout> default </layout> </repository> これらの変更がすべて完了するとアプリケーションをビルドして JBoss EAP 8-Beta にデプロイできるようになります。デプロイするためにはJBoss EAP 8-Beta サーバーが実行されている状態で次のコマンドを実行します。 mvn clean install wildfly:deploy maven プロセスが完了すると、アプリケーションが http://127.0.0.1:8080/kitchensink で利用できるようになります。 成功です!JBoss EAP 7.4 アプリケーションとサーバー設定はJBoss EAP 8-Beta に完全に移行されました。 JBoss EAP 8 ベータ版リリース この記事ではJBoss EAP 8.0 のベータ版リリースで導入された主な変更点について説明しました。サーバー移行ツールを使用して設定を JBoss EAP 7.4.0 から JBoss EAP 8.0 に移行するために必要な変更を行いました。Migration Toolkit for Applications を使用してJakarta EE 8 から Jakarta EE 10 への移行に必要なコード変更に関するガイダンスを提供しました。 JBoss EAP Beta リリースに関連する便利なリンクを以下に示します。 JBoss EAP 8-Beta リリースノート JBoss EAP 8 ベータ版のダウンロード Migration Toolkit for Applications *3 JBoss サーバー移行ツールのダウンロード Jakarta EE 8 から EE 10 への Red Hat JBoss EAP アプリケーションの移行 Hibernateの5.11 からの移行ガイド Migration Toolkit for Applications の概要ビデオ *1 : 訳注:Migration Toolkit for RuntimesはMigration Toolkit for Applicationsがリブランドされたものです。OpenShift上で動かさない場合はこちらを使用することになりました。機能は一緒です。 *2 : 訳注:アクセスできない場合はEAPをシャットダウンしていることを確認してください。 *3 : 訳注:OpenShift上で動かさない場合はMTRを使用してください。 https://developers.redhat.com/products/mtr/overview
この記事は、「Ansible Advent Calendar 2022」の17日目の記事です。 皆様いかがお過ごしでしょうか。レッドハットテクニカルサポートの呉と申します。普段は Ansible と RHEL(主に Services )のサポートをしています。 今回は、利用したい機能が Ansible モジュールに見当たらないといった時にあれこれ工夫する一例として、ansible.builtin.uri モジュールを例にしながら触れてみようと思います。 docs.ansible.com Ansible は本記事の作成時点(2022年12月17日)で実に 3300+ ものモジュールを持ちますが、全ての製品 の全ての機能を網羅しているわけではないため、必要だと思われる機能があればその都度、RFE を上げて実装のリクエストを出す事になります。 Ansible Collections のリポジトリはこちらになります。 github.com 例えば、cisco.nxos の collection で追加してほしい機能等があれば、以下のリポジトリの issue から RFE を作成する事になります。 github.com 尚、RFEは必ず承認されて実装されるものではありません。また、実装されるとしてもその時期等は不明確なので、その間は、そのリクエストした機能に ついては、何かしらの代替手段で工夫していくことになります(もちろん、自ら実装して pull request を送ってしまうのもアリだと思います!)。 この代替手段については、お問い合わせをいただいた際にはできる範囲でご紹介させていただいております。 今回、その一例が ansible.builtin.uri モジュールになります。 REST API を用いて管理されるノードやサービスで、現行の Ansible モジュールが利用したい機能を提供していない場合はこのモジュールを活用する事が考えられる手段の一つとなります。 ここからは、実際の利用例の紹介となります。また今回は controller.group モジュールを例にしてみました。 本記事の作成時点では、controller.group モジュールでインベントリのグループからホストの関連付け を解除するためには、関連づけておきたい全てのホストを記述する必要があります。 console.redhat.com 例えば以下の様なプレイブックになります。ここでは、Ansible Automation Controller(※以降コントローラ)に存在するインベントリ「test inventory 」に存在するインベントリ グループ「test group」にホスト「test1」「test2」が存在する状態から、test2 のみの関連付けを解除するタスクになります。 ※コントローラに必要な接続情報は controller_info.ymlファイルに変数として全て定義し、インポートしています。 --- - hosts: localhost gather_facts: no tasks: - name: Include vars ansible.builtin.include_vars: file: controller_info.yml - name: Disassociate "test2" from "test group" of "test inventory" ansible.controller.group: controller_host: "{{ CONTROLLER_URL }}" controller_username: "{{ USERNAME }}" controller_password: "{{ PASSWORD }}" controller_oauthtoken: "{{ TOKEN }}" inventory: "inventory test" name: "test group" hosts: - test1 state: present validate_certs: no preserve_existing_hosts: no 上記の例では、test group に存在していてほしいホストが test1 のみのため、特に不便はありませんが、これが多数ある場合はその全てを記載する必要があります。 例えばクラウド環境等をダイナミックインベントリを使って管理していた場合は、都度リストを用意するのが手間になる事が考えられます。 しかしながら本記事作成時点で、グループに存在しているホストのリストを取得する機能が controller.group モジュールにはありません。 そこで、ansible.builtin.uri module を使って関連付けの解除を行う前のホストのリストを一度取得し、そこから削除するホストのみを選択すれば済むタスクを用意しました。 ※community.general コレクションが必要となります --- - hosts: localhost gather_facts: no tasks: - name: Include vars ansible.builtin.include_vars: file: controller_info.yml no_log: true - name: Gathering a host list # ターゲットとなるグループのホストの情報を取得する ansible.builtin.uri: url: "{{ CONTROLLER_HOST + '/api/v2/groups/' + GROUP_ID + '/all_hosts/' }}" method: GET url_username: "{{ CONTROLLER_USERNAME }}" url_password: "{{ CONTROLLER_PASSWORD }}" force_basic_auth: yes headers: Content-Type: "application/json" validate_certs: false register: result - name: Define a list of all hosts # ホストのリストのみを取り出す ansible.builtin.set_fact: host_list: "{{ result | community.general.json_query('json.results[*].name') | list }}" - name: Make a host list that should exist only. # 関連付けを解除したいホストのみを除外したリストを作成する ansible.builtin.set_fact: host_list: "{{ host_list | reject('search', REMOVED_HOSTNAME) }}" - name: Dissociate ec2 host from the "{{ GROUP_NAME }}" # 最後に、関連付けを解除したいホストが含まれないリストを渡す ansible.controller.group: controller_host: "{{ CONTROLLER_HOST }}" controller_username: "{{ CONTROLLER_USERNAME }}" controller_password: "{{ CONTROLLER_PASSWORD }}" controller_oauthtoken: "{{ CONTROLLER_OUTHTOKEN }}" inventory: "{{ INVENTORY_NAME }}" name: "{{ GROUP_NAME }}" hosts: "{{ host_list }}" state: present validate_certs: no preserve_existing_hosts: no もっと適切な書き方があるかもしれませんが、上記のタスクがサンプルになります。 まとめ 今回は、利用したい機能が Ansible モジュールに無い場合に工夫する方法の一例を紹介させていただきました。 少々複雑なプレイブックを書く必要も場合によっては出てきてしまうかもしれませんが、「適切なモジュールが無さそう...でもなんとかしなければ!」 という場合に、今回ご紹介した ansible.builtin.uri のような、汎用性の高いモジュールを活用すれば意外と何とかなるケースが多いかもしれません。 少しでもご参考になる情報になれていれば幸いです。
こんにちは、ソリューションアーキテクトの蒸野(ムシノ)です。 今回は、Red Hat Summit: Connect | Japan 2022でお話させていただきました「Application Manages Servicesの紹介」を今一度ご紹介させていただけたらと思います。 過去の記事でもRed Hat マネージサービスについては既に紹介させていただいていますので、 こちら をご覧ください。本記事では一部のマネージドサービスに特化した内容でご紹介をさせていただきたいと思います。 Red Hat ではマネージドサービスを推奨する理由として、次のように説明しています。 特に運用煩雑性からの開放と安定的なインテグレーション基盤を提供するためにマネージドサービスの選択肢を増やしています。 そして、Red Hat Cloud Services は次の3つに分類され「Managed OpenShift 」「Application Services」「Data Services」から構成されています。本記事ではこの「Application Services」にフォーカスして説明したいと思います。 Application Services それでは簡単ではありますが、Application Servicesである代表的な3つのサービス概要とバリューポイントご紹介いたします。 1. Red Hat OpenShift API Management (RHOAM) マネージドのOpenShiftで動作するホステッドかつマネージドのAPI管理サービスであり、APIファーストのアプローチにより顧客により早く価値を提供、それに関わる運用コストを削減します。 関連記事: rheb.hatenablog.com 2. Red Hat OpenShift Streams for Apache Kafka (RHOSAK) ストリーム処理アプリケーションのためのホステッドかつマネージドなKafkaのサービスであり、オンプレミスやハイブリッドクラウド環境にまたがるリアルタイムアプリケーションの開発に際しての運用コストの削減と複雑さの軽減を実現します。 関連記事: rheb.hatenablog.com 3. Red Hat OpenShift Connector (RHOC) Red Hat OpenShift Streams for Apache Kafkaと統合され、ホステッドかつマネージドですぐに利用可能なコネクターサービスとなります。ハイブリッドクラウド環境におけるシステム間の データストリーミングの複雑さを軽減し、Time to Marketまでの時間の短縮を実現します。 関連記事: rheb.hatenablog.com rheb.hatenablog.com Application Manages Services のユースケース 下記の例は代表的なシステムインテグレーション課題の一つであるレガシーシステムとのデータ統合に関するものです。レガシーシステムと新サービスをインテグレーションする場合どのようにすれば既存のシステムに影響を与えず、新サービス側ではクラウドネイティブなアーキテクチャを取り込みビジネスアジリティを実現するかという問題に直面している方も多いのではないでしょうか?今このようなケースで悩まれている事例が最も多く見受けられます。 このユースケースの解決方法として、Red Hat ではレガシーシステム側からCDCを使って変更データをイベントとして処理し、ニアリアルタイムなデータ連携を実現し、OpenShift Streams for Apache Kafka にてデータストリーミングする方法をご紹介させていただいております。これには上記でご紹介したマネージドサービスを組み合わすことで運用複雑性の軽減やセルフマネージドによるアジリティを活かしつつ、既存システム側に大きな影響を与えず新システム側にニアリアルタイムなデータ統合を実現することが可能となります。 インテグレーションデモのご紹介 それでは、実際このユースケースを実現するため、Application Servicesをどのように組み合わせていくのか、Red Hat Summit: Connect でのデモの一部をご紹介したいと思います。 下記はデモで示した仮のシステム構成図となっていますが、レガシーアプリケーションから「Red Hat OpenShift Connector」のCDCを使って「Red Hat OpenShift Streams for Apache Kafka」にイベントを通知、「Camel-K」を使ってイベントデータを変換し新データベースにデータを同期します。このデータベースの内容をバックエンドAPIが取得し、「Red Hat OpenShift API Management」がAPI公開します。 レガシーアプリケーションのデータ更新 このレガシーシステムは注文システムをイメージしています。注文データのCSVファイルを更新することでレガシーシステムにデータをロードし、レガシーシステムのデータベースを更新します。 ここでは、注文データがロードされていることを示しており、注文データが新規で10件入ったことを示しています。 Red Hat OpenShift Streams for Apache Kafkaでのイベントデータ確認 ではCDCによりイベントデータが連携されてきたところを確認したいと思います。 Red Hat OpenShift Streams for Apache Kafka でのKafka Instances>Topicタブをクリックするといくつかのトピックが表示されます。CDCによるイベントデータを見るには「shared-db-earth.dbo.Orders」をクリックします。 次に 「shared-db-earth.dbo.Orders」トピックのMessages タブをクリックするとCDCで連携されてきたイベントデータを参照することができます。更に詳細情報を確認したい場合には「Show more」をクリックします。そうすることでイベント情報の詳細を確認することができます。 Camel-Kによるデータ抽出 次にイベントデータにはメタデータを含め様々な情報が通知されてきますので、ここでは必要なデータのみを抽出します。 Camel-Kを使ってAtlasMapでデータマッピングを行い、別のトピックにデータを連携します。 Camel-Kでデータ変換したトピックの中身をみてみましょう。 先程「Red Hat OpenShift Streams for Apache Kafkaでのイベントデータ確認」で行った操作と同様の方法で「incoming-topic」を見てみます。 すると必要な「Order」データのみ通知されてきていることが分かります。 バックエンドAPIのデータ確認 次は、「incoming-topic」からPostgreSQLにデータがInsertされた結果、BackendAPIが Order データが表示できることを確認します。 バックエンドAPIのURLにアクセスしバックエンドAPIのデータを確認してみます。 問題なくBackendAPIがデータが表示されていますので「incoming-topic」からPostgreSQLにデータが連携されたことが確認できました。 これで Red Hat OpenShift API Management に統合する前準備がようやく完了しました。 Red Hat OpenShift API Management でのバックエンドAPIの統合 次に「Red Hat OpenShift API Management」にアクセスします。OpenShiftのコンソール上からトポロジを確認すると、下記にように Red Hat OpenShift API Management のコンポーネントが表示されているかと思います。 ActiveDoc によるAPI確認 では、最後に3scaleのコンソール上からAPIをテストしてみたいと思います。 3scaleでは管理ポータル上のActiveDocからAPIテストができますので、今回はこの上からAPIの動作確認をしてみたいと思います。 APIキーを設定し、「Try it out>Execute」を実行します。 問題がなければレスポンスとして200コードが返り、「Order」データが表示されることが見ることができます。 最後に 如何でしたでしょうか? インテグレーションデモを交えた、Application Manages Servicesのご紹介をさせていただきました。 Application Manages Services の始め方としては簡単で、Red Hat アカウントを作成後、Red Hat Hybrid Cloud Consoleにアクセスするだけです。 是非一度ご利用いただけたらと思います。 本記事のインテグレーションデモについては、下記のRed Hat Summit: Connect | Japan 2022(オンライン) からご覧頂けますので、是非ご登録いただけたらと思います。 www.redhat.com 参照: Developer SandboxでRed Hatアカウントを作成: developers.redhat.com Red Hat Hybrid Cloud Consoleへアクセス: console.redhat.com
レッドハットの杉村です。Ansible のテクニカルサポートをしています。 この記事は Ansible Advent Calendar 2022 の9日目の記事です。 adventar.org Ansible Automation Platform (AAP) は比較的足の速い製品で、頻繁に新しいリリースを出しています。リリース後およそ1年半でサポート終了 (End Of Life, EOL) となるため、いつもアップグレードをお願いしているという状態になっています。実際の問い合わせでもアップグレードについての問題が結構な数を占めます。 今回の記事では、新しいバージョンを使うと何がうれしいのか、古いバージョンを使い続けるとどのように困るのかということについてまとめてみました。 ライフサイクル AAP のライフサイクルはこちらのサイトにバージョンごとにまとめています。 access.redhat.com リリースから EOL まで、いくつかのフェーズを段階的に経るようになっています。 ソフトウェアの更新には大きく分けますと3つの種類がありまして、フェーズごとに対象のものが異なっています。 RHSA (Security) : セキュリティ問題 RHBA (Bug Fix) : 不具合 RHEA (Enhancement) : 機能改善 他の製品のライフサイクルについてはこちらのサイトから探してください。 access.redhat.com General availability リリース日です。この日を起点として、各フェーズが進んでいきます。カスタマーポータルからダウンロードできるようになった日です。 AAP のダウンロードはこちらです。カスタマーポータルのアカウントをお持ちであればダウンロードしていただけます。 https://access.redhat.com/downloads/content/480/ access.redhat.com Full Support Phase 半年程度はこのフェーズとして設定されます。 RHSA (Security) : セキュリティ問題 ... 全てが対象 RHBA (Bug Fix) : 不具合 ... 致命的で重大度の高い修正や、その他の修正できた不具合を提供 RHEA (Enhancement) : 機能改善 ... 利用可能になった機能改善の修正を提供 なお、機能改善要求は非常に多くの数を受けておりまして、開発リソースの制約などから優先度をつけて対応しています。主な指標としてはこのようなものがあります。 リクエストの数 実装の難易度 他の回避方法や実現方法の有無 ビジネスの重大度 社内のエンジニアリングチームが実装するものだけでなく、Upstream プロジェクトで OSS として開発されたものが取り込まれることも日常的に行われています。 Maintenance Support 1 Phase リリースから半年ほど経過してこのフェーズになりますと、修正が提供される範囲が少々狭まります。 重大な不具合であっても致命的ではないものや、機能改善についての修正は原則として提供されません。 Maintenance Support 2 Phase リリースから1年が経過しますとこのフェーズになります。基本的にはセキュリティ問題の修正のみを提供します。 End Of Life Maintenance Support 2 が終了しますと、End Of Life (EOL) となります。一切の修正は提供されません。 サブスクリプションをご契約いただいている間はカスタマーポータルからドキュメントを検索したり製品ドキュメントをご参照いただくことはできますが、テクニカルサポートからの案内としてはサポートできるバージョンにアップグレードするようお願いすることのみとなります。 このように1年から1年半ほどでほとんど修正もされなくなりその後はほとんど何もお手伝いできなくなりますので、もしアップグレードを適用するために半年以上の計画が必要なことがありましたら、常時準備していただくくらいに構えておくことをお勧めします。 サポートエンジニア側としても EOL となった製品については教育を行っていないことがあるため、問い合わせされましても期待されるような回答が得られない場合があります。 AAP の構成要素 AAP は昔の印象ですと Ansible Tower + Ansible Engine と捉えていらっしゃる方が多いように思いますが、現在は多くのプロダクトから構成されています。 下記に掲載するもの以外にも、ここでは触れていないものもあります。 Ansible automation controller Upstream の AWX を元にしています。昔は Ansible Tower と呼ばれていたものです。 AWX のリリースと controller のリリースは同期しておらずソースコードも別々に管理しているため、AWX の修正がいつ controller に入っているのかというお問い合わせに回答することが難しいことがあります。 github.com また、AWX は Kubernetes 環境で動作するようになっていますが、controller はコンテナ実行環境の OpenShift に加えて、RHEL でも動作させることができるという違いがあります。 controller の機能もさらに分割して役割別(hybrid, hop, execution)に構成を分けることができるのですが、今回の記事では触れません。そのような Automation Mesh の機能を提供する receptor についてはリンクだけ紹介しておきます。 github.com Execution Environments Ansible Core を含む実行環境です。以前の Ansible Engine に相当します。 Upstream のリポジトリはこちらです。AWX とは異なり、Ansible Core の部分については製品として配布しているものと大きな違いはありません。 github.com Execution Environments (EE) は Podman のコンテナイメージとなっていて、Ansible Core 以外にもさまざまなものがインストールされています。コンテナイメージとして固まっていることで、Ansible の処理を行うための雑多な環境構築作業から解放されて playbook などを書くことに専念できるようになっています。AAP 2.3 では主にこれらのパッケージがインストールされています。 RHEL 8.7 ベース Python 3.9.13 Ansible Core 2.14.0 Ansible Runner 2.3.0 https://github.com/ansible/ansible-runner Ansible Lint 6.8.2 https://github.com/ansible/ansible-lint Ansible Sign 0.1.1 https://github.com/ansible/ansible-sign サポートする Ansible Collections やそのために必要な Python のライブラリ Ansible Navigator EE のコンテナイメージを使って playbook などを実行するためのコマンドラインツールです。 昔は ansible-playbook コマンドで実行することがよくありましたが、実行のために必要な構成が複雑になったことにより、コマンドラインからはこの ansible-navigator を使って実行することを主に案内しています。 Upstream はこちらです。 github.com Ansible Builder 提供している EE では機能が足りない場合や、特別な設定を入れてカスタマイズしたい場合などに使うツールです。作成した EE は controller に登録して使うこともできます。 Upstream はこちらです。 github.com Private Automation Hub collections や EE を格納するためのリポジトリを提供します。これらの Upstream プロジェクトが元となっています。 pulp https://github.com/pulp/pulpcore galaxy_ng https://github.com/ansible/galaxy_ng ansible-hub-ui https://github.com/ansible/ansible-hub-ui pulp_container https://github.com/pulp/pulp_container pulp_ansible https://github.com/pulp/pulp_ansible Red Hat Hybrid Cloud Console 上で稼働する SaaS console.redhat.com インターネットに接続されている環境で controller をお使いであれば、SaaS で提供している機能もご利用いただけます。 Automation Hub Automation Analytics Red Hat Insights との連携 機能差分の追いかけ方 世界的なイベントとして Ansible Fest を毎年開催しておりまして、新しいバージョンがこのイベントに合わせて出てくることが多いです。 www.ansible.com Upstream の各プロジェクトに詳しい方の中には「そろそろこんな機能が出そうだ」ということがわかってしまう方もいらっしゃるかもしれませんが、イベントのために計画しているようなものの場合は特に、言いたくても言えないことがあったりします。 実際に AAP としてのリリースが出ますと、 ブログ として掲載されることが多いようです。AAP 2.3 のときはこの記事などがありました。 www.ansible.com automation controller や Ansible Core の機能をお使いの方がほとんどだと思いますので、普段追いかけるときにはリリースノートを追っていくのがわかりやすいです。 automation controller はこちらです。 docs.ansible.com Ansible Core はブランチごとになっていまして、例えば 2.14 ですとこちらです。以前のバージョンを確認したいときは、changelogs/ のディレクトリでブランチを切り替えて CHANGELOG-vX.Y.rst のファイル名になっているものを参照してください。 github.com Changelog 以外にも porting guides としてまとまっているドキュメントがありまして、新しいバージョンを使うときの互換性について気になる方はこちらのほうが便利なことがあります。バージョン番号の付け方が Ansible と Ansible Core で混乱することがありますが、いろいろな事情でこのようになっています。 docs.ansible.com まとめ 今回は AAP の構成やライフサイクルなどについて紹介しました。 新しいリリースが頻繁に出るものでサポートする側としても大変ではあるのですが、特に大規模なユースケースでお使いの方には効果的な機能が多く追加されている傾向にありますので、ご活用いただけましたらと思います。 Ansible Automation Platform の評価ライセンスリクエストはこちらからご利用いただけます。60日間利用できます。 www.redhat.com Happy Automation!
レッドハット入社後 Kubernetes Lover を謳い続けて早3年。通称 fmfm (フミフミ, RH社内限定の通称)です。 今日はなんの日? #KubeCon で国際オフ会 at 10月 #CNDT で国内オフ会 at 11月 #KubeDay でミックスオフ会 at 12月 2022/4Qはめちゃ盛んなオフ会シーズン🥳 https://t.co/6MwuRbNgkc — Kazu@capsmalt (@capsmalt) 2022年12月7日 そう、KubeDay Japanですね!ついにミニKubeConが日本開催されました(たぶん) オフ会シーズン到来してる今日このごろですが、この記事は、 OpenShift Advent Calendar 2022 の7日目 です。 \CNDT2022(11/18, 11/21-22)、皆さん参加されましたか?/ event.cloudnativedays.jp CNDT(CloudNative Days Tokyo) について流行りの ChatGPT に聞いてみました。 ※ちなみに私自身はCND(CloudNative Days)実行委員としてイベントの企画・運営に長らく携わっております。 本記事では、コロナが流行り始めた2020年以降のCNDイベントで登場した「OpenShiftの話、赤帽エンジニアが登壇している話、関連するセッション」について紹介したいと思います。 CNDT 2022 〜 現地・オンラインの同時ハイブリッド開催 CNDT 2021 〜 オンライン開催 CND CI/CD Conference 2021 〜 オンライン開催 CNDO 2021 〜 オンライン開催 CNDT 2020 〜 オンライン開催 まとめ ポエム お知らせ すべてのセッションがアーカイブ視聴できます。 これだけあれば年末年始も楽しめそうですね! そして最後に、個人的な所感(ポエム)を勝手に述べます。 素晴らしいセッションを多数紹介していた結果・・・、リンク集になってしまったorz CNDT 2022 〜 現地・オンラインの同時ハイブリッド開催 Co-located Handson: 『Red Hat OpenShiftを活用してクラウドネイティブな開発を体験してみよう(中級編)+ 超初心者編』 event.cloudnativedays.jp openshift.connpass.com イベント本編: Kubernetes クラスタ管理からの開放 〜 アプリケーション開発を加速 event.cloudnativedays.jp 【既存アプリをコンテナ化したいのじゃが】-Kubernetesへリフトする開発者が乗り越える壁- event.cloudnativedays.jp CNDT 2021 〜 オンライン開催 Co-located Handson: 『Red Hat OpenShiftを活用してクラウドネイティブな開発を体験してみよう(中級編)』 event.cloudnativedays.jp openshift.connpass.com イベント本編: Mableの高速開発を支えるプラットフォーム event.cloudnativedays.jp Cloud Native Adoption Journey event.cloudnativedays.jp COSI (Container Object Storage Interface) で広がる永続ストレージの世界 event.cloudnativedays.jp CND CI/CD Conference 2021 〜 オンライン開催 Co-located Handson: 『Kubernetes で始める GitOps の基礎について』 event.cloudnativedays.jp CNDO 2021 〜 オンライン開催 イベント本編: Edge Cloud Vision event.cloudnativedays.jp NGINX Ingress Operator・OpenShift環境でNGINXを活用 / OperatorでKubernetesを気軽に拡張する event.cloudnativedays.jp QuarkusでJavaのコンテナを最適してOpenShiftで動かしちゃおう event.cloudnativedays.jp 5分でキメる "Kubernetes Operator 完全に理解した" event.cloudnativedays.jp とある新入社員と学ぶOperator開発 event.cloudnativedays.jp Operator SDKを用いた具体的なOperatorの作り方について event.cloudnativedays.jp Azure のマネージドなOpenShift サービス – ARO の運用のコツ event.cloudnativedays.jp CNDT 2020 〜 オンライン開催 イベント本編: "Kubernetesクラスターを切り替えてください" のオモテウラ event.cloudnativedays.jp そーいうことね。Operator Lifecycle Manager完全に理解した。 event.cloudnativedays.jp まとめ 今回はセッション関係の一部を抜粋しました。でも実は、レッドハットは、2018年の初代Japan Container Days(旧CNDT)発足から5年間、コミュニティとしてはもちろんのこと、スポンサーとしてもずっとクラウドネイティブ促進を願って注力していました。 CNDイベントに限らず、様々なステージで OpenShift/Kubernetes や クラウドネイティブテクノロジーを楽しんでる方の話が聴けるのは嬉しいことです。持ちネタのある方はぜひ! わたし( @capsmalt )宛に相談頂ければ(たぶん懇切丁寧に)寄り添います xD ポエム ところで Kubernetesっていつホットになったんでしたっけ? とっくに枯れているはずの "Kubernetes"。でも実際には一筋縄ではいかない現在進行系。 様々なナレッジを惜しみなく共有する場、そしてフィードバックを得られることはとても大切だと感じています。一般参加者側に居た人・企業が、次のタイミングではアウトプットする側に立っている。今後もこのループを回しながら新しい風を吹かし続けられる流れを整えていきたいところです。 コントリビュートのやり方は多種多様あると思います。 オープンソースへの技術的なコミット 組織的なコミット 実際に活用できるようにするための裏方のコミット 他 アップストリーム最先端にいる上級者との共闘している人、これから始めようとしている個人や企業に対して底上げすることに注力している人、書籍を執筆したりトレーニングコンテンツを提供し続けている人、海外の先駆者の知恵をローカライズしている人、新時代を築くことに試行錯誤している人、ほんの少し見渡すだけでもあらゆるレイヤーで頑張っている人たちの顔が浮かびます。 2023年も、数多のOpenShiftユーザー、Kuberbetes Lover とお会いできることを楽しみにしています! お知らせ さいごに・・・、 Save the date!!! 27th Jan ==> "OpenShift.Run 2023" まだOpenShift User Groupに入って無い人はぜひJOINくださいませ! openshift.connpass.com by 斎藤和史 Kazu @capsmalt
こんにちは、ISVパートナー担当SAの森須です。 今回は前回のPreflightに続きオペレーター認定の取得プロセスについてご紹介します。 プロダクトオーナーにとってコンテナを販売する時の課題の 1 つは、提供しているコンテナ化されたソフトウェア [オペレータ] がエンタープライズ グレードであることを顧客に認識してもらうことです。この問題を解決するために、Red Hat はOperator 認定パイプラインを提供しています。 認定のメリットは? 汎用性の高いコンテナー開発 - UBI を使用して、一度ビルドすれば、安全かつ効果的にどこにでもデプロイできます。 ハイブリッド クラウドとクラウド プロバイダー間での移植性 - クラウド プロバイダーの選択に関するロックインはありません。 セキュリティを確保するための継続的な監視 - 新しい脆弱性や既知の脆弱性を通知します - Red Hat Build Service はイメージを自動的に更新および公開します。 Red Hat によるより優れたグローバル カスタマー サポート - TSANet を利用し、Red Hat とパートナーによるエンタープライズ サポートを提供します。 市場認知度の向上 - Red Hat のソフトウェア カタログでソフトウェアを公開します。 オペレーター認定取得の前提条件: OpenShift / Kubernetes および OpenShift パイプラインに関する実用的な知識 - https://developers.redhat.com/learn/openshift OpenShift クラスター コンテナ認証ワークフローの概要 コンテナ認証ワークフローは複数のステージがあります。このブログ投稿では、「認定のオンボーディング」セクションで以下のステージについて説明します。 ステージ 1: Red Hat Connect でテクノロジー パートナーとして登録する ステージ 2: OpenShift コンテナー プロジェクトの作成 ステージ 3: 認定前チェックリストを完了する 認定オンボーディング Step1: 必要なすべてのクライアント ツールをインストールする Git - https://github.com/git-guides/install-git Tekton - https://tekton.dev/docs/cli/ OpenShift クライアント - https://docs.openshift.com/container-platform/4.10/cli_reference/openshift_cli/getting-started-cli.html Step2: テクノロジーパートナーとしてRed Hat Partner Connectに参加する 参照: https://connect.redhat.com/login Step3: プロジェクトを作成し、プロジェクト ID を取得します。パートナー ポータル > 製品認定 > 認定プロジェクトの管理 Step4: 「プロジェクトの作成」をクリック Step5: 「Red Hat OpenShift」を選択 Step6: 「operator Bundle image」を選択 Step7: プロジェクト名を入力し、要件に基づいて公開オプションを選択します Step8: ospid の詳細をコピーします。この例では「635779f4f8899ec0b039cc75」です。パイプラインを実行するときに、この情報が必要になります。 Step9: 「認定前チェックリスト」に記入します。必要な情報を入力すると、チェックリストは次のようになります。 Step10: 次に、Operator バンドルをテストするには、API キーが必要です。Partner Connect ポータル > 製品認定 > コンテナー API キーにログインします。 Step11: 「新しいキーの生成」をクリックします Step12: キー名を入力し、[生成] をクリックします。 Step13: API キーを保存します。 これで、オンボーディングの 3 つのステージがすべて完了しました。 次のステージについてはパート 2 で説明します。
Red Hatの小島です。 OpenShift Advent Calendar 2022 の4日目の記事として、Managed OpenShiftサービスのワークショップコンテンツをご紹介します。 Managed OpenShiftサービスとは Managed OpenShiftサービスのワークショップコンテンツ Managed OpenShiftサービスとは Red Hatがクラウドプロバイダーのパートナーと連携して提供するサービスです。セルフマネージドのOpenShift環境とは異なり、OpenShiftおよびOpenShiftがベースとしているKubernetes環境に必要となるハードウェア/ネットワーク/ストレージ/OSの運用や構築を、Red Hatとクラウドパートナーが肩代わりします。Managed OpenShiftサービスには、Red HatのSRE(Site Reliability Engineering)チームが大きく関わっているものがあり、それらの中には、従量課金系のOpenShiftクラウドサービスとしてRed Hat OpenShift Service on AWS (ROSA)や、Azure Red Hat OpenShift(ARO)があります。 www.redhat.com ROSAやAROといったManaged OpenShiftサービスには利用者との責任分担マトリクスが定義されており、利用者は主に次の項目の管理を担当します。 ユーザー管理 (外部の認証プロバイダとの連携設定) ユーザーアプリケーションの開発/運用/ロギング/データ管理 クラウド環境のストレージ/ネットワークを利用するための設定 OpenShiftでのストレージクラスの設定やクラウド環境のプライベートネットワークの設定 ユーザーコンテナを実行するコンピュートノードの使用率監視 コンピュートノードの追加/削除/ラベル付加の実行指示 OpenShiftクラスターのアップグレードの実行指示 アップグレード失敗時の復旧作業は、Red Hatやクラウドプロバイダーが担当 問題調査に伴うプラットフォーム監査ログ(audit.log)の要求 OpenShiftクラスタやクラウド基盤のロギングは、Red Hatやクラウドプロバイダーが担当。利用者の要求に応じて、Red Hatやクラウドプロバイダーが、利用者に監査ログを随時提供。 Managed OpenShiftサービスでは、OpenShiftクラスターのロギング/モニタリング、障害対応や復旧作業、キャパシティ管理、コントローラーノード/コンピュートノードの運用保守、クラウド環境のストレージやネットワーク払い出しなどについては、Red HatのSREチームやクラウドプロバイダーが担当します。それにより、利用者がアプリケーションの開発や運用に集中できるようにしています。 Managed OpenShiftサービスでは、Red Hatやクラウドプロバイダーによってサービス仕様が定義されており、 サービス仕様に関わるようなOpenShiftやクラウド環境の各種設定については、利用者が変更することをサポートしていません。 具体的に言うと、 コンピュートノードの設定変更 やOpenShiftのcluster-admin権限(OpenShiftクラスターのスーパーユーザー権限)でできること( kube-* , openshift-* プロジェクトにあるOpenShiftコアコンポーネントの変更など)、などが実施できないまたはサポートされないようになっています。サービスの基盤部分をカスタマイズして利用したい場合は、セルフマネージド形態のOpenShift環境の利用を推奨しています。 こうした特徴を持つManaged OpenShiftサービスは、特に コンテナアプリケーションの開発/デプロイが可能な環境を、セルフサービスで作成して利用することに興味があるアプリケーション開発/運用チーム 向けのサービスであると言えます。 Managed OpenShiftサービスのワークショップコンテンツ Red HatのSREチームが大きく関わっているROSAやAROについては、有償サービスを利用可能なAWS/Azureアカウントがあれば、すぐに試してみることができます。試すにいたり、アプリケーション開発/運用チーム視点で意識すべき内容をまとめたコンテンツをWeb上で公開していますので、これらを参考にしてみてください。ROSA/AROについて、どのようなサービス仕様が定義されているか、どのような利用イメージになるか、が分かる内容になっています。 h-kojima.github.io h-kojima.github.io 上記のワークショップコンテンツについては、Red Hatのパートナー様向けの技術情報習得を支援するための「Red Hat Partner Enablement Japan」でも、ハンズオン付きのワークショップとして定期的に実施しています。こちらではOpenShiftだけでなく、Red Hatの様々な情報を取り扱っていますのでチェックしてみてください。 redhat-open.connpass.com また、このハンズオン付きワークショップについては、ご要望次第で個社向けにも開催しています。ご興味がありましたら、Red Hatの担当営業や下記のフォーム(「追加情報」記入欄に、「赤帽ブログで見た個社向けROSA/AROワークショップについての詳細を希望」などをご記入ください)からお問い合わせください。 www.redhat.com
こんにちは、Red Hat の Middleware Technical Account Manager のイアンです。 最近、 Redis データベースの append-only file を解析する機会がありまして、独自の解析ツールを作るまでの道のりを説明いたします。 TLDR : Redisのソースを元にして、当初分からなかったファイル形式の解析ツールを作りました。ツールは https://github.com/yasny/redis-aof-parser で公開しました。 Append-only fileとは Redis データベースは、設定によってすべての書き込みコマンドを append-only file (以降 AOF ) に保存しています。 障害やデータベースの破損が発生した場合は、当ファイルのコマンドを再読込すると、障害直前までのデータベース状態に戻すことができます。 簡単な説明でしたので、Redisのバックアップや永続性の詳細は、マニュアルの Redis persistence をご参照ください。 解析に向けて まずは、私はAOFファイルの構成が全く分かりませんでしたので、誰かが解析方法を既に出しているかをGoogle先生に聞きました。 いくつかの記事やツールがありましたが、どれも自分が持っていたAOFファイルを解析できませんでした。 自分のファイルが何か変わったようです。 そのため、Pythonで独自のツールを作ることにしました。 Redisのソースへ 解析するために他のツールに頼れないことが分かりましたので、Redis のソースを見に行きます。 これはオープンソースの強みですね。 AOF構成の理解へのはじめの一歩 Redis 5を使っていましたので、GitHub上の ソース を見つけ、AOF関連の関数などを探し始めました。 そこで、 aof.c の loadAppendOnlyFile() を発見しました。 関数を読みながら、以下の処理が見つかりました。 /* Check if this AOF file has an RDB preamble. In that case we need to * load the RDB file and later continue loading the AOF tail. */ char sig[ 5 ]; /* "REDIS" */ if ( fread (sig, 1 , 5 ,fp) != 5 || memcmp (sig, "REDIS" , 5 ) != 0 ) { /* No RDB preamble, seek back at 0 offset. */ if ( fseek (fp, 0 , SEEK_SET ) == - 1 ) goto readerr; } else { /* RDB preamble. Pass loading the RDB functions. */ rio rdb; serverLog (LL_NOTICE, "Reading RDB preamble from AOF file..." ); if ( fseek (fp, 0 , SEEK_SET ) == - 1 ) goto readerr; rioInitWithFile (&rdb,fp); if ( rdbLoadRio (&rdb, NULL , 1 ) != C_OK) { serverLog (LL_WARNING, "Error reading the RDB preamble of the AOF file, AOF loading aborted" ); goto readerr; } else { serverLog (LL_NOTICE, "Reading the remaining AOF tail..." ); } } この処理は、AOFファイルの頭に REDIS という文字列があれば、"RDB preamble"を読み込みます。 なるほどです! 持っていたファイルを確認したら、確かに REDIS が書いてありました! "RDB preamble" というバイナリデータがあったから、他のツールが読み込めなかった原因が分かりました。 "RDB preamble" を飛ばせば、通常のAOFファイルを解析できると考えましたが、AOFファイル自体と同様に"RDB preamble" の構造が全く分かりませんでした。 次は、 rdbLoadRio() を確認しました。 絶望 rdbLoadRio() はデータを読みながら、opcodeによって、読み込み処理が変わります。 RDB preambleを最後まで正しく読み込むためには、すべてのopcodeの読み込み処理を実装する必要があったみたいです。 AOFファイルだけを解析したいのに、Redisデータベース読み込む処理をPythonで実装しようとすると、かなり大事になり、本当に意味あるかと思い始めました。 絶望に落ちました。。。 ひらめき まだ諦めない! loadAppendOnlyFile() に戻って、RDB preambleがなかった場合の処理を確認しました。 /* Read the actual AOF file, in REPL format, command by command. */ while ( 1 ) { int argc, j; unsigned long len; robj **argv; char buf[ 128 ]; ... if (buf[ 0 ] != '*' ) goto fmterr; if (buf[ 1 ] == '\0' ) goto readerr; argc = atoi (buf+ 1 ); if (argc < 1 ) goto fmterr; ... おや?RDB preambleの後、 * の文字がないと fmterr に飛び、異常終了します。 * があれば、その後に数字があるはずです。 argc という変数名から、数字はRedisコマンドの引数として使用されていることが分かりました。 処理は続きました。 for (j = 0 ; j < argc; j++) { /* Parse the argument len. */ char *readres = fgets (buf, sizeof (buf),fp); if (readres == NULL || buf[ 0 ] != '$' ) { fakeClient->argc = j; /* Free up to j-1. */ freeFakeClientArgv (fakeClient); if (readres == NULL ) goto readerr; else goto fmterr; } len = strtol (buf+ 1 , NULL , 10 ); ... argc 分のループを回し、データを読み込んでいます。 また、最初に $ の文字がないと、エラーになります。 確かに、自分のファイルには以下のようなデータがありました。 <RDB preamble>*2\r\n$6\r\nSELECT\r\n... 最初の * を検索すれば、RDB preambleを飛ばせるかと思いましたが、RDB preambleには * が普通に出ていました。 残念でした。 次は、 \r\n は改行ですので、 * または $ から始まる最初の 行 を検索すれば、preambleを飛ばせるのではないかと推測しました。 $ から始まる行を最初に見つけたら、その位置から * を見つけるまで 逆読み する必要がありますが、これはRDB preamble自体を解析することよりよっぽど楽です。 解析ツールの実装 AOFの構成が分かりましたので、Pythonで実装してみました。 処理の内容を以下のコードの中にコメントいたします。 まずは、 loadAppendOnlyFile() を真似して実装しました。 with open ( "appendonly.aof" , 'rb' ) as f: signature = f.read( 5 ) if signature == bytes ( 'REDIS' , 'utf-8' ): # RDB preamble を見つけたので、飛ばす skip_rdb_preamble(f) else : # RDB preamble がなかったので、ファイル位置を0にリセットする f.seek( 0 ) argc = 0 while True : line = f.readline().decode( 'utf-8' ) if not line: break if not line.startswith( '*' ): raise IOError (f 'AOF file format error at byte {f.tell()}' ) argc = int (line[ 1 :]) if argc < 1 : raise IOError ( 'AOF file format error' ) # 1つコマンドは argc 分の行に跨がるが、各行の間に$<number>の行があるから、argc * 2 分回のループを回す command = list () for _ in range (argc * 2 ): cmd = f.readline().decode( 'utf-8' ) if cmd.startswith( '$' ): continue command.append(cmd.strip( ' \r\n ' )) if command: # commandがあったら、スペース区切りで画面に出力する print ( " " .join(command)) その後、 skip_rdb_preamble() の関数を書きました。 def skip_rdb_preamble (rdb): rdb.seek( 0 ) buffer = rdb.read( 9 ) if buffer [ 0 : 5 ] != bytes ( 'REDIS' , 'utf-8' ): raise IOError ( 'Wrong signature' ) for line in rdb: if line[ 0 ] == ord ( '$' ) or line[ 0 ] == ord ( '*' ): break if line[ 0 ] == ord ( '$' ): # $ を見つけましたので、lineの先頭位置から1バイト単位で逆読みし、*を探す rdb.seek(rdb.tell() - len (line) - 1 ) check = rdb.read( 1 ) while check[ 0 ] != ord ( '*' ): rdb.seek(rdb.tell() - 2 ) check = rdb.read( 1 ) # ファイル読み込み位置を*の前に設定する rdb.seek(rdb.tell() - 1 ) Pythonツールができ、AOFファイルで実行したら以下のように各コマンドが1行ずつに出ました! $ ./parse-redis-aof.py SELECT 1 MULTI incrby stat:processed 0 ... まとめ 知らないファイル形式の解析は中々いい勉強になります。 他の人が書いたコードを読みながら、自分のコードに落とすスキルも向上できます。 作った解析ツールは https://github.com/yasny/redis-aof-parser に公開しました。 AOFファイルの解析の機会があれば、使ってみてください。
お久しぶりです。レッドハットでクラウドインフラを生業にしている宇都宮です。 さてこれは OpenShift Advent Calendar 2022 の5日目の記事なのですが、名だたる超人達がディープな記事を書いているので、それはそちらにおまかせして、僕は相当どうでもいいネタをダラダラと書きます。 OpenShift は何でもつ? 伊勢は津でもつ 津は伊勢でもつ 尾張名古屋は城でもつ  超有名な言い回しがありますが、これを見て私はこう思う。それでは、OpenShift は何でもつ? OpenShift は Kubernetes でもつ。 うん、そうだ。間違いない。が、そういうことじゃない。あと語呂が悪い。 OpenShift は Operator でもつ。 おお、これはかなり核心を突いている。これでいいじゃないかと思えるくらいだ。でもやっぱり語呂が悪い。 生来のへそ曲がりなうつぼは変化球を投げたい。色々考えた結果、あえて私はこう叫びたい。 OpenShift は GUI でもつ OpenShift の GUI のよさ OpenShift の GUI は OpenShift Web Console と呼ばれるものですが、これが素晴らしい。 まず、日本語表示が選べる。この手のソフトウェアで日本語 GUI があるのは相当レアです。たぶんレアだと思う。レアなんじゃないかな。まちょっと覚悟はしておけ? しかも中国語や韓国語も選べて、英語も入れると4ヵ国語も話せる。珍しいと思ってハングルも読めないのに韓国語に変えてしまう、そして言語設定の画面に戻れなくて焦る、という経験は皆さんも頷かれると思います。 そして管理者画面と開発者画面があることは、OpenShift な諸兄姉はご存知でしょう。 管理者画面では、ユーザの権限によって表示されるメニューがダイナミックに変わるのは当たり前。 Deployment などのリソースを YAML だけでなくウィザード的な画面を使って作ることもできます。 開発者画面では、アプリソースコードからコンテナイメージをビルドし、それをデプロイするまでを GUI だけで設定できます。デプロイしたアプリのトポロジーをビジュアルに表示できる機能もあります。 今紹介した素晴らしさは Web Console のメジャーな面です。しかし私はこんなメジャーなことを紹介するために記事を書く男ではない。 今日私が紹介したいのはここ。 ここって何て呼ぶんでしょうかね。ヘッダー? 正直、Web Consoleでも頻繁に触らない部分と言えます。しかしここには面白い秘密が隠されているので、今日はそれを順番に簡単に紹介していきます。 OpenShift Web Console の上のメニュー ハンバーガーボタン(三本線のやつ) はい、まずは左端の三本線のアイコンです。ハンバーガーボタンとかハンバーガーアイコンとか呼ぶそうなので、こう呼ぶとそこはかとなくプロっぽい感じが出せます。 これは単純に、左側のメニューを出したり隠したりするだけのボタンです。 モニター全画面で表示するときは別に隠さなくてもいいんだけど、モニター左半分にGUI、右半分にターミナルとか両方開いておきたい場合に使ったりします。 ここはこれ以上言うこともないので次へ。 ロゴ 次にロゴです。ここには "Red Hat OpenShift" とか "Red Hat OpenShift Service on AWS" とか、プラットフォームごとに違うロゴが表示されてます。 実はこのロゴ、好きなものにカスタマイズできるんですよ。知ってました? ちょっとやってみましょうか。例えば、冒頭のいらすとやさんの画像に変えてみましょう。 まずは変更先の画像を ConfigMap として up します。GUI の紹介の記事で CLI でやるのは悔しい気持ちもあるんですが、CLI でやるほうが話早いので、CLI でやります(おい) $ ll total 376 -rwxr-xr-x. 1 lab-user users 381226 Dec 1 08:56 text_animals_ogenki.png $ oc create configmap console-custom-logo --from-file ./text_animals_ogenki.png -n openshift-config configmap/console-custom-logo created あとはデフォルトで作られてる consoles.operator.openshift.io カスタムリソースを変更していきます。ここは GUI でも構いません。 管理者画面で、 管理 (Administration) > クラスター設定 (Cluster Settings) > 設定 (Configuration) > Console; operator.openshift.io と行って、YAML で次のように spec.customization. 以下を追記してセーブ。 customProductName の部分は自由で、ブラウザのタブの部分に表示されます。 spec: customization: customLogoFile: key: text_animals_ogenki.png name: console-custom-logo customProductName: OGENKI Logo oc edit コマンドや oc patch コマンドを使ってももちろんOK。 後は openshift-console Operator が自動的に Pod を作り直すので2,3分待って画面をリロードすると、 とこんな感じになります。 誰得だよこれ?と思うかもですが、例えば外販事業として Kubernetes as a Service 的なサービスを提供したいユーザーさんが、Web Console は使いたいけど自前のロゴを表示したい、という場合に便利ですね。 ちなみにここの画像の大きさは高さ 60px が最大です。それより大きな画像は、アスペクト比固定で高さ 60px に縮小されます。 ベントーメニュー(ルービックキューブみたいなやつ) 次に9個のドットが並んだルービックキューブみたいなアイコンです。お弁当みたいだからベントーメニューとか呼ばれるらしい、1800円くらいするちょっとええ弁当やね。 ここにはいろんなリンクが表示されます。 OpenShift Container Platform だとデフォルトで OpenShift Cluster Manager での当該クラスタのページと、 Red Hat Hybrid Cloud Console のリンクが表示されてます。 OpenShift でインストールする Operator によっては、別の GUI のページが用意されるものがあります。 そういう GUI のページへのリンクが、Operator インストールと同時に自動的にここに追加されることもあります。 例えば、OpenShift GitOps Operator をインストールすると、Argo CD の GUI へのリンクが追加されます。 このリンクのエントリーは、 ConsoleLink というカスタムリソースで管理されてます。ゆえに、このカスタムリソースを作ってやれば、自由にリンクを追加することができます。 試しにこの赤帽エンジニアブログのリンクを追加してみましょう。 管理者画面で、 管理 (Administration) > カスタムリソース定義 (CustomResourceDefinitions) > ConsoleLink > インスタンス(Instance) > コンソールのリンクの作成(Create ConsoleLink) と行って、次のようにYAMLを書いて作成ボタンを押す。 apiVersion: console.openshift.io/v1 kind: ConsoleLink metadata: name: rheb spec: applicationMenu: imageURL: https://cdn.profile-image.st-hatena.com/users/rheb/profile.gif?1538617339 section: 参考になるサイト達 href: 'https://rheb.hatenablog.com/' location: ApplicationMenu text: 赤帽エンジニアブログ そうすると、次のようにリンクが追加されます。 localtion の部分に "ApplicationMenu" を選ぶとこのベントーメニューに追加されますが、他にも "HelpMenu" や "UserMenu" など、別のところにリンクを表示されることもできます。 通知 お次はベルのアイコンです。ここには OpenShift Monitoring のアラートルールに引っ掛かって Firing 状態のアラートが表示されます。 これは OpenShift Monitoring の View 権限があるユーザーにのみ表示されます。 アラートの Severity に合わせて、"重大なアラート(Critical Alerts)"、"他のアラート(Other Alerts)"、"推奨事項(Recommendations)" と分けて表示されます。 ベルの横には、"重大なアラート(Critical Alerts)" と "他のアラート(Other Alerts)" の合計数が表示されます。 ネジ頭みたいなやつ ネジ頭みたいなプラスのアイコン、これが私の超多用する便利機能です。この記事はここだけ覚えてもらえば8000点。 これを押すと、YAMLを直に書いてリソースを作れる画面に行きます。 よくありますよね、githubとかで見つけたYAMLをパクりたい時。 そういう時、CLI で curl とか wget とかでファイルダウンロードしてませんか? もしくはブラウザでコピーしてvimとかemacsとかにペーストとかしていませんか?ヒアドキュメントでやってませんか? 今日からは、ブラウザでYAMLをコピーしたら、そのまま Web Console にペースト!よしなに編集したらボタン押して以上終わり! いやもちろんね、CLI でやるのが悪いとは言いませんよ。マニフェストはファイルとして保管しないといけないルールとかもあるでしょうし、そういう場合は話は別です。 ただ、単純にYAMLをコピーしてそのまま oc create/apply したいケースって割とあると思うんです。その場合は、このネジ頭を使ってやると話が早いです。 ヘルプ 次はハテナマークで、シンプルにこれはヘルプです。OpenShift のドキュメントやサポートケースなどへのリンクが表示されています。 CLIツールのダウンロード先にもここから行けます。 oc だけでなく helm とか odo とかもダウンロードできるので、開発者の人が自身の端末にこれらの CLI をインストールしたいときに便利です。 ちなみに、前述の ConsoleLink で location に "HelpMenu" を指定すると、ここにリンクが作られます。 ユーザー 最後はユーザーメニューです。ここは結構触ったことがある諸兄姉も多いのではないでしょうか。 "ログインコマンドのコピー"と書いているけど、実質的には API トークンの発行ですね。 発行されたトークンを含めて、CLI で oc login する時のワンライナーや、直接 curl で叩くコマンドが表示されます。 "ユーザー設定"は、言語とか表示系のいろんな設定ができます。 まとめ さて、ためになるようなならないような話をダラダラしてきましたが、OpenShift の GUI のマイナーな部分について紹介しました。 クラウドネイティブ界隈では、CLI をバリバリ叩けるのが必要不可欠~みたいに思われる人もいらっしゃるかもしれません。 どうしても GUI は操作履歴を残すのが CLI より大変なので、CLI 指向になるのは仕方ないところかなと思います。 ですが、OpenShift は GUI が結構イケます。GUI のいいところは、間違えないところと結果的に早いところかなと思います。 例えば、私も常々お世話になっている OperatorHub。CLI で OperatorGroup や Subscription といったカスタムリソースを作って Operator をインストールするのも悪くないですが、GUI が使えるならそのほうがまず syntax を間違えないし、その結果早いです。 OpenShift Data Foundation のように、結構多くのカスタムリソースを作るソフトウェアでも、GUI でウィザードがあると誰でも簡単に間違いなく構成できるようになります。 そういうわけで、みんなもっと OpenShift の GUI を使いましょう。 伊勢は津でもつ 津は伊勢でもつ  OpenShift は GUI でもつ うーん、語呂がいい。 ということで今日はここまで。
Red Hatの森若です。 ddやcatで大きめのファイルを操作して、dfでファイルシステムの統計情報を確認する簡単な実験をします。 (注意: 諸条件によりお手元で同じ操作をしても再現しない場合があります) ## 1GBのファイルhogeを作ります # dd if=/dev/zero of=/hoge bs=1GiB count=1 1+0 records in 1+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.474922 s, 2.3 GB/s # df -h / Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel_rhel84-root 17G 7.2G 9.9G 42% / ## catで同じ内容のファイルhugaを作ります。 # cat hoge > huga # df -h / Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel_rhel84-root 17G 8.2G 8.9G 48% / ## catでファイルhugaの末尾に1GB追記します。 # cat hoge >> huga # df -h / Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel_rhel84-root 17G 11G 6.9G 60% / ## ↑ 1GBしか消費しないはずなのに2GB消費されています ## catでさらにファイルhugaの末尾に1GB追記します。 # cat hoge >> huga # df -h / Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel_rhel84-root 17G 11G 6.9G 60% / ## ↑ 今度は使用量が変わりませんでした 予想外の動作だという人も多いかと思います。 ファイルのフラグメンテーション 本題に入る前に前提知識です。 伝統的なファイルシステムの仕事として、ファイルのフラグメンテーションを予防することがあります。 ファイルのフラグメンテーションとは1つのファイルがブロックデバイス上でバラバラの位置に配置されることで、 特にハードディスクではファイルの読み書きのパフォーマンスに大きな影響があります。 (近年はNVMe やSSDの普及によって影響が小さくなってきました) フラグメンテーションでバラバラになったファイルの雰囲気を伝えたい図 フラグメンテーションの逆に、ファイルをブロックデバイス上で連続して配置できると、良いことがあります。 あとで参照・更新するときに連続でアクセスできるので速い ファイル内のどこのデータがブロックデバイス上のどこにあるかの対応関係を管理するデータが少なくて済む このような背景から、ファイルシステムにはファイルのフラグメンテーションを予防するための工夫が含まれています。 XFSのspeculative preallocation RHELのデフォルトのファイルシステムであるXFSにはフラグメンテーションを予防するための仕組みとして speculative preallocation(直訳すると "投機的な事前割り当て")と呼ばれる機能があります。 仕組みは簡単で、ファイル末尾への書き込みを契機として本来必要なファイル末尾までを格納するブロックより あとの連続したブロックをあらかじめファイルに割りあてます。 もし同じファイルへ追記すると、割りあてられたブロックが利用されます。 割りあてたブロックはデフォルトで5分間使われなければ回収されます。 さきほどと同じ実験をして、消費が1GB増えるはずが2GB増えたときにファイルの状態をstatで見てみます。 ## ファイル huga は 2GB、512バイトのブロックが 4194304 個のはずが 6291584個割りあてられている # stat huga File: huga Size: 2147483648 Blocks: 6291584 IO Block: 4096 regular file Device: fd00h/64768d Inode: 1256334 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:etc_runtime_t:s0 Access: 2022-11-23 05:51:54.801681431 +0900 Modify: 2022-11-23 05:52:02.397067737 +0900 Change: 2022-11-23 05:52:02.397067737 +0900 Birth: - ## しばらく待ってからstatすると Block が減っている # stat huga File: huga Size: 2147483648 Blocks: 4194304 IO Block: 4096 regular file Device: fd00h/64768d Inode: 1256334 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:etc_runtime_t:s0 Access: 2022-11-23 05:51:54.801681431 +0900 Modify: 2022-11-23 05:52:02.397067737 +0900 Change: 2022-11-23 05:52:02.397067737 +0900 Birth: - speculative preallocationは様々なコマンドを呼び出すシェルスクリプトやログの出力などでみられる、 「ファイルをopen、末尾へ出力、ファイルをclose」を間欠的に複数のプロセスから繰り返すパターンにうまく対応します。 あらかじめ確保するサイズはファイル容量によって調整され、ファイルシステム全体の空き容量も考慮されます。 speculative preallocationの制限 ファイルシステムの統計情報を元に何らかの処理をおこなうプログラムが speculative preallocationにうまく対応できない場合があります。 このような場合 speculative preallocationを禁止することはできませんが、 あらかじめ確保するサイズを小さくして影響を小さくすることができます。 XFSのマウントオプション allocsize= でspeculative preallocationのサイズを指定できます。 ## fstabの例 /dev/mapper/rhel_rhel84-root / xfs defaults,allocsize=64k 0 0 まとめ XFSには独特な工夫があり、統計情報を見ているとびっくりすることもあります。 ほとんどの場合に害はありませんが、問題がある場合には制限をかけることもできます。 関連リンク linux kernelのxfsドキュメント mjmwired.net RHELのナレッジ記事 access.redhat.com
レッドハットの織です。2022年のOpenShift Advent Calendarの1日目ということで、改めてOpenShiftのご紹介をしたいと思います。 OpenShiftとは OpenShiftは、Red Hatが開発・提供するKubernetesディストリビューションです。エンタープライズ/ミッションクリティカルなワークロードで使用されることを想定し、upstreamのKubernetesに対して様々な改良を加えたりコンポーネントを追加したりし、オープンソースソフトウェア製品として提供しています。CNCFの認定を取得し、Kubernetesの標準に準拠しています [ 1 ]。 www.redhat.com OpenShiftの現在のバージョンはv4.11ですが、v2を提供していた2014年8月に「OpenShift v3はDocker + Kubernetesをベースに作り直す」ことを 表明 しました。その後2015年6月にKubernetes v1.0ベースのOpenShift v3をGAして以降、Kubernetesコミュニティと協力しながらOpenShiftを発展させてきました。 OpenShiftの特徴はいろいろありますが、個人的にはその中でも次の2つが大きな特徴と考えています。 様々なエコシステムのコンポーネントが、いい感じに設定された状態で入っている バージョンアップがサポートされる まず 1. についてですが、Kubernetesを使用する際、メトリックス管理のためにPrometheus、ログ管理のためにElasticSearch+Fluentd+Kibana、あとIngress ControllerとWeb dashboardと、アプリのCI/CDの仕組みも欲しいしサービスメッシュも検討したいし、...と、Kubernetes本体だけでなく、エコシステムの様々なコンポーネントを一緒に使用することがほとんどだと思います。OpenShiftでは、これらのほとんどがデフォルトで入っている、もしくは必要に応じて追加できる(追加費用がかからないものもたくさんあります)ようになっており、また入れるだけでいい感じに設定され、すぐに使用することができます。お客様がよりアプリケーション開発に注力できるよう、Kubernetesに付加価値をつけて提供している、と言えるかもしれません。 2.のバージョンアップは、特にupstreamの進化の速いソフトウェアを使用するときはいつも課題になることが多いと思います。Kubernetesは今でも1年に3回マイナーバージョンが上がっており、OpenShiftもそれに合わせてバージョンアップします。OpenShiftでは、Operatorの考え方をベースにKubernetesのコアコンポーネントを含めた全てのコンポーネントを管理しており、その仕組みを使ったin-placeなバージョンアップをサポートしています。 OpenShiftがKubernetesに対して追加している機能を具体的にいくつか挙げてみます。 Web GUI アプリケーションのビルドの仕組み デフォルトのセキュリティ設定が厳し目 マウス数クリック (もしくはコマンド1発) でin-placeアップグレード Operatorによるクラスター全体(OSも含めて)の自動管理 Metrics管理 (Prometheus) HAProxyベースのIngress Controller Multusによる複数Podネットワーク管理 コンテナアプリを稼動させることに特化したOS (Red Hat Enterprise Linux CoreOS, RHCOS) 上で稼動し、RHCOS自体の管理もOpenShiftから行う (OpenShiftのバージョンを上げると、RHCOSのバージョンも自動的に上がります) さらに、必要に応じてOperatorHubから機能追加することができます [ 2 ]。 Windowsのワーカーノード管理 Logging管理 (ElasticSearch/Fluentd/Kibna, Grafana Loki/Vector) Local Storage Operator (内蔵ディスクの管理) Compliance Opeartor (セキュリティ標準への準拠のサポート) File Integrity Operator (ファイル改竄検知) Performance Addon Operator (低レイテンシーを要求するアプリケーション特有のチューニング、v4.11以降はOpenShiftの標準機能になりました) SR-IOV Operator MetalLB Operator Service Mesh (Istioベースのサービスメッシュ) Virtualization (KubeVirtベースの仮想化) Serverless Pipelines (Tektonを用いたCI/CD) GitOps (ArgoCDを用いたGitOps) PTP Operator OADP Operator (バックアップ/リストア) MTC Operator (OpenShiftクラスターのマイグレーション) その他たくさん OpenShiftを使ってみよう OpenShift Container Platform OpenShift Container Platform (OCP) は、サブスクリプションを購入して使っていただく製品版のOpenShiftです。今は厳密には、単に「OpenShift」と言うとOKD(後述するコミュニティ版)は含まず製品版のみを意味します。が、製品版のことを「OCP」と呼んだり、OKDとOCPの総称としてOpenShiftという呼び名を使うこともあったり、この辺りはわりと適当です [ 3 ]。 OpenShiftは様々な形で利用していただくことができます。 マネージド: クラウド事業者さんと協力して提供するマネージドサービス。 ROSA (AWSのOpenShiftマネージドサービス) や ARO (AzureのOpenShiftマネージドサービス) 等があります。OpenShiftを動かす基盤の運用管理は基本的にRed Hat SREが行います。 セルフマネージド: 利用者が自身で構築・運用する形態 セルフマネージドな使い方の場合、IPI, UPIの2種類のインストール方法があります。 IPI (Installer Provisioned Infrastructure): OpenShiftが使用するインフラをインストーラが自動的に作成します。例えばAWS上でIPIインストールすると、VPCやELBなども含め、必要なものをインストーラが作成します。 UPI (User Provisioned Infrastructure): OpenShiftが使用するインフラは、インストーラ実行前にユーザーが手動で作成しておきます。 IPIはAWSやOpenStackなど、主にクラウド環境で利用されるインストール方法ですが、OpenShiftではベアメタルサーバやvSphere、Nutanix等の環境に対してもIPIインストールの仕組みを提供しています。 ベアメタルIPIの場合は、OpenStack Ironicの仕組みを流用したMetal3 [ 4 ] を使ってノードのプロビジョニングを行います。通常APIサーバやIngressコントローラの前段に配置するロードバランサに相当する機能は、 HAProxy と Keepalived をOpenShiftノード上で稼動させることで実現します。 IPIインストールのお手軽さは、 猿でもできるOpenShift4インストール編 を見ていただけると雰囲気がわかるかと思います。 qiita.com UPIインストールは、DNSやDHCP、ロードバランサ等を事前に用意する必要があり、他の方法と比べると若干手間がかかります。検証環境を作るときは、 OpenShift-AiO などのAnsible Playbookを使ったり、 爆速でインストールするスクリプト を使ったりする人が多いようです。 github.com qiita.com セルフマネージドでご利用いただく際は、サブスクリプションを購入していなくても、60日は無料で使用していただくことができます [ 5 ]。 OpenShiftのドキュメントは以下のURLにあります。 英語版 https://docs.openshift.com/container-platform/latest/welcome/index.html 日本語版 https://access.redhat.com/documentation/ja-jp/openshift_container_platform/ docs.openshift.com access.redhat.com OKD OKD はコミュニティ版のOpenShiftです。 www.okd.io OpenShift v3の頃はOpenShift Originという名前のupstreamプロジェクトがあったのですが、OpenShift v4になってOriginがなくなり、OKDになりました。 OriginはOCPの関係はupstream-downstreamの関係でしたが、OKDとOCPの関係は「兄弟」だそうです [ 6 ]。 www.redhat.com OKDのドキュメントは こちら にあります。マネージドサービスはありませんが、セルフサービスでIPI/UPIインストールする点はOpenShiftと同じです。ベースのOSとしては、 Fedora CoreOS (FCOS) を使用します [ 7 ]。 docs.okd.io getfedora.org OKDのnightly buildは こちら から取得できます。 最近、 OKD Streams という新しい取り組みを始めました。OKD Streamsでは、OKDをビルドするためのTekton CIパイプラインを公開することで、ユーザーさんが独自の機能追加をしたりバグフィックスをしたり、OKDに対してフィードバックしやすくなることを目指しています。 cloud.redhat.com 最後に Advent Calendar初日というわけで、OpenShiftの紹介をさせていただきました。機会があったらぜひOpenShift/OKDを試してみてくださいね。 ここで言う「Kubernetesの標準への準拠」はAPIの互換性を意味しており、Kubernetesに対して動いたDeployment等のマニフェストがそのままOpenShiftで稼動することを意味するわけではありません。例えばOpenShiftはデフォルトではかなり厳しいセキュリティ設定となっており、root権限で動く(もしくは特定のUIDを指定する)コンテナイメージをOpenShiftで動かすためには、Security Contextを設定する必要があります。 ↩ ここで挙げたものは無償で追加できるOperatorですが、その他にもマルチクラスタ管理やRook Cephベースのストレージなど、有償の製品もあります。 ↩ 以前、コミュニティ版を「OpenShift Origin」と呼んでいた時代があり、その頃は単に「OpenShift」というとOCPとOriginの総称を意味していた...ような気がします。その名残かもしれません。 ↩ Metal³ - Metal Kubed ↩ Pull Secret (コンテナイメージをpullするためのクレデンシャル情報) を取得するために、Red Hatのカスタマーポータルでユーザー登録していただく必要があります。 ↩ 解釈が難しい表現ですね... ↩ CentOS StreamベースのCoreOS (SCOS) も開発中です https://github.com/openshift/os ↩
Red Hat のソリューションアーキテクトの暮林です。 Red Hat にはクラウドネイティブアプリの開発に役立つ、ソフトウェアのラインナップが充実していることをご存知ですか? ここでは、それらのソフトウェア [Red Hat Application Services] に関する注目ニュースを、各製品技術に特化したソリューションアーキテクトがご紹介していきます。 今回は 2022/12月号となります。 想定読者 エンタープライズアーキテクト アプリケーション開発者 システムの提案をするSIerの方 特集1: Red Hat OpenShift ConnectorsからChange Data Captureをご紹介いたします! 「Red Hat OpenShift Connectors」 は、レッドハットが提供する新しいクラウドサービスです。このサービスは、システム間で迅速かつ信頼性の高い接続を可能にするために、あらかじめ事前設定されたコネクタを提供しています。各コネクタはApache Kafka向けのマネージドサービスである「Red Hat OpenShift Streams for Apache Kafka」と事前に統合され、フルマネージドサービスとして提供されてます。 rheb.hatenablog.com 特集2: OpenShift ConsoleのTopology Viewに表示されているアプリケーションのアイコンが変えられることはご存知でしたか?マニュアル上に変え方はのっていますが、実際どんなアイコンがあるかは一部しか紹介されていないので一覧にしてみました。 rheb.hatenablog.com 特集3: Red Hat SSOは、OSSのKeycloakをベースとしたシングルサインオン製品です。シングルサインオン製品を利用する中で、OIDCのクレームやSAMLのアサーションをカスタマイズしたい場合などがあります。 今回は、Red Hat SSOでOIDCのクレームの編集方法について紹介しています。 qiita.com
こんにちは、レッドハット ソリューションアーキテクトの暮林です。 今日はOpenShift Consoleのトポロジービューを彩るアプリケーションアイコンのチートシートを掲載します。 ドキュメントとしてまとまっていないので、一覧にしてみました。 TL;DR これを こうするにはどうすればいいの? 本文 マニュアルとそこから辿れるガイドは下記のとおりなのですが、実際に指定可能なものはなんなの?がわかりません。 access.redhat.com github.com どうやら手っ取り早いのはConsoleのソースを読むことのようですが、実際のアイコンはどんなものが表示されるのでしょうか。 github.com チートシート 使い方 oc label xxxx/xxxx app.openshift.io/runtime=[Runtime] --overwrite xxxx/xxxx はOpenShiftのAPIとリソース(多くはDeploymentとその名前)で[Runtime]は下記のシートの一番左の列です。 注意 masterブランチからとっているので、OpenShiftのバージョンによっては対応していないケースがあるかもしれません。 Runtime Icon Label 3scale app.openshift.io/runtime=3scale aerogear app.openshift.io/runtime=aerogear amq app.openshift.io/runtime=amq angularjs app.openshift.io/runtime=angularjs ansible app.openshift.io/runtime=ansible apache app.openshift.io/runtime=apache beaker app.openshift.io/runtime=beaker build app.openshift.io/runtime=build camel app.openshift.io/runtime=camel capedwarf app.openshift.io/runtime=capedwarf catalog app.openshift.io/runtime=catalog cassandra app.openshift.io/runtime=cassandra clojure app.openshift.io/runtime=clojure codeigniter app.openshift.io/runtime=codeigniter cordova app.openshift.io/runtime=cordova datagrid app.openshift.io/runtime=datagrid datavirt app.openshift.io/runtime=datavirt debian app.openshift.io/runtime=debian decisionserver app.openshift.io/runtime=decisionserver django app.openshift.io/runtime=django dotnet app.openshift.io/runtime=dotnet drupal app.openshift.io/runtime=drupal eap app.openshift.io/runtime=eap elastic app.openshift.io/runtime=elastic erlang app.openshift.io/runtime=erlang fedora app.openshift.io/runtime=fedora freebsd app.openshift.io/runtime=freebsd git app.openshift.io/runtime=git github app.openshift.io/runtime=github gitlab app.openshift.io/runtime=gitlab glassfish app.openshift.io/runtime=glassfish go-gopher app.openshift.io/runtime=go-gopher golang app.openshift.io/runtime=golang grails app.openshift.io/runtime=grails hadoop app.openshift.io/runtime=hadoop haproxy app.openshift.io/runtime=haproxy helm app.openshift.io/runtime=helm infinispan app.openshift.io/runtime=infinispan jboss app.openshift.io/runtime=jboss jenkins app.openshift.io/runtime=jenkins jetty app.openshift.io/runtime=jetty joomla app.openshift.io/runtime=joomla jruby app.openshift.io/runtime=jruby js app.openshift.io/runtime=js knative app.openshift.io/runtime=knative kubevirt app.openshift.io/runtime=kubevirt laravel app.openshift.io/runtime=laravel load-balancer app.openshift.io/runtime=load-balancer mariadb app.openshift.io/runtime=mariadb mediawiki app.openshift.io/runtime=mediawiki memcached app.openshift.io/runtime=memcached mongodb app.openshift.io/runtime=mongodb mssql app.openshift.io/runtime=mssql mysql-database app.openshift.io/runtime=mysql-database nginx app.openshift.io/runtime=nginx nodejs app.openshift.io/runtime=nodejs openjdk app.openshift.io/runtime=openjdk openliberty app.openshift.io/runtime=openliberty openshift app.openshift.io/runtime=openshift openstack app.openshift.io/runtime=openstack other-linux app.openshift.io/runtime=other-linux other-unknown app.openshift.io/runtime=other-unknown perl app.openshift.io/runtime=perl phalcon app.openshift.io/runtime=phalcon php app.openshift.io/runtime=php play app.openshift.io/runtime=play postgresql app.openshift.io/runtime=postgresql processserver app.openshift.io/runtime=processserver python app.openshift.io/runtime=python quarkus app.openshift.io/runtime=quarkus rabbitmq app.openshift.io/runtime=rabbitmq rails app.openshift.io/runtime=rails redis app.openshift.io/runtime=redis rh-integration app.openshift.io/runtime=rh-integration rh-spring-boot app.openshift.io/runtime=rh-spring-boot serverless-function app.openshift.io/runtime=serverless-function java app.openshift.io/runtime=java redhat app.openshift.io/runtime=redhat rh-openjdk app.openshift.io/runtime=rh-openjdk operator app.openshift.io/runtime=operator rh-tomcat app.openshift.io/runtime=rh-tomcat ruby app.openshift.io/runtime=ruby scala app.openshift.io/runtime=scala shadowman app.openshift.io/runtime=shadowman spring app.openshift.io/runtime=spring spring-boot app.openshift.io/runtime=spring-boot sso app.openshift.io/runtime=sso stackoverflow app.openshift.io/runtime=stackoverflow suse app.openshift.io/runtime=suse symfony app.openshift.io/runtime=symfony tomcat app.openshift.io/runtime=tomcat ubuntu app.openshift.io/runtime=ubuntu vertx app.openshift.io/runtime=vertx wildfly app.openshift.io/runtime=wildfly windows app.openshift.io/runtime=windows wordpress app.openshift.io/runtime=wordpress xamarin app.openshift.io/runtime=xamarin zend app.openshift.io/runtime=zend 使わなくなった旧弊社アイコンがあって汗
こんにちは、ソリューションアーキテクトの蒸野(ムシノ)です。 今回は、Red Hat Developerのブログ Red Hat OpenShift Connectors: Configuring change data capture | Red Hat Developer の翻訳記事をベースに紹介させて頂きたいと思います。 翻訳記事から内容の一部変更、およびオリジナルにない画面表示や補足事項を追加しています。ご承知おき頂けたらと思います。 はじめに 「Red Hat OpenShift Connectors」 は、レッドハットが提供する新しいクラウドサービスです。このサービスは、システム間で迅速かつ信頼性の高い接続を可能にするために、あらかじめ事前設定されたコネクタを提供しています。各コネクタはApache Kafka向けのマネージドサービスである「Red Hat OpenShift Streams for Apache Kafka」と事前に統合され、フルマネージドサービスとして提供されてます。 チェンジデータキャプチャ(CDC)は、データベース内のデータ変更を検出し変更情報をイベントに変換し、他のシステムやアプリケーションがこれらイベントデータを利用して変更に対応できるようにするデザインパターンです。 変更データ取得の典型的な使用例としては、以下のようなものがあります。 データレプリケーション ストリーミングアプリケーション イベント駆動型アプリケーション 「Red Hat OpenShift Connectors「 は、人気のあるオープンソースプロジェクトである 「Debezium」 をベースとした、変更データキャプチャ用の複数のソースコネクタを提供します。現時点でサポートするデータベースは下記のとおりです。 PostgreSQL MySQL SQLサーバー MongoDB それでは事前説明はこのくらいにして、 本記事では、OpenShift上に配置しているPostgreSQLからデータ変更イベントを取得するためのソースコネクタを設定する方法を紹介していきたいと思います。 前提環境 この記事では、「OpenShift Streams for Apache Kafka」 のインスタンスを作成し、そのインスタンスが利用可能な状態であることを前提にしています。Kafka インスタンスを作成するための手順については、前回記事の「 Red Hat OpenShift Connectors のご紹介 - 赤帽エンジニアブログ 」を参照ください。 「OpenShift Streams for Apache Kafka」 にアクセスするには、サービスアカウントを作成し、サービスアカウントに対してアクセスルールを設定する必要があります。具体的には、トピックの読み取りと書き込み、および新しいトピックを作成するための権限が必要です。これら手順についても過去記事に詳細手順がありますのでご覧いただければと思います。 OpenShift に PostgreSQL インスタンスをセットアップする 次に、PostgreSQL のセットアップする方法を説明します。 OpenShift にサインアップして PostgreSQL をプロビジョニングします。 任意のプロジェクト上で、トポロジーから右クリックで「プロジェクトに追加」>「データベース」を選択します。 作成可能なデータベースが表示されますので、「PostgreSQL(Ephemeral)」を選択しインスタンスを作成します。 テンプレートのインスタンス化が表示されますのでこれをクリックします。 インスタンスの設定画面に遷移すると思いますので、例えば以下のように設定を行います。 Database Service Name: postgresql PostgreSQL Connection Username: postgres PostgreSQL Connection Password: postgres PostgreSQL Database Name: postgres その他は標準のままで問題ありません。 準備が整いましたら、作成ボタンをクリックします。 PostgreSQLのインスタンスが準備され、数秒待てばインスタンスが無事作成されます。 次にPostgreSQLにテーブルを作成します。 これはPodにアクセスしてCREATE TABLE文を流し込みます。まず、Podにアクセスするため、PostgreSQL のインスタンスをクリックして、右メニューからPodにアクセスします。 次にPodのターミナルタブを選択すると次のような画面が表示されます。 PostgreSQLに接続します psql -h localhost -p 5432 -U postgres -d postgres 次に、テーブルを作成します。 CREATE TABLE Orders ( OrderId integer not null primary key, OrderType varchar(1), OrderItemName varchar(50), Quantity integer, Price varchar(50) , ShipmentAddress varchar(100) , ZipCode varchar(10), OrderUser varchar(10) ); 更に、「Red Hat OpenShift Connectors」が「postgresql」にアクセスできるようにOCコマンドで「loadbalancer」を追加します oc expose deploymentconfig postgresql --type=LoadBalancer --name=postgresql-loadbalancer 作成後、サービスの内容を確認します oc get service NAME  TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE postgresql ClusterIP XXX.XX.XX.XXX <none> 5432/TCP 172m postgresql-ingress LoadBalancer   XXX.XX.XX.XXX XXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXX.ap-southeast-1.elb.amazonaws.com 5432:30973/TCP 2m29s 最後に、サンプルデータの登録を行います。 INSERT INTO "public"."orders" ("orderid", "ordertype", "orderitemname", "quantity", "price", "shipmentaddress", "zipcode", "orderuser") VALUES (1, 'E', 'TEST1', 12, '300', '東京', '1500001', 'USER1'); INSERT INTO "public"."orders" ("orderid", "ordertype", "orderitemname", "quantity", "price", "shipmentaddress", "zipcode", "orderuser") VALUES (2, 'E', 'TEST2', 100, '30', '新潟', '9591955', 'USER1'); INSERT INTO "public"."orders" ("orderid", "ordertype", "orderitemname", "quantity", "price", "shipmentaddress", "zipcode", "orderuser") VALUES (3, 'E', 'TEST3', 33, '1440', '北海道', '0801260', 'USER1'); INSERT INTO "public"."orders" ("orderid", "ordertype", "orderitemname", "quantity", "price", "shipmentaddress", "zipcode", "orderuser") VALUES (4, 'E', 'TEST4', 50, '50', '大阪', '5980014', 'USER2'); INSERT INTO "public"."orders" ("orderid", "ordertype", "orderitemname", "quantity", "price", "shipmentaddress", "zipcode", "orderuser") VALUES (5, 'E', 'TEST5', 90, '100', '福岡', '8140004', 'USER2'); 設定上の注意点として、PostgreSQLではトランザクションログ(WAL)のログレベルをロジカルに変更する必要があります。 「postgresql.conf」を変更し、「wal_level = logical」に設定し、再起動を行います。 debezium.io これでデータベース側の準備は一旦完了です。 変更データ取得のためのインスタンスを作成するの手順 前のステップで、PostgreSQL インスタンスを起動、サンプルデータをロードできたことだと思います。 次に、Order テーブルから変更イベントをキャプチャするため、 「OpenShift Connectors」 ソースコネクタを作成します。Red Hat ハイブリットクラウドコンソールから、次のステップを実施します。 1.「 console.redhat.com 」 >「Application and Data Services」にアクセスします。 2.「Application and Data Services」 から、「Connectors」 を選択し、「Create Connectors instance」 をクリックします。 3.検索フィールドに debezium と入力すると、いくつかのコネクターが表示されます。表示された「Debezium PostgrreSQL Connector」 をクリックし、Next をクリックします。 4.コネクタの 「Streams for Apache Kafka」 インスタンスを選択します。(※前提環境で作成したKafkaインスタンスです) 次に、Next をクリックします。 5.「Namespace」では「Create preview namespace」をクリックして、コネクタインスタンスを所属させるためのネームスペースを作成します。この評価用のネームスペースは 48時間利用が可能です。ネームスペースが利用可能になったら、それを選択し、[Next]をクリックします。 6.以下の値を入力し、コネクタの概要設定を行います。 下記の内容を設定して次をクリックします。 コネクタの名前 コネクタ用に作成したサービスアカウントのクライアントID コネクタ用に作成したサービスアカウントのシークレット 7.コネクタの接続設定を提供します。 「Debezium Postgres Connector」の場合、以下の情報を入力します。 Database:作成したデータベースユーザーのユーザー名です。例:postgresql Hostname:PostgreSQL インスタンスの公開アドレス。PostgreSQL インスタンスを作成したときの「EXTERNAL-IP 」を確認します Port:デフォルトから変更がなければそのままにします Password:以前に作成したデータベースユーザーのパスワード 例:postgres Namespace:この Postgresql インスタンスを識別するための一意の名前 例:postgres User:作成したデータベースユーザーのユーザー名です 例:postgres Advanced Properties:特に変更対象がなければそのままにします 8.フィルタ定義はデフォルトのままで問題ありません。 9.データ&ランタイムの値はデフォルト値で問題ありません。こちらは、特別な理由がない限り、一般的には変更しません。 10.設定プロパティのサマリーを確認します。特に 「Database Hostname」 フィールドに注意してください。問題がなければ「Create Connector」 をクリックしてコネクタを作成します。 コネクタインスタンスがコネクタのテーブルに追加されます。数秒後〜数分後、コネクタインスタンスのステータスが「Ready」に変わるはずです。コネクタがエラー状態になった場合は、コネクタの横にあるオプションアイコンをクリックして修正することができます。 PostgreSQLからデータ変更イベントを取得する 「Debezium PostgrreSQL Connector」 の準備ができると、Postgresql データベースに接続し、監視するテーブルのスナップショットを作成します。テーブルに存在するすべてのレコードに対してデータ変更イベントを作成します。 これを確認するには、「OpenShift Streams for Apache Kafka」 の コンソールでメッセージを表示します。 Red Hat コンソールの 「Application and Data Services」 ページに移動し、「Streams for Apache Kafka」→「Kafka Instances」 を選択します。コネクタ用に作成したStreams for Apache Kafkaインスタンスの名前をクリックし「Topics」 タブを選択します。 4つの新しいトピックが表示されるはずです。Debeziumコネクタは、Kafka Connectの上で動作します。Kafka Connectは、その内部状態を維持するために3つのトピックを作成します。これらは、「XXXXXXXXXXX-config」、「XXXXXXXXXXX-offset」、「XXXXXXXXXXX-status」 で終わるトピックです。 そしてもうひとつのトピックは 「postgres.public.orders」 という名前で、データ変更イベントを保持します。 「postgres.public.orders」トピックをクリックし、「Messages」 タブを選択します。サンプルデータから連携された5つのメッセージが表示されているかと思います。 この時点で、PostgreSQL に新しいレコードを追加したり、既存のレコードの変更を検知できるようになります。 例えばサンプルデータを変更するものとし、次のSQL文を発行したとします。 UPDATE "public"."orders" SET "shipmentaddress" = '福岡2' WHERE "orderid" = 5; UPDATE "public"."orders" SET "shipmentaddress" = '大阪2' WHERE "orderid" = 4; 同様にトピックのメッセージビューアを確認することで、変更イベントが生成されていることを確認できます。 Topicのメッセージには、下記のように2つの更新メッセージが追加で表示されます。このようにイベントデータとしてデータベースの変更内容を検知することができます。 次に、イベントデータのValueにある「Show more」をクリックしてみましょう。 イベントデータの詳細が表示されるかと思います。 各イベントデータのメッセージは、以下の構造を持つJSONペイロードを持ちます。 after: メッセージの最新の状態が格納されている。 source: コネクタと PostgreSQLインスタンスに関するメタデータが含まれる。 op: この変更を作成した操作を指定します。この場合、操作は「 u」 で、これは update を示しています。 エンドツーエンドのデータパイプラインの例 OpenShift Connector インスタンスでデータベースからデータ変更イベントをキャプチャすることは、データを使用するための最初のステップに過ぎません。通常、データ変更イベントは他のサービスやアプリケーションによって利用され、データのレプリケーションやローカルデータを構築するために使用されます。 次のビデオは、エンドツーエンドのデータパイプラインがどのようなものかを示すデモとなっています。このデモでは、「OpenShift Connectors」を使用して、データ変更イベントを「AWS Kinesis」に連携しています。イベントは、イベントからメッセージの状態を抽出し、「AWS OpenSearch」インデックスを更新する「AWS Lambda」関数をトリガーします。 youtu.be このデモによりより具体的なユースケースについてご理解いただけるかと思います。「Red Hat OpenShift Connectors」 がデータ収集アプリケーションがどのように利便性を向上させ、処理を高速化させることができるのか是非お試しいただけたらと思います。 Debezium の最近のリリースについて Red Hat Application Foundationに含まれる Debezium は下記の通りより多くのデータベースに対応しています。 PostgreSQL MySQL SQLサーバー MongoDB DB2 Oracle 最近のリリースでサポートされるようになったデータベースは下記になります。 Debezium 1.7(RED HAT INTEGRATION 2022.Q2)にてDB2 Debezium 1.9.7(RED HAT INTEGRATION 2022.Q3)にてOracleに対応 ただし、Oracle対応はLogMinerをベースにしており、Oracle EE 12.2以降のOracle Real Application Clusters (RAC) はテクノロジープレビューになる点にご注意ください。 詳しくは Debezium でサポートされる構成 - Red Hat Customer Portal を御覧ください。 最後に 如何でしたでしょうか? 前回に引き続き、「Red Hat OpenShift Connectors」を使ったCDCの始め方について具体的に示させていただきました。 是非一度ご利用いただくとともに、ご意見をお待ちしております。 Debeziumをより深く理解したい方は、下記記事についても是非ともご覧ください。 rheb.hatenablog.com rheb.hatenablog.com
Red Hatの平です。米国時間2022年11月16日にRHEL 9.1がリリースされました。 www.redhat.com さて今回はAppStreams(Application Streams)にて提供されるモジュールの話です。 RHEL9におけるデフォルトのMavenは3.6です。言語環境はNode.JS 16、PHP 8.0, Ruby 3.0がデフォルトです。dnfのモジュールはパッケージ間の依存性の破壊を起こさずにRHEL上で動かす特定のパッケージのバージョンを差し替える仕組みです。 RHEL9 GAの時はモジュールとして提供されるパッケージがありませんでしたが、RHEL9.1ではLightweight Languageの実行環境を中心にAppStreamsリポジトリーの中に次のモジュールが用意されます。 $ sudo dnf module list Updating Subscription Management repositories. Last metadata expiration check: 0:01:35 ago on Fri 16 Nov 2022 12:32:58 PM JST. Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs) Name Stream Profiles Summary maven 3.8 common [d] Java project management and project comprehension tool nodejs 18 common [d], development, minimal, s2i Javascript runtime php 8.1 common [d], devel, minimal PHP scripting language ruby 3.1 common [d] An interpreter of object-oriented scripting language Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled この仕組みを使うことでシステムごとにnodejsを18に変更したりできます。ただし、モジュールには、それぞれ個別のライフサイクルが設定されているので注意が必要です。 各モジュールのライフサイクルは次のページから確認することができます。(※要:Red Hat ID) Red Hat Enterprise Linux Application Streams Life Cycle https://access.redhat.com/ja/node/4167391
Red Hatの森若です。 RHEL には監査ログを取得する audit の仕組みがあります。 監査ログとは、主に各種のセキュリティ要件を満たすため、システムで発生する様々なイベントを検出して記録する仕組みです。 あらかじめ指定したファイルへのアクセス、システムコールの呼出し、コマンド実行、認証、認証の失敗、サービスの開始・終了など多数のイベントをログに保存できます。 もちろん無意味に大量のログを取得しても負荷がかかるだけですので、必要なものだけを取得するよう管理者がルールを設定します。 監査のために作られた仕組みですが、システムのトラブルシュートにも有用です。 たとえば「何らかのプロセス xx がファイル /fuga/hoge をたまに更新している。xxを発見したい」のようなケースで役立ちます。 audit機能概要 linux kernelには監査ログを取得するauditの仕組みがあります。 システムコール呼出や、その成功・失敗、対象となるファイル、利用されたファイル名、SELinux コンテキストなどを条件として、あらかじめイベントを発生させる条件を auditctl で指定しておきます。 実際に該当するイベントがあると、kauditdにイベントが登録されます。 linux kernel内だけでイベントを取得するわけではなく、systemdやPAM、shadow-utilsなども連携してサービスのライフサイクルやユーザ認証・作成・削除などのイベントも収集します。 audit用のnetlinkでauditdやsystemd-journaldがイベントを受けとって監査ログを保存します。 auditdのログから、付属するツールを使って各種のレポートを生成できます。 audispdは、auditログの内容により関連するプログラムを実行できます。 journalでは journalctl _TRANSPORT=audit とすることでauditログだけを表示することができます。 audit概要 audit機能の難しいところ auditを一般のシステム管理者が活用するには少しハードルがあります。 kernelのシステムコールという比較的低いレベルの知識が必要になる点です。 そのためkernelやシステムコールに全く馴染みがない状態で活用することは難しいです。 kernelやシステムコールに多少馴染みがあっても、ある目的のために 何を監視するとよいのかは一般に自明ではありません。 /usr/share/audit/sample-rules を見ると 各種のセキュリティ規格むけに作られたルールが集積されています。 ここを起点にして調べていくのがよいでしょう。 たとえば PCI DSS v3.1むけのルールである 30-pci-dss-v31.rules の中には 「ユーザが監査ログへアクセスしようとする」ことを記録するために以下のような設定があります。 ## 10.2.3 Access to all audit trails. -a always,exit -F dir=/var/log/audit/ -F perm=r -F auid>=1000 -F auid!=unset -F key=10.2.3-access-audit-trail -a always,exit -F path=/usr/sbin/ausearch -F perm=x -F key=10.2.3-access-audit-trail -a always,exit -F path=/usr/sbin/aureport -F perm=x -F key=10.2.3-access-audit-trail -a always,exit -F path=/usr/sbin/aulast -F perm=x -F key=10.2.3-access-audit-trail -a always,exit -F path=/usr/sbin/aulastlogin -F perm=x -F key=10.2.3-access-audit-trail -a always,exit -F path=/usr/sbin/auvirt -F perm=x -F key=10.2.3-access-audit-trail すこしキーワードを紹介します。なんとなく上のルールが読みとけるかと思います。 詳しくは auditctl の man page を参照してください。 キーワード 意味 always システムコール開始時にaudit contextを保存する exit システムコールが終了した時にイベントを記録するかの判定を行う dir, path システムコール引数のディレクトリやパス perm システムコールが必要とする権限 auid 最初にログインした時のUID。(suなどをしても変更されない) key ログのフィルタ用に記録する key /var/log/audit/ディレクトリへの読み込みアクセスや、audit関連のレポートを出力するコマンド実行のタイミングで "10.2.3-access-audit-trail" という キーワードつきで監査ログに記録するというルールです。 audit機能を利用するときの情報源 RHELで audit機能を利用する時には、以下ドキュメントを参照します。 この記事でとりあげなかった auditctl の利用方法や、ルールをシステムで永続的に利用するための augenrules についての説明があります。 関連する man pageもぜひ読みましょう。 RHEL ドキュメント 「セキュリティーの強化」内「システムの監査」 access.redhat.com
Red Hatの森若です。 systemctlコマンドでサービスを起動すると、予期しないエラーが出力されます。しかし操作は成功しているし、df等でファイルシステムを見ても余裕があります。 今回はこの状況で何が起きていたのか見てみます。 # systemctl start httpd.service Error: No space left on device inotifyとは? linuxにはinotifyという機能があり、ファイルやディレクトリ等への操作をイベントとして取得することができます。 inotifyではアプリケーションがファイルとして「inotify instance」を用意し、inotify instanceにイベントに対応する「inotify watch」を複数登録します。 inotify watchがイベントを検出するごとに、inotify instanceのキューにイベントを追記していきます。 アプリケーションがinotify instanceから読み込みを行うと、イベントの種類やファイル名などを取得できる仕組みです。 inotify概要図 inotifyはlinux特有の仕組み(現在のUNIX系OSはそれぞれ同様の目的の仕組みを持っていますが標準化はされていません)ですが、systemctlを含む多数のソフトウェアでごく一般的に利用されています。 今回の現象の原因 一部のアプリケーションは非常に多くのinotify watchを利用するため、システム全体の利用上限に触れる場合があります。今回問題が発生したのはこのケースでした。 inotify はkernel内部でファイルシステムの枠組みを利用しているため、エラー時には "No space left on device"(ENOSPC) のようなファイルシステムに関連するエラーを返す場合があります。 linux/fs/notify/inotify/inotify_user.c より static int inotify_new_watch ( struct fsnotify_group *group, struct inode *inode, u32 arg) { (中略) ret = inotify_add_to_idr (idr, idr_lock, tmp_i_mark); # 新しいinotify watchを追加する if (ret) goto out_err; /* increment the number of watches the user has */ if (! inc_inotify_watches (group->inotify_data.ucounts)) { # inotify watchのカウンタを増やす inotify_remove_from_idr (group, tmp_i_mark); ret = - ENOSPC ; # 失敗するとENOSPC goto out_err; } (以下略) inotifyの上限設定 「inotify instance」と「watch」のどちらにもシステム全体とユーザ毎の上限があり、sysctlで設定・読み出しできます。inotify watch の上限数はシステムの搭載メモリから自動的に計算されます。 例: $ sudo sysctl -a |grep inotify fs.inotify.max_queued_events = 16384 fs.inotify.max_user_instances = 128 fs.inotify.max_user_watches = 28587 user.max_inotify_instances = 128 user.max_inotify_watches = 28587 それぞれは以下のような意味です。 項目 意味 fs.inotify.max_queued_events 1つのinotify instanceで保持するイベント数の上限 fs.inotify.max_user_instances (システム全体での) inotify instance数の上限 fs.inotify.max_user_watches (システム全体での) inotify watch数の上限 user.max_inotify_instances (1 UIDあたりの) inotify instance数の上限 user.max_inotify_watches (1 UIDあたりの) inotify watch数の上限 inotifyの利用状況 inotify を利用しているプログラムには対応するファイルディスクリプタがあり、lsofで見つけられます。 例: inotify instanceに対応するファイルディスクリプタをみつける # lsof -p 1|grep inotify systemd 1 root 6r a_inode 0,14 0 10890 inotify systemd 1 root 11r a_inode 0,14 0 10890 inotify systemd 1 root 13r a_inode 0,14 0 10890 inotify systemd 1 root 20r a_inode 0,14 0 10890 inotify systemd 1 root 21r a_inode 0,14 0 10890 inotify systemd 1 root 22r a_inode 0,14 0 10890 inotify inotify watchの利用状況を見るには、 /proc/ PID /fdinfo/ FD 以下を見ます。 inotify instanceに対応するファイルディスクリプタの/proc/ PID /fdinfo/ FD には、"inotify"で初まる行が含まれていて、inotify watchの情報が含まれています。 例: inotify instanceに対応するfdinfoには対応するinotify watchの情報が含まれる # cat /proc/1/fdinfo/6 pos: 0 flags: 02004000 mnt_id: 15 ino: 10890 inotify wd:38c ino:850 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:5008000000000000 inotify wd:38b ino:838 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:3808000000000000 inotify wd:38a ino:bd1 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:d10b000000000000 inotify wd:389 ino:bb9 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:b90b000000000000 inotify wd:388 ino:d9f sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:9f0d000000000000 inotify wd:387 ino:d87 sdev:1a mask:2 ignored_mask:0 fhandle-bytes:8 fhandle-type:fe f_handle:870d000000000000 (以下略) 全プロセスから参照されているinotify watchを確認するには cat /proc/*/fdinfo/*|grep inotify|sort|uniq|wc -l のようにします。 実行中にもファイルのopen/closeやプロセスの作成・終了などが行われていますので多少エラーがでますがおおまかな 現在の利用数を取得できます。 # cat /proc/*/fdinfo/*|grep inotify|sort|uniq|wc -l cat: /proc/39155/fdinfo/255: No such file or directory (中略) cat: /proc/thread-self/fdinfo/3: No such file or directory 369 この例は最小限+GUI環境のRHEL 9環境で取得したので369件と少ないですが、 問題が発生するような場合は先に fs.inotify.max_user_watches で確認した数に近い利用数を確認できます。 利用件数が多い場合、以下のようなコマンドでinotify watchの利用数が多いプロセスを搾り込めます。 # grep inotify /proc/*/fdinfo/*| cut -d/ -f3|uniq -c|sort -n (中略) 104 4880 138 3972 1888 216722 3875 988006 8362 4804 25398 4294 # PID 4294が25398件(重複込み)のinotify watchを利用 対策 inotify watchが不足する場合、単純に fs.inotify.max_user_watches の値を大きくすることで対応します。 設定変更自体でメモリ消費等が増えることはなく、実際にinotify watchが利用された場合にだけ消費されます。 関連するナレッジ access.redhat.com
Red Hat のソリューションアーキテクトの伊藤です。 Red Hat にはクラウドネイティブアプリの開発に役立つ、ソフトウェアのラインナップが充実していることをご存知ですか? ここでは、それらのソフトウェア [Red Hat Application Services] に関する注目ニュースを、各製品技術に特化したソリューションアーキテクトがご紹介していきます。 今回は 2022/11月号となります。 想定読者 エンタープライズアーキテクト アプリケーション開発者 システムの提案をするSIerの方 特集1: Red HatのService Registryを使用してスキーマの進化に対応しよう! 今月の赤帽エンジニアブログの記事では、サービスレジストリの重要性について解説し、APIとスキーマを一元的に管理するための Red Hat の Service Registry の概要と基本的な使い方について紹介しています。サービスレジストリは、Red Hat のマネージドサービス Red Hat OpenShift Service Registry で無償で試すことも可能です。 rheb.hatenablog.com 特集2: Quarkus 公式サイト日本語版 (ja.quarkus.io) を公開しました Red Hatでは、省メモリ、高速起動など、コンテナ環境での動作に求められる要件に基づいて新しく設計されたQuarkusというオープンソースのJavaのアプリケーションフレームワークの開発を主導してますが、その公式サイトの日本語版 ( https://ja.quarkus.io )を公開しました。 rheb.hatenablog.com 特集3: Red Hat OpenShift Connectors のご紹介 「Red Hat OpenShift Connectors」は、Red Hat が提供する新しいクラウドサービスであり、 システム間で迅速かつ信頼性の高い接続を実現するためのコネクタを提供するサービスです。 まだ、サービスプレビュー版ではありますが、概要、および利用方法についてご紹介いたします。 rheb.hatenablog.com
レッドハット ソリューションアーキテクト石倉です。 ここでは、 RHEL System Roles について紹介をします。 システム関連の作業で、サーバにログインして構築作業を実施したり、ログインしてパッチ適用や設定ファイルの変更作業などを実施することは日常的にあると思います。 対象システムが数台程度であればそれでも問題は無いかもしれないですが、多数のシステムを同じようにそれぞれログインしてメンテナンスしていくことは非常に重労働ですし、人手で対応することで設定ミス、作業漏れなどが発生しがちです。 RHEL System Roles は、そのようなインフラ作業を効率化する目的で開発されています。 RHEL System Roles とは、 Red Hat Enterprise Linux を管理および設定する安定した設定インターフェイスを提供する Ansible ロール、モジュール、および Playbook のコレクションです。 Red Hat にて開発された RHEL System Roles を活用することで、システムにログインすること無く、対象システムのメンテナンスを実施することが可能です。 2022年10月現在、 RHEL System Roles では以下のラインナップがあり、その数は日々増えています。 参考: Red Hat Enterprise Linux (RHEL) System Roles - Red Hat Customer Portal 一部 Tech preview のものや、 RHEL のバージョンによって利用できないものもあるので、詳細は上記 URL をご確認ください。 ロール名 説明 timesync 時刻同期設定用ロール selinux SELinux操作用ロール network Network操作用ロール kdump Kernel dumps操作用ロール storage Storage操作用ロール postfix Postfix (mail transfer agent)操作用ロール sap_general_preconfigure SAP 共通Note適用ロール sap_netweaver_preconfigure SAP NetWeaver Note適用ロール sap_hana_preconfigure SAP HANA Note適用ロール sap_hana_install SAP HANA インストール用ロール kernel_settings Kernel settings用ロール logging Logging (rsyslog)操作用ロール metrics Metrics (Performance Co-Pilot)操作用ロール nbde_client Network bound disk encryption client操作用ロール nbde_server Network bound disk encryption server操作用ロール certificate Certificate issuance and renewal操作用ロール tlog Terminal session recording操作用ロール ssh Secure Shell (SSH) client操作用ロール sshd Secure Shell (SSH) server操作用ロール crypto_policies System-wide cryptographic policies操作用ロール ha_cluster High availability clustering操作用ロール vpn Virtual private networks操作用ロール microsoft.sql.server Microsoft SQL Server設定用ロール cockpit Web console設定用ロール firewall Firewall設定用ロール システム管理者やインフラエンジニアの方が実施する作業がロールとして提供されています。 また、Microsoft 社の SQL Server や、SAP 社の S/4HANA 向けのロールもいくつかリリースされています。 では、実際に RHEL System Roles を使ってみたいと思います。 以下の 3 ステップで利用ができます。 Ansible Core 、 RHEL System Roles のインストール Role を呼び出す Playbook を作成 Playbook の実行 一つずつ、実際のやり方をご紹介します。 * 今回はRHEL9.0 で作業を実施していますが、RHEL 7, 8, 9 で同じ手順で操作できます。  OS のバージョンにより、 Ansible Core が含まれるリポジトリが異なる場合がありますので、その点はご注意ください。 1. Ansible Core 、 RHEL System Roles のインストール 作業対象に Ansible Core と RHEL System Roles をインストールします。 ご存知のように、Ansible は IT 自動化ツールです。 Ansible の活用により、システムの構成、ソフトウェアの展開、より高度な IT タスク (継続的なデプロイメント、ダウンタイムなしのローリング更新など) のオーケストレーションが可能になります。 もし、対象の環境が既に Ansible を利用した自動化環境を構成しているのであれば、既存のコントロールノードから Playbook を実行すれば良いでしょう。 ここでは Ansible による自動化環境が構成されていない想定とし、自ノードに Ansible Core を導入しています。 Ansible Core は Ansible の主要なビルディングブロックおよびアーキテクチャーであり、CLI ツールや Ansible プラグインが含まれます。 なお、 RHEL のサブスクリプションをお持ちであれば、 Ansible Automation Platform のサブスクリプションは購入していなくても、 RHEL System Roles のサポートを受けることが可能です。 詳細は以下をご確認ください。 Scope of support for the Ansible Core package included in the RHEL 9 and RHEL 8.6 and later AppStream repositories - Red Hat Customer Portal RHEL System Roles と、必要となる Ansible Core をインストールします。 # dnf install rhel-system-roles ansible-core Ansible Core のインストールが終わると、 ansible コマンドが利用可能になります。 # ansible --version ansible [core 2.12.2] config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.9/site-packages/ansible ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections executable location = /bin/ansible python version = 3.9.10 (main, Feb 9 2022, 00:00:00) [GCC 11.2.1 20220127 (Red Hat 11.2.1-9)] jinja version = 2.11.3 libyaml = True また、RHEL System Roles は、 /usr/share/ansible/roles/ 以下に展開されます。 # ls /usr/share/ansible/roles | grep rhel-system-roles rhel-system-roles.certificate rhel-system-roles.cockpit rhel-system-roles.crypto_policies rhel-system-roles.firewall rhel-system-roles.ha_cluster rhel-system-roles.kdump rhel-system-roles.kernel_settings rhel-system-roles.logging rhel-system-roles.metrics rhel-system-roles.nbde_client rhel-system-roles.nbde_server rhel-system-roles.network rhel-system-roles.postfix rhel-system-roles.selinux rhel-system-roles.ssh rhel-system-roles.sshd rhel-system-roles.storage rhel-system-roles.timesync rhel-system-roles.tlog rhel-system-roles.vpn ドキュメントと、幾つかのサンプル Playbook は、 /usr/share/doc/rhel-system-roles/ 以下に展開されます。 SQL Server や、 S/4HANA のようなサードパーティーアプリケーションの Role は、それぞれ、 ansible-collection-microsoft-sql 、 rhel-system-roles-sap のインストールが必要です。  (S/4HANA用のものは、専用のRHEL for SAP Solutionsサブスクリプションが必要となります。) 2. Role を呼び出す Playbook を作成 数ある RHEL System Roles の中で、今回は storage Role を利用しての、ファイルシステム拡張を実施してみます。 例として、 /dev/sdb に /app/data を100GBで、 /app/log を20GBで作成することにします。 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 99G 0 part ├─rhel-root 253:0 0 65.1G 0 lvm / ├─rhel-swap 253:1 0 2G 0 lvm [SWAP] └─rhel-home 253:2 0 31.8G 0 lvm /home sdb 8:16 0 200G 0 disk sr0 11:0 1 1024M 0 rom 実行する Playbook を作成します。 中身は以下です。 実行対象は localhost 、また、 Ansible 変数で、作成対象のボリュームサイズや Mount Point 、ファイルシステムフォーマットを指定し、 storage Role を呼び出すようにします。 # cat app-storage-prepare.yml --- - hosts: localhost vars: storage_pools: - name: app-area disks: - sdb volumes: - name: appdata size: "100 GiB" mount_point: "/app/data" fs_type: xfs state: present - name: applog size: "50 GiB" mount_point: "/app/log" fs_type: ext4 state: present roles: - rhel-system-roles.storage 3. Playbook の実行 準備が出来たらPlaybookを実行します。 # ansible-playbook app-storage-prepare.yml [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [localhost] ************************************************************************************************************** TASK [Gathering Facts] ******************************************************************************************************** ok: [localhost] TASK [rhel-system-roles.storage : Set version specific variables] ************************************************************* ok: [localhost] TASK [rhel-system-roles.storage : define an empty list of pools to be used in testing] **************************************** ok: [localhost] TASK [rhel-system-roles.storage : define an empty list of volumes to be used in testing] ************************************** ok: [localhost] TASK [rhel-system-roles.storage : include the appropriate provider tasks] ***************************************************** included: /usr/share/ansible/roles/rhel-system-roles.storage/tasks/main-blivet.yml for localhost TASK [rhel-system-roles.storage : get a list of rpm packages installed on host machine] *************************************** skipping: [localhost] TASK [rhel-system-roles.storage : make sure blivet is available] ************************************************************** ok: [localhost] TASK [rhel-system-roles.storage : show storage_pools] ************************************************************************* ok: [localhost] => { "storage_pools": [ { "disks": [ "sdb" ], "name": "app-area", "volumes": [ { "fs_type": "xfs", "mount_point": "/app/data", "name": "appdata", "size": "100 GiB", "state": "present" }, { "fs_type": "ext4", "mount_point": "/app/log", "name": "applog", "size": "50 GiB", "state": "present" } ] } ] } TASK [rhel-system-roles.storage : show storage_volumes] *********************************************************************** ok: [localhost] => { "storage_volumes": "VARIABLE IS NOT DEFINED!" } ・ ・ ・ (中略) ・ ・ ・ TASK [rhel-system-roles.storage : set up new/current mounts] ****************************************************************** changed: [localhost] => (item={'src': '/dev/mapper/app--area-appdata', 'path': '/app/data', 'fstype': 'xfs', 'opts': 'defaults', 'dump': 0, 'passno': 0, 'state': 'mounted'}) changed: [localhost] => (item={'src': '/dev/mapper/app--area-applog', 'path': '/app/log', 'fstype': 'ext4', 'opts': 'defaults', 'dump': 0, 'passno': 0, 'state': 'mounted'}) TASK [rhel-system-roles.storage : tell systemd to refresh its view of /etc/fstab] ********************************************* ok: [localhost] TASK [rhel-system-roles.storage : retrieve facts for the /etc/crypttab file] ************************************************** ok: [localhost] TASK [rhel-system-roles.storage : manage /etc/crypttab to account for changes we just made] *********************************** TASK [rhel-system-roles.storage : Update facts] ******************************************************************************* ok: [localhost] PLAY RECAP ******************************************************************************************************************** localhost : ok=22 changed=2 unreachable=0 failed=0 skipped=9 rescued=0 ignored=0 程なくして処理が終わります。 実際に確認をしてみると、 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 99G 0 part ├─rhel-root 253:0 0 65.1G 0 lvm / ├─rhel-swap 253:1 0 2G 0 lvm [SWAP] └─rhel-home 253:2 0 31.8G 0 lvm /home sdb 8:16 0 200G 0 disk ├─app--area-applog 253:3 0 50G 0 lvm /app/log └─app--area-appdata 253:4 0 100G 0 lvm /app/data sr0 11:0 1 1024M 0 rom # grep app--area /etc/fstab /dev/mapper/app--area-appdata /app/data xfs defaults 0 0 /dev/mapper/app--area-applog /app/log ext4 defaults 0 0 ボリュームの作成だけでなく、 Mount Point ディレクトリの作成や、 fstab の更新まで処理されることがわかります。 作成した Playbook は再利用が可能ですので、似たような設定が必要なシステムでは同じ Playbook を利用して設定を行うことで、人手で行う事に起因して発生する、設定ミスや作業漏れなどが抑制できるのがご理解いただけたと思います。 また、対象システムが多ければ多いほど、自動化の効果は絶大な効果を発揮します。 RHEL System Roles を Ansible で活用することにより作業の重労働化を抑止し、作業品質の安定化が実現できます。