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

TECH PLAY

Red Hat  - Open Innovation Labs

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

全900件

こんにちは、Ansibleテクニカルサポートの呉です。この記事は、「Ansible Advent Calendar 2025」23日目の記事です。 qiita.com ansible-policy は、Policy as Code を実現するために開発され、2024年にRed Hatから発表されました。Ansible本体に比べると非常に新しいツールですが、Open Policy Agent (OPA) と連携してPlaybookの妥当性をチェックできる、運用者待望のツールとして注目されています。 www.redhat.com 1. はじめに:なぜ Ansible に「ポリシー」が必要なのか? Ansible Lintなどのツールは書き方の作法(構文)をチェックしてくれますが、その設定値が組織の運用ポリシーやルールに合っているかまでは判断してくれません。 「テスト環境なのに高額なインスタンスタイプを選んでいないか?」 「セキュリティ上、禁止されているパッケージをインストールしようとしていないか?」 などなど、人間がコードレビューでチェックするのは大変です。そこで、Policy as Code (PaC) の考え方を取り入れ、Playbookの実装内容を自動検閲するのが ansible-policy です。 2. 動作環境構築 まずは、以下の手順に沿って動作環境をインストールしていきます。 ※本手順は、Fedora 42 上で動作することを確認しています。 まず、ansible-policyコマンドを実行するには、OPAもダウンロードする必要があります。現時点での最新版はv1.12.1( https://github.com/open-policy-agent/opa/releases )がリリースされていますので、このバージョンをダウンロードする手順を記載します。 $ curl -L -o opa https://openpolicyagent.org/downloads/v1.12.1/opa_linux_amd64_static $ chmod +x opa $ sudo mv opa /usr/local/bin/ $ opa version Version: 1.12.1 Build Commit: 92dd54dab4e77e6fffa8888c7a30f82dd7be2534 Build Timestamp: 2025-12-18T21:26:27Z Build Hostname: Go Version: go1.25.5 Platform: linux/amd64 Rego Version: v1 WebAssembly: unavailable OPAのダウンロード後、以下のREADMEの手順(手順3まで)に沿って、ansible-policyコマンドの動作環境を構築します。 github.com 3. 実践:特定のパッケージ以外をブロックする それでは、さっそく動かしてみましょう。 今回は、特定のパッケージ(例:mysql-server)以外をインストールするPlaybookに対し、ポリシー違反を表示する例を紹介します。 検証ファイル構成 install_packages.yml: 検閲されるPlaybook(違反を含む) policies/check_package_policy.yml: ポリシー定義ファイル ① 検閲されるPlaybook (install_packages.yml) ここでは、許可リストにない unauthorized-app をインストールしようとしています。 --- - name: Set up MySQL hosts: localhost gather_facts: false become: True vars: package_list: - unauthorized-app # ← これがポリシー違反になる tasks: - name: Install Unauthorized App become: true ansible.builtin.package: name: "{{ package_list }}" state: present ② ポリシーの定義 (policies/check_package_policy.yml) target: task: Playbook内の各タスクをスキャン対象にします。 condition: 違反とみなす条件を書きます。ここでは「ansible.builtin.package モジュールの name パラメータが、許可リストに含まれていない場合」に違反と判定されます。 actions: 条件に合致した(違反した)時の動作です。deny を指定すると、エラーメッセージを表示してブロックします。 ansible-policy では、YAML形式で直感的にポリシーを記述できます。 ここでは、"mysql-server"パッケージのみのインストールを許可しています。 --- - name: Check for mysql package installation hosts: localhost vars: allowed_packages: - "mysql-server" policies: - name: Check for package name target: task # 各タスクの中身を検査 condition: | input["ansible.builtin.package"].name not in allowed_packages actions: - deny: msg: "The package {{ input['ansible.builtin.package'].name }} is not allowed..." tags: - compliance 実行結果 以下のコマンドで、Playbookに対してポリシーを適用します。 ansible-policy -p install_packages.yml --policy-dir ./policies 出力結果: TASK [Install Unauthorized App] install_packages.yml L10-15 *********************************** ... Check_for_package_name Not Validated The package unauthorized-app is not allowed. Allowed packages are one of ["mysql-server"] ----------------------------------------------------------------------------------------------- SUMMARY ... Total files: 1, Validated: 0, Not Validated: 1 Violations detected in 1 task! 許可されていないパッケージ(unauthorized-app)をしっかりと検知してくれました! まとめ ansible-policy を活用することで、実行前のPlaybookの内容を検閲し、組織の運用ポリシーやルールが守られているのかを自動で確認することができます。これは ansible-lint と同じように CI/CD プロセスへ取り入れることもできるでしょう。また、Ansible Automation Platform(AAP)で実行されるジョブも、実行前に検閲することができるようになりますので、よりコンプライアンスが守られ、安全な自動化を実行することができるようになりそうですね。
Apache Camel Advent Calendar 23日目の記事は、サポート担当古市が担当します。 テーマは、「Camel x AI / Project Wanaku」 今回の記事は、全てアップストリームのお話です。現時点では製品に組み込まれておりませんが、純粋にコミュニティーの最新状況についてお話しするのも良いかと思い執筆します。 数年前から過熱している AI関連技術と Apache Camel を掛け合わせることで何が変わるのか、今年の Devoxx UK でとても興味深いセッションが公開されました。 www.youtube.com 段階的なデモを通して披露された「 AI Driven Integration with Apache Camel 」の未来は、とても興味深いものでした。 既存の Camel インテグレーションに Camel AI Components を加えることで AI Driven Integration へ対応させることができるのは、システム改修に強いと言われる Apache Camel の特徴であり、 Apache Camel x AI ならではのソリューションだと思います。 そんな未来に向けて、2つの大きな取り組みが進んでいます。 Apache Camel AI Components Project Wanaku Apache Camel AI Components camel コンポーネントを用意し、各 AI関連技術と連携します。 camel.apache.org LLM 関連 Deep Learning 関連 ベクトルデータベース 関連 グラフデータベース 関連 LLM 関連については、Devoxx UK のデモでも使われていました。 Deep Learning 関連については、開発者による日本語記事がいくつか公開されています。 zenn.dev zenn.dev zenn.dev zenn.dev 今後も対応コンポーネント数の追加や各コンポーネントの成熟度が進むと思われます。 Project Wanaku 2025年3月に公開された オープンソース MCP Router, Wanaku です。 www.wanaku.ai Wanaku is designed to be the ultimate bridge between AI agents and enterprise systems. It offers: Unified Integration: One system to connect your agentic applications effortlessly. User-Friendly CLI/UI: Quickly expose resources and add new tools – supporting HTTP, Kafka, FTP with many more planned for the next releases. Reusable Toolsets: Organize and share tools across projects. Pluggable Architecture: Easily extend your integration capabilities with new services, powered by Apache Camel. こちらにも紹介記事があります。 camel.apache.org WHAT IS WANAKU? Before we dive in, let’s briefly introduce the new player. Wanaku is an open source integration service designed to securely connect AI agents with enterprise systems. At its core, it’s an MCP Router—a central, secure gateway that manages and governs how AI agents access specific “Tools” (functions) and “Resources” (data). It acts as a proxy, filtering and securing the capabilities you want to expose to your LLMs. And thanks to its new Camel Integration Capability, Apache Camel is now a first-class citizen in this new AI-driven world. 近年の AI時代と言えば LLM を使った取り組みが主流ですが、社内の既存サービスをどう LLMと連動させるかが悩みどころなはずです。 wanaku により既存の社内サービスを適切な範囲で公開し、MCPサーバーや LLM と簡単に連携できる環境を用意できるのであれば、とても興味深いプロジェクトと言えるのではないでしょうか。 デモプロジェクトから、どんなことができるか見えてきます。 github.com Wanaku router から登録した camelルートを呼び出すデモも興味深いです。 github.com Camel AI Components, Project Wanaku どちらのアプローチからも、AI Driven Integration への発展を感じられるかと思います。 まずは最初の1歩として、今から Apache Camel を使った簡単なインテグレーションから初めてみては如何でしょうか。 明日の advent calendar 24日目では、「Camel の最前線を追いかける」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com
※本記事は OpenShift Virtualization アドベントカレンダーの 22 日目の記事です。 qiita.com 皆さんこんにちは、OpenShift Virtualization とストレージを生業にしている Red Hat のうつぼ(宇都宮)です。 もう30年くらい前ですが、ウゴウゴルーガというテレビ番組がありました。私は小学生のくせにあのシュールさが大好きなクソガキだったのですが、大阪に住んでいて観られませんでした。 だから先に上京した兄に録画を頼んで VHS を送ってもらっていたんですね。 ところがある朝ビデオを見ると全然知らん映画が録画されてたんですよ。どうも父が上から録画していたようです。 それは超文句言いましたよ。めっちゃ怒りました。そして「なんで俺はツメを折らんかったんや」と悔いました。悔いに悔いました。 何が言いたいかというと、大事なデータはちゃんと保護して管理しましょうということです。 仮想化環境ってゲスト OS のゴールデンイメージは最高に大事ですよね。ということで今日のテーマはゲスト OS のイメージです。 標準のゲスト OS のイメージ コンテナイメージとしてのゲストOS イメージの自動アップデート 独自のゲスト OS イメージを利用する 独自のゲスト OS イメージを作ってみる。 1. 既存イメージの準備 2. PVCへのインポート 3. DataSourceの作成 4. テンプレートへの差し込み まとめ はい、愚にもつかないような昔話で始まったのですが、ゲスト OS のイメージをどのように扱っているでしょうか? OpenShift Virtualization(以下 Virt)には標準でいくつかの便利な VM テンプレートを提供しており、特に Red Hat Enterprise Linux(RHEL)や Fedora、CentOS Streams など、一部のテンプレートではゲストOSのイメージも一緒に提供されています。 今回は、この「標準で提供されるゲスト OS イメージ」がどのように管理され、どのように利用されているのか。そして「独自のゲスト OS イメージ」を利用するにはどうすれば良いのかについて紹介したいと思います。 標準のゲスト OS のイメージ コンテナイメージとしてのゲストOS Virt の標準テンプレートを利用して RHEL などの VM を作成する際、VM のディスクイメージはどこから来ているのでしょうか。 実は、これらのゲスト OS イメージは、従来の qcow2 ファイルなどの形で提供されているわけではなく、 レッドハットのコンテナレジストリからコンテナイメージの形式で提供されています。 Virt のゲスト OS イメージは、CDI という仕組みによって DataVolume や DataSource というカスタムリソースで管理されます。CDI については別の記事で紹介していますので、よかったらご覧ください。 OpenShift Virtualization のディスクに関する独り言(CDI関連) - 赤帽エンジニアブログ さてこの CDI は何の略かというと、 Containerized Data Importer の略です。思いっきり Containerized と書かれているのです。 ゲスト OS イメージをコンテナイメージとして扱う必要性はないのですが、こうすることで、Kubernetes/OpenShift のエコシステムに馴染んだ形でイメージを配信・管理することが可能になっているのです。 実際、標準の OS イメージが格納されている DataSource リソースを見てみましょう。 [root@bastion ~]# oc get datasource rhel9 -n openshift-virtualization-os-images -oyaml apiVersion: cdi.kubevirt.io/v1beta1 kind: DataSource metadata: annotations: operator-sdk/primary-resource: openshift-cnv/ssp-kubevirt-hyperconverged operator-sdk/primary-resource-type: SSP.ssp.kubevirt.io creationTimestamp: "2025-12-09T00:42:42Z" generation: 9 labels: app.kubernetes.io/component: storage app.kubernetes.io/managed-by: cdi-controller app.kubernetes.io/part-of: hyperconverged-cluster app.kubernetes.io/version: 4.20.3 cdi.kubevirt.io/dataImportCron: rhel9-image-cron  <== ここに注目 instancetype.kubevirt.io/default-instancetype: u1.medium instancetype.kubevirt.io/default-preference: rhel.9 kubevirt.io/dynamic-credentials-support: "true" name: rhel9 namespace: openshift-virtualization-os-images resourceVersion: "54250414" uid: 6b04315c-3e81-4a58-90f5-92d5f352acfb spec: source: snapshot: name: rhel9-ab4ec16077fe namespace: openshift-virtualization-os-images status: ... ここに、 cdi.kubevirt.io/dataImportCron: rhel9-image-cron というのがあります。この dataImportCron なるやつが、データソースから定期的にイメージを引っ張って来ているわけです。 これを見てみましょう。 [root@bastion ~]# oc get dataImportcron rhel9-image-cron -n openshift-virtualization-os-images -oyaml apiVersion: cdi.kubevirt.io/v1beta1 kind: DataImportCron metadata: annotations: cdi.kubevirt.io/storage.bind.immediate.requested: "true" cdi.kubevirt.io/storage.import.imageStreamDockerRef: registry.redhat.io/rhel9/rhel-guest-image@sha256:ab4ec16077fe00e3c7efd0b2f6a77571f3645f5c95befc4d917757dc88b2f423 cdi.kubevirt.io/storage.import.lastCronTime: "2025-12-22T08:18:00Z" cdi.kubevirt.io/storage.import.nextCronTime: "2025-12-22T20:18:00Z" cdi.kubevirt.io/storage.import.sourceDesiredDigest: sha256:ab4ec16077fe00e3c7efd0b2f6a77571f3645f5c95befc4d917757dc88b2f423 cdi.kubevirt.io/storage.import.storageClass: truenas-iscsi-csi operator-sdk/primary-resource: openshift-cnv/ssp-kubevirt-hyperconverged operator-sdk/primary-resource-type: SSP.ssp.kubevirt.io creationTimestamp: "2025-12-09T00:42:42Z" generation: 35 labels: app.kubernetes.io/component: templating app.kubernetes.io/managed-by: ssp-operator app.kubernetes.io/name: data-sources app.kubernetes.io/part-of: hyperconverged-cluster app.kubernetes.io/version: 4.20.3 kubevirt.io/dynamic-credentials-support: "true" name: rhel9-image-cron namespace: openshift-virtualization-os-images resourceVersion: "57560415" uid: dc4769f6-1e70-4380-8711-cae6449903c0 spec: garbageCollect: Outdated managedDataSource: rhel9 schedule: 18 8/12 * * * template: metadata: {} spec: source: registry: imageStream: rhel9-guest  <== ここに注目 pullMethod: node storage: resources: requests: storage: 30Gi status: {} status: ... この DataImportCron を見ると、 imageStream: rhel9-guest から Cron で持ってきていることがわかります。最後にこの ImageStream を見てみましょう。 [root@bastion ~]# oc get imagestream rhel9-guest -n openshift-virtualization-os-images -oyaml apiVersion: image.openshift.io/v1 kind: ImageStream metadata: annotations: openshift.io/image.dockerRepositoryCheck: "2025-12-10T17:32:28Z" creationTimestamp: "2025-12-09T00:42:41Z" generation: 4 labels: app: kubevirt-hyperconverged app.kubernetes.io/component: compute app.kubernetes.io/managed-by: hco-operator app.kubernetes.io/part-of: hyperconverged-cluster app.kubernetes.io/version: 4.20.3 name: rhel9-guest namespace: openshift-virtualization-os-images resourceVersion: "54248360" uid: effd91b3-df58-469f-899d-b743067c9935 spec: lookupPolicy: local: false tags: - annotations: null from: kind: DockerImage name: registry.redhat.io/rhel9/rhel-guest-image  <== ここに注目 generation: 4 importPolicy: importMode: PreserveOriginal scheduled: true name: latest referencePolicy: type: Source status: dockerImageRepository: "" tags: - items: - created: "2025-12-09T00:42:45Z" dockerImageReference: registry.redhat.io/rhel9/rhel-guest-image@sha256:ab4ec16077fe00e3c7efd0b2f6a77571f3645f5c95befc4d917757dc88b2f423 generation: 4 image: sha256:ab4ec16077fe00e3c7efd0b2f6a77571f3645f5c95befc4d917757dc88b2f423 tag: latest はい、この ImageStream は、 registry.redhat.io/rhel9/rhel-guest-image というコンテナイメージを Pull していることがわかります。 イメージの自動アップデート このようになんだかんだありますが元は registry.redhat.io にあるコンテナイメージを引っ張ってきていることがわかりました。 ちょっと待てとここで相席食堂的に止めたい方、鋭いです。 ImageStream が参照しているコンテナイメージのパスには、タグがありません。これはつまり、暗黙的に latest のイメージを Pull していることになります。 実際、上の ImageStream の status.tags.items[].tag を見ると、 tag: latest と書かれています。 これはつまり、 registry.redhat.io/rhel9/rhel-guest-image が、新しいイメージに update したら、自動的にアップデートされるということになります。 ゆえに テンプレートで参照しているゲスト OS イメージもアップデートされる んですね。 セキュリティパッチや最新のマイナーバージョンがリリースされた際に、VM テンプレートから常に最新の、そしてより安全なゲストOSイメージを利用できるという点で、これは非常に便利です。お為ごかしでもなんでもなく、本当に。 しかしユーザーさんにとっては「こちらにも都合があるので勝手に上げられるのは困るんだが」という方も少なくないでしょう。 そういった場合は、このように GUI の Virt の設定画面から、各イメージごとに自動アップデートを止めることができます。 設定 > クラスタ > 一般設定 > テンプレートとイメージの管理 > イメージの自動ダウンロード このトグルスイッチを Off にすると該当する DataImportCron が単純に削除されるだけなので、 oc delete dataimportcron xxx でも大丈夫です。 独自のゲスト OS イメージを利用する 標準のテンプレートで提供されていない OS や、カスタマイズした独自のゲスト OS イメージを登録して使いたいというニーズは少なくありません。というかほとんどそうだと思います。 しかしこんなコンテナイメージにして云々、というのはちょっと。。。と思われるかも知れません。 ですが、私は先ほどにサラッと流しましたがこう書きました。「ゲスト OS イメージをコンテナイメージとして扱う必要性はない」 そうです。別にコンテナイメージにして扱う必要は全然無いんです。 可搬性が上がるので複数のクラスタで使う場合はめっちゃ便利なんですが、絶対そうしないといけないということはない。 Virt ではそういう場合でも簡単に独自のゲスト OS イメージを作ることができます。 大まかな流れは以下のとおりです。 既存イメージの準備 :利用したいゲスト OS のイメージファイル( qcow2 や iso` など)を準備します。 PVCへのインポート :準備したイメージファイルを、DataVolume(または CDI のインポート機能)を使って PVC としてクラスタ内にインポートします。 DataSourceの作成 :インポートした PVC を参照する DataSource リソースを作成します。 テンプレートへの差し込み :作成した DataSource を利用するように、カスタムの VM テンプレートを定義します。 独自のゲスト OS イメージを作ってみる。 1. 既存イメージの準備 VMware のテンプレートをそのまま使いたいケースが多いと思うので、それをやってみましょう。 まずは VMware のイメージをそのままインポートすることはできないので、インポートできる形式に変換します。qcow2 にしましょう。 データストアからダウンロードするなり何かしらの方法で対象のテンプレートの vmdk ファイルを入手して、 qemu-img convert コマンドで qcow2 に変換します。 [root@bastion ~]# qemu-img convert -f vmdk -O qcow2 mig-test-rhel.vmdk mig-test-rhel.qcow2 [root@bastion ~]# ls -l mig-test-rhel.qcow2 -rw-r--r--. 1 root root 9437249536 Dec 23 09:36 mig-test-rhel.qcow2 2. PVCへのインポート できあがった qcow2 のイメージをインポートします。 GUI では PVC を作るメニューから、"With Data upload form" を選ぶことでできます。 入手したイメージファイルを upload する。 しばらくすると upload が終わります。 この時点で PVC が作られています。あと自動的に PVC に紐づいた DataVolume も作られていますが、ここでは使わないです。 [root@bastion ~]# oc get pvc,dv -n demo NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/mig-test-rhel-template Bound pvc-fcf0fa64-bc1c-4c6c-9774-3b23e0b74072 316Gi RWX truenas-iscsi-csi <unset> 2m32s NAME PHASE PROGRESS RESTARTS AGE datavolume.cdi.kubevirt.io/mig-test-rhel-template Succeeded N/A 2m32s 3. DataSourceの作成 作られた PVC を指定した DataSource を作ります。こんな具合で spec.source.pvc に指定します。 apiVersion: cdi.kubevirt.io/v1beta1 kind: DataSource metadata: name: my-custom-rhel namespace: demo spec: source: pvc: name: mig-test-rhel-template  # インポート済みの PVC 名 namespace: demo  # PVC がある namespace [root@bastion ~]# oc get datasource -n demo NAME AGE my-custom-rhel 18s 4. テンプレートへの差し込み 独自のゲスト OS イメージを作るのは DataSource まで作れば終わりなのですが、これをテンプレートに差し込んで意味が出てきます。 テンプレートはゼロから自作してもよいですが、標準テンプレートをクローンして編集するのが簡単でよいと思います。 GUI で左メニューから "Template" を開き、"すべてのプロジェクト" を指定すると山のように出ててきます。この中から作りたいスペックに一番近そうなものを選んで、右の ⋮ から "クローン" をします。 必要な情報を入力して独自のテンプレートを作ります。 テンプレートをクローンして独自テンプレートを作る あともう一息です。テンプレートの画面が表示されるので "パラメータ" タブに移動して、 "DATA_SOURCE_NAME" と "DATA_SOURCE_NAMESPACE" に、先程作った DataSource の情報を入力します。 パラメータタブで DataSource を指定する 以上で独自のゲスト OS イメージからなるテンプレートを作ることができました。 まとめ 標準のゲスト OS イメージは最初は便利ですが、本格的に本番運用するにはやっぱり独自のイメージを使うことになるでしょう。 ただ独自の OS イメージの管理をインフラ部門が一元的にやるにはメンテが結構大変だという話は聞きます。 なので、コンテナ的な運用管理のスタイルで、ユーザーさんが好きなように独自のイメージを作って管理してもらうというやり方はどうかなと考えます。 具体的には、インフラ部門側は標準のテンプレートをベースの具材として品揃えを管理しつつ、ユーザーさんにセルフサービスでテンプレートを作る方法を提供する、というパターンです。 ガバナンスの面から実現は難しいかもしれませんが、こういったアプローチなど使って従来の運用管理を新たなスタイルに変えていく営みは大事かなと考える年末です。 ということで今日はここまで。
Apache Camel Advent Calendar 22日目の記事は、サポート担当古市が担当します。 テーマは、「Camel を trace」 いわゆるマイクロサービスアーキテクチャーのような、自立した各サービスがネットワークを通して他サービスと連携しながら全体として1つのアプリケーションのように機能する場合、OpenTelemetry のようなトレーシングが必要になるかと思います。 2019年と古い記事ですがコンセプトは変わりませんので、そもそもトレーシングを含むオブザーバビリティー(可観測性)について解説が欲しいという方は、こちらをご覧ください。 rheb.hatenablog.com そんなオブザーバビリティー(可観測性)の要素となる機能をまとめた camel component(camel-observability-services) が提供されているのをご存知でしょうか。 これ1つ pom.xml に加えれば大丈夫という便利なものです。コミュニティーブログで紹介されています。 camel.apache.org 製品版となる Red Hat Build of Apache Camel(RHBAC)では、4.10 からサポート対象となっています。 docs.redhat.com https://docs.redhat.com/en/documentation/red_hat_build_of_apache_camel/4.14/html/red_hat_build_of_apache_camel_for_spring_boot_reference/csb-camel-observability-services-component-starter docs.redhat.com Openshift や k8s 環境がない場合でも、docker を使い簡単にトレーシングをお試しいただくサンプルが公開されています。 github.com 手順に従うだけで動作確認ができますので、ご興味のある方はお試しください。 明日の advent calendar 23日目では、「Camel x AI / Project Wanaku」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com
Red Hat のソリューションアーキテクトの瀬戸です。 これは Jakarta EE / Java EE - Qiita Advent Calendar 2025 - Qiita の21日目の記事です。 Jakarta EE / Java EE - Qiita Advent Calendar 2025 - Qiita の14日目の記事で Jakarta変換に使われるツールの比較 #Java - Qiita という記事を書いていただき、その中でRed Hatも開発しているKonveyorについても軽く紹介していただきました。 今回は、そのKonveyorにAI対応の機能を追加するKonveyor AIの機能がRed Hat側での検証が終わり、 Developer Lightspeed for Migration Toolkit for Applications として最近GAしたので紹介します。 Migration Toolkit for Applications(MTA)とは Migration Toolkit for Applications(MTA)はアプリケーションのクラウド移行を手助けするためのツールで、以前から何回か紹介してきました。その中にはどれくらいアプリケーションのクラウドへの移行の準備ができているか、アプリケーションが変更しやすいようになっているかをアセスメントする機能や、アプリケーションを移行するときにどういった修正が必要になるかを静的解析で見つける機能があります。 どのような事が出来るかの詳細については次の記事を見てください。 rheb.hatenablog.com rheb.hatenablog.com rheb.hatenablog.com ※古い記事の場合、使われているコマンドの互換性がない場合があるのでご注意ください。 Developer Lightspeed for Migration Toolkit for Applications(Developer Lightspeed for MTA)とは MTAは静的解析を行い、アプリケーションにどのような修正が必要なのかを見つけ出してくれますが、見つけ出し、直し方のガイダンスを出すだけでした。 そのため、実際の修正については最初に紹介した Jakarta変換に使われるツールの比較 でも紹介されているような変換ツールを使う必要があり、変換ツールが対応していない場合は、ガイダンスを読みながら実際の修正内容を考える必要がありました。 今回、Developer Lightspeed for MTAはその修正をAIに任せてしまおうというVSCode用のプラグインとなります。 他のAIツールとは何が違うの? と、単純に変更をAIに任せようとなると他のAIツールでも出来るんじゃないか?と思われる方も多いかもしれません。Developer Lightspeed for MTAの強力な部分は、MTAと連携して修正するところにあります。 AIはコンテキストが狭まるほどに性能が上がるという事はご存知でしょうか? 例えば、 SpringをQuarkusに変更してください。 よりも、 SpringをQuarkusに変換するために、アノテーションを@Autowiredから@Injectに変更してください。その他に・・・・ の方が、AIは修正を間違えにくくなります。MTAが修正する必要がある箇所を見つけ出してくれ、それをAIに修正指示として伝えてくれるため、AIは間違えにくくなります。 また、クラウドの特定のAIでないと動作しないという事はなく、LLMモデルについては自由に選択でき、ローカルで動作しているものでも使用ができます。ですので、AIを使ってみたら思ったよりも課金されたぞ?みたいなことを防ぐことができます。 ただし、正確性などはAIの性能に依存する点はご注意ください。 実際に使ってみる ということで、実際に使ってみたいと思います。 注意: AI APIサービスへのアクセスが必要になります。OpenAIなどへのアクセス権を持っている事や、ローカルでAIサービスが立ち上がっている必要があります。必要に応じて Podman AI Lab などを使用してください。 注意: 解析に使用するソースコードも必要です。この記事では、 GitHub - ssetoredhat/mtr-example-eap7.4to8.0 を使用しています。 インストール Developer Lightspeed for MTAはVSCode用のMTAプラグインの一部として提供されています。次のページからインストールしてください。プラグインの一覧から検索することもできます。 marketplace.visualstudio.com VSCodeのプラグインの一覧から検索してインストールすることもできます。 MTAインストール Language Support for Java(TM) by Red Hatプラグインのインストールおよび過去バージョンへの戻し MTAプラグインの中ではJavaプラグインに依存していますが、現時点(8.0.2)では、Javaプラグインの最新バージョンに対応していないため、バージョンを戻す必要があります。 プラグインの検索画面から「redhatjava」と入力し、出てきたプラグインを選択①し、 「Uninstall」の横の下矢印を選択して出てきた「Install Specific Version」を選択します。 Javaプラグインの戻し バージョン一覧が出てくるので、1.45.0を選択します。 Java プラグインバージョンの一覧 設定 インストールすると右側にMTAのボタンが出てきます。それ①をクリックして、開いた本のようなアイコン②をクリックすると、MTAの初期画面が表示されます。 この時点ではまだ使用する事が出来ません。追加で設定を行います。 MTAの初期画面 右上の歯車を押します。 設定画面を開く 右側に設定すべき項目が出てくるので、「Configure GenAI Settings」を押します。 設定一覧 AIのAPIとつなぐための設定を行う画面が開きます。OpenAIやAzure/AWS・・・多くのAIにつなぐためのサンプル設定が載っているので、それに合わせて設定します。 AIと接続する設定 参考までにローカルのAIと接続した場合の設定を載せておきます。OpenAI互換のAPIとみなされるため、OPENAIの設定を基に設定し、OPENAI_API_KEYを空のままにしています。 models : local_LLM : &active environment : OPENAI_API_KEY : "" # Required provider : ChatOpenAI args : model : "Granite-4.0-Micro" configuration : baseURL : "http://localhost:65151/v1" ファイルを保存すると反映されます。 &active を付けたものが有効になるので動かない場合は確認してください。 ここの設定の詳細についてはドキュメントを参照してください。 docs.redhat.com 引き続き、「Edit in Profile Mnager」を押します。 設定一覧 ここでは、最初に+New Profileを押し①、Target Technologiesに移行したいテクノロジーを入れます②。 移行したいテクノロジーは他にJava EEからJakarta EE(JBoss EAP7-> JBoss EAP8)の場合にはeap8なども選ぶことができます。必要に応じて他の物を選択してください。 この画面では、保存の操作は必要なく、画面を閉じるだけで保存されています。 プロファイルの設定 実行 ここまで来たらきっと次のような画面が表示されています。そうしたらうまく動作します。 Start①を押し、Run Analysis②を実行します。 解析実行① 解析実行② 解析が終わると、次の画面のように、どのような修正をすればいいのかの一覧を出してくれます。これは、今までのMTAの解析結果と同じものです。 解析結果 右側の「>」をクリックすることで詳細な修正に必要な内容を開くことができます。 また、右側にAIと書かれたスパナを見つけることができるはずです。そちらをクリックすることでAIに修正をそのまま丸投げすることができます。 静的解析の詳細 さて、実際に押してみましょう! ※貼り付けられるファイルサイズの都合上、とても見ずらい AIの修正 最後にはアップデートされたファイルが表示されるので、それをAcceptするだけで修正完了です。 修正されたファイル MTA本体やEclipse-Transformerなどには変換ツールが付いていますが、ある程度の単純な文字列の置換程度が限界でした。しかし、Developer Lightspeed for MTAではAIを使う事で今までより柔軟な修正が可能になりました。 単純にAIを使うよりは、MTAによる静的解析をコンテキストとしてAIに渡しているため、修正内容が安定しやすいというのが特徴です。ただ、「ここを修正してください」というコンテキストのみを渡しています。それに加えて、「こう直すべきだ!」というコンテキストをAIに渡せるように開発されているソフトウェアがあり、Solution Serverと呼ばれています。Solution Serverについての詳細は次の動画を参照してください。(英語です) www.youtube.com Solution Serverは今回は設定していませんが、Solution Serverもテクニカルプレビューとしてリリースされています。使ってみたい人は次のドキュメントを参照して設定してみてください。 RHSC 2025のワークショップでは、このSolution Serverが設定されている状態でワークショップを行いました。 docs.redhat.com また、このツールで正しく修正できるかどうかについてはAIの質に依存します。必要に応じて、性能の良いAIへ切り替えるようお願いします。
※本記事は OpenShift Virtualization アドベントカレンダーの 21 日目の記事です。 qiita.com こんにちは、OpenShift のプリセールスを担当している山川です。 今回は、OpenShift Virtualization の物理 NIC に VLAN サブインタフェースを設定してみたいと思います。 また、Worker Node とストレージアプライアンス間でストレージセッションを張る際などに利用される物理 NIC に対して IP アドレスをアサインする必要があるユースケースを想定し、VLAN サブインタフェースに IP アドレスも設定してみます。 VMware だと VMkernel ポートを利用しながら進めますが、OpenShift Virtualization の場合、本設定で、仮想マシンのライブマイグレーション用ネットワーク、Migration Toolkit for Virtualization でデータ転送を行うネットワーク、iSCSI や NFS で外部のストレージアプライアンスのネットワーク設定を進めます。 なお、ストレージアプライアンスとの接続に関しては、ストレージメーカーがサポートする CSI ドライバーの仕様によって、セカンダリネットワークが利用可能かどうかをチェックしていただく必要があります。 ネットワークを何も意識せずに CSI ドライバーをインストールしていただくと、デフォルトでプライマリネットワークが利用されるケースがほとんどです。 また、セカンダリネットワークが利用が可能な場合、OpenShift がサポートする CNI プラグイン (bridge、ovs bridge、macvlan 等) が何かを確認いただく必要がございます。 CNI プラグインによってネットワークの挙動が変わるため、各マニュアルを参照しながら用途との互換性を確認するようお願いします。 CNI プラグインについては、下記のドキュメントを参照ください。 3.2. 他の CNI プラグインを使用したセカンダリーネットワークの作成 | 複数ネットワーク | OpenShift Container Platform | 4.20 | Red Hat Documentation ライブマイグレーション用ネットワークを設定する方法については、下記をご参照ください。 10.14. ライブマイグレーション用の専用ネットワークの設定 | Virtualization | OpenShift Container Platform | 4.20 | Red Hat Documentation Migration Toolkit for Virtualization 用ネットワークを設定する方法については、下記をご参照ください。 10.7. OpenShift Virtualization プロバイダーの移行ネットワークの選択 | Red Hat OpenShift Virtualization への移行の計画 | Migration Toolkit for Virtualization | 2.10 | Red Hat Documentation 利用するネットワーク関連のリソース 利用するリソースは、下記ブログと同じく NodeNetworkConfigulationPolicy (NNCP) と NetworkAttachmentDefinition (NAD) を利用します。 rheb.hatenablog.com NNCP を用いると、NIC 冗長化 (bond)、VLAN サブインタフェース、Bridge の作成、VLAN サブインタフェースに割り当てる静的 IP アドレスの設定が可能です。 NAD を用いると、各ユースケースで必要な機能を実現するための Pod (コンテナ) と VLAN サブインタフェース経由で外部ネットワーク通信とさせることが可能です。 それでは実際に設定を入れていきたいと思います。 今回は、仮想 L2 スイッチの挙動をする bridge type の CNI プラグインを利用し、VLAN サブインタフェースを設定しています。 VLAN サブインタフェースの設定 冗長化したいインタフェースの bond、VLAN サブインタフェース bond.vlanid、および Linux Bridge を作成するための yaml ファイルを用意し、oc apply -f .yaml コマンドを実行します。 VLAN サブインタフェースごとに IP アドレスを指定する場合は、Worker Node に個別の IP アドレスを指定する必要があるため、設定が必要な Worker Node 分の NNCP の設定ファイルを用意しましょう。 なお、NIC の冗長化が不要な場合は bond セクションに記載の内容をスキップし、vlan サブインタフェースのセクションに物理インタフェースの名前を設定します。 apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: bridge-vlan20-worker-01 spec: nodeSelector: kubernetes.io/hostname: "worker-01.domain" # Worker Node の FQDN を設定 desiredState: interfaces: - name: bond1 # bond を作成 type: bond # type を bond と指定 state: up link-aggregation: mode: 802.3ad # 802.3ad (LACP) mode の設定例 options: miimon: '100' # リンク監視 (故障検知) の間隔を指定 port: - ens2f0 # 冗長化したい物理 NIC の1 つ目を指定 - ens3f0 # 冗長化したい物理 NIC の2 つ目を指定 - name: bond1.20 # VLAN サブインタフェースを作成 type: vlan state: up vlan: base-iface: bond1 id: 20 # VLAN ID を指定 - name: br-vlan20 # Linux Bridge を作成。NAD で macvlan、ipvlan 等を選択する場合は不要。 type: linux-bridge state: up bridge: port: - name: bond0.20 ipv4: enabled: true address: - ip: 192.168.0.20 # ノードに割り当てるIPアドレスをして prefix-length: 24 次に NAD を設定します。 apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: bridge-vlan20-network namespace: default spec: config: |- { "cniVersion": "0.4.0", "name": "bridge-vlan20-network", "type": "bridge", # linux bridge の場合は bridge type を指定 "bridge": "br-vlan20", # NNCP で作成した bridge name を指定 "master": "bond1.20", # NNCP で作成した VLAN インタフェースを指定 } 一般的には、今回作成した VLAN サブインタフェース経由での通信が必要な Pod の metadata.annotations に NAD の metadata.name を指定いただくことが必要になると思います。 ただし、設定方法は Operator によって異なっている可能性があるため、各機能の設定マニュアルを注意深く読んでいただくことを推奨します。 今回の設定は、Pod と外部のネットワークセグメントが 1 つであることが前提でした。 別のネットワークへのルーティングが必要な場合は、Next Hop を指定する設定を追加していく必要がありますが、今回は割愛しています。 まとめ 今回は、VLAN サブインタフェースの設定方法について見てみました。 物理 NIC の用途を分けたいユーザーには必須の知識になると思いますので、ぜひ、内容をキャッチアップください。
Apache Camel Advent Calendar 21日目の記事は、サポート担当古市が担当します。 テーマは、「hawtio を使ったモニタリング」 Camel CLI を使い Camelルートの状況を監視することはできますが、Web UI で確認されたいというユーザー向けに hawtio が用意されています。Red Hat Fuse 6.x 時代から提供されている管理コンソールですので、馴染みのある方も多いのではと思います。2023年の終わりに hawtio 3.0.0 GA が登場し、内部アーキテクチャーが一新されたのも記憶に新しいです。( 執筆時点では、4.6.1 がリリースされています。 ) そもそも hawtio とは何か、開発者による詳細解説記事がありますので、まずはこちらをご確認ください。 zenn.dev hawtio は、3種類の配備方法があります。 Camel CLI Embedded Online Camel CLI 先ほどご紹介した記事でも触れていますが、camel-jbang を使い実行中のインテグレーションに対して hawtio を使いモニタリングすることができます。 camel.apache.org CLIを使いインテグレーションを試しつつ、GUIでメトリックスを確認するといった開発ケースに最適ではないでしょうか。また、kaoto は Camel Java DSL に非対応ですが、hawtio はどの Camel DSL でもグラフ表示しますので、Camel Java DSL ユーザーには嬉しい選択肢かと思います。記事では Discover を使った接続を紹介していますが、マニュアルでコネクションを作成する方法を試してみます。 まず、インテグレーションを起動し、jolokia をアッタッチします。その際に出力されるポート番号(ここでは、8778)はメモしておく必要があります。 % camel init Hello.java % cat Hello.java import org.apache.camel.builder.RouteBuilder; public class Hello extends RouteBuilder { @Override public void configure() throws Exception { from("timer:java?period=1000") .setBody() .simple("Hello Camel from ${routeId}") .log("${body}"); } } % camel run --background Hello.java Running integration with the following configuration: --camel-version=4.14.0 Running Camel Main: Hello in background with PID: 3885 (waiting to startup) Camel Main: Hello (state: Running) % camel ps PID NAME READY STATUS AGE TOTAL FAIL INFLIGHT 3885 Hello 1/1 Running 9s 8 0 0 % camel jolokia 3885 Started Jolokia for PID 3885 http://127.0.0.1:8778/jolokia 次に hawtio を起動します。 % camel hawtio 自動でブラウザーが起動するはずですので、コネクションを追加します。 これで、稼働中の Hello.java を WebUI経由でモニタリングできます。 Embedded runtime に hawtio を組み込み起動する方法です。複数 runtime を起動した場合、それぞれに hawtioが組み込まれます。 github.com github.com Online Openshift上に hawtio pod を配備し、そこから 稼働中の 各 camel runtime の jolokia と通信しモニタリングする方法です。 https://docs.redhat.com/en/documentation/red_hat_build_of_apache_camel/4.10/html/hawtio_diagnostic_console_guide/setting-up-hawtio-on-openshift-4 docs.redhat.com 明日の advent calendar 22日目では、「Camel を trace」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com
※本記事は OpenShift Virtualization アドベントカレンダーの 20日目の記事です。 qiita.com 目次 目次 はじめに 【積極採用中!】Red Hat 採用に関するお知らせ この記事のゴール 本記事の情報源となる役に立つリンク集 v4.21 (リリース日 2026年03月27日) - AIアシストと複数クラスター管理、そしてGoogle Cloudへの展開で攻勢をかける v4.20 (リリース日 2025年10月21日) - よりvSphereのような使い勝手の追求とストレージオフロードによる移行の超高速化 v4.19 (リリース日 2025年06月17日) - UI刷新、多言語サポートによる安心の日本語対応 v4.18 (リリース日 2025年02月25日) - 市場最安値!仮想マシンのためのOpenShift 新エディションが登場 v4.17 (リリース日 2024年10月01日) - 待望の仮想マシンのストレージマイグレーションが登場 v4.16 (リリース日 2024年06月27日) - パートナー製品との連携もしっかりアピール! v4.15 (リリース日 2024年02月27日) - パブリッククラウド風な使い勝手に! v4.14 (リリース日 2023年10月31日) - WindowsゲストOSのクラスターのサポート! 今後の本記事の更新予定 はじめに 皆さんこんにちわ、Red Hat Global Learning ServicesでLearning Solution Architectを担当している坂井 大和( @lab8010 )です。 主に X.com 上でRed Hat製品やサービスについて配信をしているので、もしよければフォローくださると幸いです。 この記事では、 『Red Hat OpenShift Virtualizationがこれまでどのように機能強化されてきたか?』 という疑問に対して各バージョンにコメントをしつつ解説します。 市場においてOpenShift Virtualizationの立ち位置はサーバ仮想化製品としては歴史のあるテクノロジーを携えてはいるものの、マーケットの中での認知度はこれから伸ばしていく必要があります。 そこでこの記事の狙いは、どのような速度で成長し、どのような機能が追加されていったのかをこの1つの記事で俯瞰して見ることができるようにしています。 なお、この記事では特にオンプレミス環境における仮想化基盤管理者にとって嬉しい機能や注目すべき機能をピックアップしてご紹介いたします。 【積極採用中!】Red Hat 採用に関するお知らせ Red Hatでは事業拡大に伴い人材を募集しています。 本記事でご紹介している『OpenShift Virtualization』に関するコンサルタントを募集しています。もし少しでも興味がある方は、ご応募または本記事を執筆している私坂井までお気軽にDMをください。( X / Linkedin ) この記事のゴール この記事を読み終わった頃には、読者様が次のことが出来る状態になって頂きたいと考えています。 Red Hat OpenShift Virtualizationの成長の過程を理解する 同製品が競合の仮想化基盤とどのような点が共通しており、どのような違いがるかを理解する なお、本記事は可能な限りアップデートをしていく予定も考えており、また初回投稿時点では部分的な情報を優先して投稿します。よって時間をかけて記事の中に全ての情報が含まれる形とする予定です。 それでは、早速本編に入っていきましょう。 本記事の情報源となる役に立つリンク集 The official Red Hat blog OpenShift - YouTube Red Hat Livestreaming (@redhatlivestreaming) on Speaker Deck Product Life Cycles | Red Hat Customer Portal v4.21 (リリース日 2026年03月27日) - AIアシストと複数クラスター管理、そしてGoogle Cloudへの展開で攻勢をかける www.youtube.com speakerdeck.com   注目の機能は次の通りです 複数のOpenShiftクラスターをまたいだ仮想マシンの一元管理(マルチクラスター管理) クラスター間でのライブマイグレーション(ダウンタイムゼロでの仮想マシン移送)の正式サポート AIアシスタント『 OpenShift Lightspeed 』のOpenShift Virtualization UIへの統合 Change Block Tracking(CBT)によるストレージ非依存のインクリメンタルバックアップ(TechPreview) MIG vGPU による仮想マシンへのGPUリソース分割割り当てのサポート Google Cloud ベアメタルインスタンス上でのOpenShift Virtualizationのサポート IPv6シングルスタック対応(コントロールプレーン・セカンダリネットワーク) ネットワーク構成UIの刷新(物理・仮想ネットワーク作成ウィザードの追加) www.redhat.com 本バージョンは、『管理の集約』と『AIの活用』という2つのキーワードが象徴するアップデートとなりました。 まず注目したいのが、 クラスター間ライブマイグレーションの正式サポート です。v4.20でも同一クラスター内での移行先ホスト指定がサポートされていましたが、今回はその対象が複数のOpenShiftクラスター間に拡大されました。 VMware vSphereにおけるvCenter/vMotionの世界では、複数クラスター間でのvMotionは『Enhanced vMotion』として古くからサポートされる機能です。今回のアップデートにより、同等の操作体験がOpenShift Virtualizationにおいても実現されたと言えます。 この機能は、以下のようなシナリオで特に威力を発揮します。 ハードウェアのメンテナンスウィンドウ中に、業務を止めることなく仮想マシンを別クラスターへ退避させたい データセンターやリージョン間のリソースバランスを動的に調整したい 次に目を引くのが、 OpenShift Lightspeedのvirtualization UIへの統合 です。 OpenShift Lightspeedは、Red HatがOpenShiftに組み込んだ生成AIによる運用支援機能です。従来は別画面での操作や手動によるログファイルのアップロードが必要でしたが、今回の統合により、仮想マシン管理画面の中でそのままAIによるトラブルシューティングの支援を受けられるようになりました。 エラーの内容を確認しながら、その場でAIに相談できる、という体験はこれまでのハイパーバイザーには存在しなかったアプローチです。仮想化基盤管理者の日々の運用負荷軽減に直結する可能性を秘めた機能と言えるでしょう。 3点目として、 Change Block Tracking(CBT) の導入(TechPreview)についても触れておきたいと思います。 CBTは、ディスク全体ではなく『変更があったブロックだけ』をバックアップ対象とすることで、バックアップ時間とストレージ消費量を大幅に削減する仕組みです。 VMware vSphereにおいても同名の『 Changed Block Tracking 』という機能が存在し、Veeam Backupをはじめとするサードパーティのバックアップ製品が広く活用しています。 今回のOpenShift VirtualizationにおけるCBTの特徴は、 特定のストレージ製品に依存しない形で実装されている という点です。ストレージベンダーを問わず活用できる汎用的なアプローチは、マルチベンダー構成が一般的なエンタープライズ環境においてより大きなメリットをもたらします。 4点目として、 Google Cloud ベアメタルへの展開サポート が追加されました。 物理サーバー相当の専用ハードウェア上にOpenShift Virtualizationを展開することで、クラウドに仮想マシンを移行しながらも、ネストされた仮想化によるオーバーヘッドを回避できる構成です。 これにより、オンプレミスの物理サーバーで動作していた仮想マシンを、パフォーマンス特性を維持したままGoogle Cloudへ移行するという選択肢が現実的なものとなりました。 なお、v4.21のリリースはKubernetes 1.34およびCRI-O 1.34をベースとしており、OpenShift 4.21プラットフォーム全体としてもAI・コア・仮想化の3軸での強化が図られています。 v4.20 (リリース日 2025年10月21日) - よりvSphereのような使い勝手の追求とストレージオフロードによる移行の超高速化 www.youtube.com 注目の機能は次の通りです 仮想マシンのライブマイグレーション時に移行先ホストが指定可能となる この機能はvSphere vMotionと同等の機能になったと言える 2ノードと調停ノードによる小規模クラスターのサポート ARM対応のOpenShiftノードの対応 他のハイパーバイザーからの仮想マシン移行時のストレージオフロードサポート www.redhat.com 本バージョンでは、Two-node OpenShift with arbiterと呼ばれる構成がサポートされるようになりました。 Kubernetesの世界ではクラスターの制御層(コントロールプレーン)のために3台のホストからなるetcdクラスターが必要です。 etcdは、Kubernetesクラスター全体の構成情報を含む重要な要素です。 www.redhat.com etcd.io 3台のノードによりetcdを保護する理由は、 ノード障害時のスプリットブレインの回避が目的 *1 です。 今回のアップデートでは、2台のノードと1台のスプリットブレイン回避用のノードを用意することで、より小規模なクラスターでもOpenShift環境を動かすことが可能となりました。 この構成は、VMwareのvSANというSoftware-Defined Storageにおいて登場した構成である 2 node vSAN と非常に近い考え方 です。 上述の設計でも2つのワークロード用のノードと、スプリットブレイン回避用の小規模ノードで小さなクラスターを構成できる利点があります。 これらの2ノード+小規模ノード1台の構成は、OpenShift環境における最安値であるエディションのOpenShift Virtualization Engine(OVE)と組み合わせることで、より一層コンパクトのOpenShift Virtualization環境を作ることに一役買ってくれることになりそうです。 2つ目のアップデートである ARM対応のOpenShiftノード の対応により、新たなOpenShiftの選択肢が登場したと言えます。以下の動画よりデモが閲覧できます。 interact.redhat.com 3つ目のアップデートとして解説をしたストレージオフロードを使用した仮想マシンの移行は、特定の物理ストレージの中にあるVMware vSphereの仮想マシンのvmdkファイルを同一筐体内にてOpenShift Virtualizationの仮想マシンデータに変換させる働きをします。 www.hitachivantara.com この機能は、vSphereにおけるVAAIやMicrosoftにおけるODXなどのストレージオフロード機能と同等であり、大量のデータ処理を当該ストレージ内で完結できることから、次の利点があります。 データ移行の速度が高速である データの処理のための通信が筐体外に出ない(ネットワークへの負荷がない) データの処理のために、ホストのCPUリソースが節約される(仮想マシンのパフォーマンス低減リスクが減る) v4.19 (リリース日 2025年06月17日) - UI刷新、多言語サポートによる安心の日本語対応 www.youtube.com 注目の機能は次の通りです シンプルな仮想マシン管理画面 英語以外の言語に対する強化された言語対応(スペイン語、フランス語、日本語、韓国語、中国語) www.redhat.com このバージョンでは、UI周りの強化が特徴的だと言えます。 VMware vSphereのような使用感に近づけるためには、やはり日本語化の対応やより直感的なUIを目指す必要があります。具体的なUIの様子については以下の記事に詳しい解説がありますのでぜひご覧ください。 rheb.hatenablog.com v4.18 (リリース日 2025年02月25日) - 市場最安値!仮想マシンのためのOpenShift 新エディションが登場 www.youtube.com 注目の機能は次の通りです サーバ仮想化のためのOpenShift 『OpenShift Virtualization Engine』が登場 仮想マシンでのUser-defined tenant networkのサポート対応 vTPM対応と最新のMicrosoft Windows OSへのサポート対応 www.redhat.com この世代では、なんといっても最安値のOpenShiftエディションの登場により低価格でRed Hat OpenShift Virtualization構成が組めるようになりました。   これがOpenShift Virtualization Engineの価格です (1ノード当たり30万円から) ※OpenShiftというRed Hat式Kubernetesの入門エディション ※4つあるオンプレミス向けエディションの中で、仮想マシン実行に振り切ったエディション (次ポストに続く) https://t.co/lNFmXo9UI1 pic.twitter.com/QudFNvPl1N — Yamato@Red Hat/Learning Solution Architect (@lab8010) November 29, 2025 現在のサーバ仮想化マーケットにおいて、ハイパーバイザーのライセンス/サブスクリプション金額はユーザーにとっても大きな関心事です。 Red Hatはそうしたユーザーの課題に対し、新しい低価格なエディションを提供することで、お客様の課題を解決ができるように働きかけています。 2つ目のUser-defined tenant networkですが、コンテナ向けに用意されているUser-defined Network(通称UDN)が仮想マシンにも対応しました、という内容です。 当該の機能については以下のスライドでも解説をしているのでぜひ参考にしてみてください。 speakerdeck.com また、これと同時にWindows 11のようなTPMが必要なOSのためにも、仮想マシンに対し仮想的なTPMを搭載可能ともしました。 pc.watch.impress.co.jp v4.17 (リリース日 2024年10月01日) - 待望の仮想マシンのストレージマイグレーションが登場 www.youtube.com 注目の機能は次の通りです (TechPreview機能として)仮想マシンのためのStorage Live Migrationに対応 メモリのHot-Add (TechPreview機能として)Deschedulerによる仮想マシン負荷分散のための再配置 www.redhat.com この世代では、VMware vSphereでサポートされる幾つかの機能の登場が目立ちます。 特に、Storage vMotionに相当する仮想マシンのライブマイグレーション機能の登場やメモリのオーバーコミット、Hot-Add、これに加えてvSphere DRSを彷彿とさせるDeschedulerによる仮想マシンの負荷分散のための再配置機能は更なるOpenShift Virtualizationの競争力強化に繋がったと言えます。 v4.16 (リリース日 2024年06月27日) - パートナー製品との連携もしっかりアピール! www.youtube.com   注目の機能は次の通りです (TechPreview機能として)メモリのオーバーコミット CPUのHot-Add OpenShift Data Foundation *2 使用時における仮想マシンのためのMetro-DRのサポート OpenShift Virtualizationと連携可能な製品一覧サイトの登場 メモリ、CPU、DRなどはいずれもVMwareをはじめとする他のハイパーバイザーでもサポートされる機能ではあるが、個人的に注目したいのは以下のようなサイトが登場したことで、より一層Red Hat OpenShift Virtualizationが市場に存在する数々の製品と連携ができることが強調され出したことです。 catalog.redhat.com 私がお客様と対話をしていてよく尋ねられることの1つに 『この製品(お客様がお持ちの製品)は、Red Hat OpenShift Virtualizationでも使えるんですか?』 という一言です。 マーケットにおける製品の価格変化を受けて、他の仮想化製品からRed Hat OpenShift Virtualizationへの移行を見据える上での1つの判断材料として、 『既存保有資産の利活用』は欠かせない視点 です。 ただ単純に『今持っているを使うことでのコスト削減』だけに止まらず、『既存資産を活用すること=既存知識の活用』に繋がりますし、それ以外にも『お客様と当該ベンダーの関係の活用』にも繋がるからです。 お客様の目線に立てば、今までお付き合いのある製品やその企業の頼れる担当者もこれまで通り一緒になって自社のビジネス成長の支えになってくれると嬉しいですよね。 v4.15 (リリース日 2024年02月27日) - パブリッククラウド風な使い勝手に! www.youtube.com 注目の機能は次の通りです パブリッククラウドのようなビューからの仮想マシンの作成(インスタンス形式) 仮想マシンに対するセカンダリ仮想ネットワーク(Bridge/SR-IOV)のHot Plug このアップデートで登場した『パブリッククラウドのようなビューからの仮想マシンの作成(インスタンス形式)』は、 AWS EC2 や Microsoft Azure Virtual Machines などが提供する仮想マシンホスティングサービスでも使用されるインスタンス式による仮想マシン展開サイズの指定が可能となりました。 一言で言えば、 パブリッククラウドのような使用感で使える仮想化基盤 になったと言えます。 現在市場に存在する殆どのハイパーバイザーでは仮想マシンを作成する際に、こうしたカタログベースでの仮想マシンの展開はできません。 VMware by Broadcomに限って言えば、VMware Aria Automationが持つセルフサービス ポータル機能はこれに近いと言えます。 youtu.be 違いがあるとすれば、VMware Aria Automationの場合は次のような点です。 VMware vSphereの標準機能ではなく、上記機能を使うためには Aria Automation実行のための専用仮想マシン を実行する必要がある VMwareのセルフサービスポータルでは、vSphereだけでなくパブリッククラウドなどの他のサービスもカタログに含めることができる v4.14 (リリース日 2023年10月31日) - WindowsゲストOSのクラスターのサポート! www.youtube.com   注目の機能は次の通りです ROSA/AWS上におけるOpenShift Virtualizationのサポート OpenShift Virtualizationにおける HCP 構成のサポート OpenShift Virtualization上のゲストOSとしてのWindows Serverによるクラスター構成のサポート OpenShift純正の仮想マシンインポート機能の強化(他のOpenShift、OpenStack、OVA形式のインポートのサポート) developers.redhat.com この世代でユニークなアップデートは、ゲストOSとしてのWindows ServerによるWSFCの構成がサポートされたことです。 これについては、実はVMware vSphereでもサポートされている特性です。 VMware®vSphere® への WSFC の導入方法 - VMware by Broadcom VMware vSphereには、 vSphere HA や vSphere FT といった強力なハイパーバイザーレベルの高可用性のための機能が存在します。 もしRTO 0秒相当の可用性が必要な場合は、vSphere FTが適切な選択肢となりますがvSphere FTを利用する場合は利用上の制約があります。 Fault Tolerance の要件と制限 - VMware by Broadcom この制約に依存しない形式で同等の高可用性を実現しようとする場合はゲストOSによるクラスタリングが必要となり、vSphereでもこれに対応しています。 Red Hat OpenShift Virtualizationでもこれと同じように、ゲストOSレベルのクラスタリングが必要な方に向けてWindows ServerとRHELのクラスタリングに対応しています。 なお、RHELを使用したゲストOSレベルのクラスターについては以下の記事でも紹介されているため、ご興味がある方はぜひご覧ください。 qiita.com なお、ゲストOSレベルのクラスタリングに焦点を当てましたが、他のアップデートを見てみると、OpenSift Virtualizationの展開形式やインポート可能な仮想基盤の形式も増え、より一層拡張性が強化された世代とも言えます。 今後の本記事の更新予定 本記事投稿日である12月25日時点ではv4.14からv4.20までの掲載ですが、これ以降も他のバージョンの情報も掲示予定です。 OpenShift Virtualizationは、KVMやQEMU、Kubernetesなどの市場では幅広く使用されているテクノロジーの結集ではありますが、仮想化基盤製品としては比較的新しいものです。 そのため、既存のメジャーなハイパーバイザーと同等の使用感、機能を持っているのかどうか?という疑問は多くあります。 この記事を通じて、『お、OpenShift Virtualization、なかなかやるな』と思われるような驚きと発見、そして製品の魅力を伝えていけるよう更新を頑張っていこうと思います。   *1 : ノード総数が奇数であることにより、障害発生時にノード数による多数決に基づく制御層の決定が可能 *2 : Red Hatが提供するCephをベースとしたSoftware-Defined Storage機能
Apache Camel Advent Calendar 20日目の記事は、サポート担当古市が担当します。 テーマは、「kaoto のお気に入り機能ベスト3」 インテグレーション系製品サポートを通し、古くは Eclipse plugin で提供された JBoss ESB 用エディターから使っている自分が kaoto を使った感想ですが、今までにない新機能を持ち、かつユーザーフレンドリーな動作が急ピッチで整備されている今後のバージョンアップが非常に楽しみな GUIエディターです。 2024年に少し触って遠ざかっているユーザーも中にはいるかと思いますが、まだ使い込んでいない皆さん向けに個人的に気に入っている機能を3つ紹介します。(ドキュメント生成機能は紹介済みなので、ここでは省きます。) 1: Drag & Drop Support 実装中の camel エンドポイントの順番を変えたいときなど、マウスを使ったドラッグ&ドロップでエンドポイントの置き換えが可能になりました! 指定したCamelライブラリーのバージョンに連動してカタログに列挙される camel component が変わるなどクールな機能を提供する反面、こういった基本的な操作にストレスを覚えていた自分にとっては朗報でした。途中でイライラしてテキストエディターで修正してしまうこともなくなります。 youtu.be 2: Form and UI Enhancements 入力保管がかなり強力になり、application.properties に定義された内容も保管対象となりました。 入力保管が充実したテキストエディターが一般的なので、GUIエディターでもこのような保管機能が充実してくると非常に助かります。 youtu.be 3: Data Mapper JSON Support (Tech Preview) Data Mapper の JSONサポートを待ちわびていたユーザーも多いのではないでしょうか。これをお気に入り機能から外すわけにはいきません。 youtu.be Data Mapper や kaoto の開発スピードは速いので、kaotoのリリースノートを毎回チェックするなど、watch することを強くお薦めします。 kaoto.io Apache Camel コミュニティーはもちろん、kaoto コミュニティーも非常にオープンで、ユーザーの声に耳を傾けてどういった対応が可能か都度考えてくれます。サポート業務を通して開発チームと接する機会が多いですが、日本ユーザーの声がコミュニティーへ多数反映されていることを非常に嬉しく思います。 引き続き、 この機能があればもっと便利になる 理解し難い動作 この機能は最高 と言ったフィードバックをコミュニティーへフィードバックしていただけたら幸いです。もちろん、製品サポート窓口へのフィードバックもお待ちしております。今後も、オープンソースコミュニティーらしい活動が日本からも起きることを願います。 明日の advent calendar 21日目では、「Hawtio を使ったモニタリング」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com
OpenShift Advent Calendar 2025 19日目の記事です。 前日に引き続き、志田が担当させていただきます。よろしくお願いします。 qiita.com はじめに なぜオペレーターのバージョン固定が必要なのか? オペレーターのバージョンを固定する手順 準備:ツールのインストール ① カタログインデックスイメージのビルド ② カスタムカタログを使ったイメージのミラーリング (Mirror to Disk) ③ インターナルレジストリへのミラーリング (Disk to Mirror) まとめ はじめに 昨日の記事 では OpenShift で使用するコンテナレジストリについて触れましたが、今回はそのレジストリに対してコンテナイメージをミラーリングする際に使用される oc-mirror v2 について書いていきたいと思います。 特に、エアギャップ(非インターネット接続)環境における oc-mirror v2 の重要なユースケースとして、ミラーするオペレータイメージのバージョンを固定する方法をご紹介します。 なぜオペレーターのバージョン固定が必要なのか? 通常、インターネット接続環境では Operator Lifecycle Manager (OLM) がカタログ内の最新更新を自動検知します。しかし、ミラーするオペレーターのバージョンを明示的に固定しないと、以下のような課題が発生します。 予期せぬアップデート : チャンネル指定のみの場合、ミラーリングのたびに「最新バージョン」が取得されます。検証前のバージョンが本番レジストリに入り、意図せず適用されるリスクがあります。 ストレージの圧迫 : 全バージョンをミラーリングし続けると、レジストリの容量を激しく消費します。 再現性の欠如 : 実行タイミングによって取得バージョンが異なるため、環境間の構成管理が困難になります。 しかし、通常の oc-mirror v2 では minVersion の指定はできても maxVersion の指定(範囲の絞り込み)は、カタログの更新グラフを分断してしまう可能性があるため、慎重に行う必要があります [1]。 Red Hat 公式の KCS(7112219) では、この問題を回避しつつ確実にバージョンを固定するためのベストプラクティスが紹介されています。本記事ではこの KCS の手法をベースとした手順をご紹介します。 [1] minVersion と maxVersion で範囲を絞ると、「複数のチャンネルヘッド(終点)が存在する」というエラー(multiple channel heads error)が発生することがあります。これは既知の問題として OpenShiftドキュメント でも言及されています。 オペレーターのバージョンを固定する手順 以下のエアギャップ構成を想定して手順を進めます。 準備:ツールのインストール oc および oc-mirror v2 plugin : Red Hat Hybrid Cloud Console から取得。 opm : OpenShift mirror site から取得。 podman : イメージビルドに使用。 ① カタログインデックスイメージのビルド Red Hat 標準カタログは全データが含まれ肥大化しているため、必要なオペレーターのみを抽出した 「カスタム・カタログインデックス」 を自作し、ミラーリングのソースにします。 ミラーしたいオペレーターとバージョンを定義した imageset-config.yaml を用意します。 kind : ImageSetConfiguration apiVersion : mirror.openshift.io/v2alpha1 mirror : operators : - catalog : registry.redhat.io/redhat/community-operator-index:v4.20 packages : - name : grafana-operator defaultChannel : v5 channels : - name : v5 minVersion : '5.14.0' maxVersion : '5.14.0' フィルタリングされたカタログ定義を抽出します。 mkdir $HOME/mirror-work-dir oc-mirror --v2 -c imageset-config.yaml --dry-run file://$HOME/mirror-work-dir 抽出されたファイルからカタログインデックスイメージをbuildするためのdockerfileを作成します。 export VERSION=v4.20 # 実際のパスを確認して設定 export CATALOGDIR=$(find $HOME/mirror-work-dir/working-dir/operator-catalogs -name "filtered-catalogs" | head -n 1)/$(ls $(find $HOME/mirror-work-dir/working-dir/operator-catalogs -name "filtered-catalogs" | head -n 1)) opm render $CATALOGDIR/catalog-config -o json > $CATALOGDIR/fbc.json opm alpha convert-template basic $CATALOGDIR/fbc.json > $CATALOGDIR/community-operator-index-basic-template.json mkdir -p $CATALOGDIR/expanded-catalog opm alpha render-template basic $CATALOGDIR/community-operator-index-basic-template.json > $CATALOGDIR/expanded-catalog/catalog.json mkdir -p $CATALOGDIR/migrated-catalog opm migrate $CATALOGDIR/expanded-catalog $CATALOGDIR/migrated-catalog cd $CATALOGDIR opm generate dockerfile migrated-catalog -i registry.redhat.io/openshift4/ose-operator-registry-rhel9:$VERSION カタログインデックスイメージをビルドして外部レジストリに push します。 ※ oc-mirror は実行時にソースとなるカタログをレジストリから pull する仕様のため、一度 push が必要です。 podman build -f migrated-catalog.Dockerfile -t quay.external/redhat/community-operator-index:$VERSION-filtered . podman push quay.external/redhat/community-operator-index:$VERSION-filtered ② カスタムカタログを使ったイメージのミラーリング (Mirror to Disk) imageset-config.yaml の catalog を、作成したカスタムイメージに書き換えます。 # imageset-config.yaml (抜粋) mirror : operators : - catalog : quay.external/redhat/community-operator-index:v4.20-filtered packages : - name : grafana-operator # ... 以下略 イメージをローカルに tar アーカイブとして保存します。(Mirror to Disk) oc-mirror --v2 -c imageset-config.yaml file://mirror_images 完了後、 mirror_images/mirror_000001.tar をインターナル環境へ転送します。同時に、ビルドしたカスタムカタログインデックスイメージも podman save 等で抽出し、インターナル環境の内部レジストリに push しておきます。 ③ インターナルレジストリへのミラーリング (Disk to Mirror) imageset-config.yaml の catalog を内部レジストリのパスに書き換えます。 # imageset-config.yaml (抜粋) mirror : operators : - catalog : quay.internal/redhat/community-operator-index:v4.20-filtered # ... 以下略 以下のようにカレントディレクトリに、 imageset-config.yaml とオペレータイメージが格納された mirror_images/mirror_000001.tar があることを確認します。 imageset-config.yaml mirror_images/mirror_000001.tar 内部レジストリへ push を実行します。(Disk to Mirror) oc-mirror --v2 -c imageset-config.yaml --from file://mirror_images docker://quay.internal/mirror # push先レジストリのプロジェクトやネームスペースは環境に合わせて変更してください。 ミラーが完了すると、ImageDigestMirrorSet(IDMS)とImageTagMirrorSetg(ITMS)などのOpenShiftリソースのマニフェストが生成されるので適用します。これらのマニフェストは、OpenShiftからミラーしたカタログを使用するために必要となりますので毎回適用してください。 注意)マニフェストを適用するとOpenShiftノードのローリングアップデートが開始されますのでご注意ください。 cd mirror_images/working-dir/cluster-resources/ oc apply -f idms-oc-mirror.yaml oc apply -f itms-oc-mirror.yaml oc apply -f cs-redhat-operator-index-v4-20-filter.yaml oc apply -f cc-redhat-operator-index-v4-20-filter.yaml oc apply -f cs-community-operator-index-v4-20-filter.yaml oc apply -f cc-community-operator-index-v4-20-filter.yaml これで、エアギャップ環境におけるオペレータバージョンを固定したコンテナイメージのミラーリングが完了です。 まとめ エアギャップ環境での運用は「変化をコントロールすること」が重要です。 oc-mirror v2 と opm を組み合わせたカスタムカタログ手法を活用して、「検証済みのバージョンだけを現場に持ち込む」フローが確立できます。 これにより、レジストリのストレージ節約とインフラの安定稼働を同時に実現できます。 oc-mirror v2 は 2024 年に GA となった比較的新しいツールであり、現在も活発に改善が行われています。将来的にはよりシンプルな手順でバージョン固定ができるようになることを期待しつつ、現時点ではこの「カタログ自作」が最も確実なベストプラクティスと言えます。
Apache Camel Advent Calendar 19日目の記事は、サポート担当古市が担当します。 テーマは、「Kaoto を使った開発」 Camel用 GUIエディターである kaoto を紹介したのは 2024年4月でした。 playintegration.blogspot.com 業務で使われている方や、まだご存知ない方もいらっしゃるでしょう。 サポート窓口を通しての体感で、ユーザーは二極化している印象でした。 GUIでの開発がないとイヤ (Camel XML IO DSL でコーディング) GUIは不要 (Camel Java DSL でコーディング) 今年リリースされた kaoto 2.5 で、kaotoの位置付けが GUI開発ツールに留まらず、ドキュメント生成ツールとして守備範囲を広げました。(執筆時点での 最新版は 2.7 です 。リリースブログには新機能の紹介動画も多数リンクされているので、わかりやすいですよ) こちらの記事でドキュメント生成機能をご紹介しています。 rheb.hatenablog.com 開発と運用チームが分かれており、サポート窓口へ運用チームが問い合わせをする際、精度の高いドキュメントがあればコミュニケーションがよりスムーズになります。 もちろん、開発チーム内でも業務の引き継ぎなどのコミュニケーションが楽になることは間違いありません。 GUIエディターは不要という方も、ドキュメント整備用に kaotoの価値を再考して頂けたら幸いです。 長く Java DSL or XML DSL という傾向が続いていましたが、kamelet が登場した頃から、Camel YAML DSL を使われるユーザー様をちらほら見かけるようになりました。 Camel YAML DSLに関するお問い合わせで圧倒的に多いのは、「xxxの定義方法がわからない」といったものです。サポート窓口もご利用いただけますが、もし Camel YAML DSL でのコーディングをより効率的に行いたいとお考えでしたら、ぜひKaoto の活用をご検討ください。 GUIツールの課題として、ツールの使い方がわからないといった声もありますが、kaotoコミュニティーでは解説動画が複数用意されています。 www.youtube.com バージョンに多少の誤差はありますが、日本語解説動画が用意されている点にも注目してください。 youtu.be 解説動画の他、コミュニティーサイトでは開発ロードマップも公開されています。今後どういった動きが予定されているか、こちらでチェックしてください。 kaoto.io 実際にご利用された際、ぜひコミュニティーへのフィードバックもお願いします。 実際に使われるユーザーのフィードバックがあることで、コミュニティーはより活性化します。ぜひ、動作不具合や機能リクエストについて、コミュニティーへインプットしていただくようご検討ください。 直接チケットを通してレポートしていただく事も可能です。 issues.redhat.com こちらでディスカッションしていただく事も可能です。 github.com Red Hat 製品サブスクリプションをご購入されたお客様は、サポートケースを通してコメントしていただくことも可能です。 例えば、 このバグをレポートして欲しい この機能を追加検討して欲しい 既存のバグチケットを実現するよう後押しして欲しい といった内容を歓迎しております。 ぜひ気になる点や応援したいチケットなどあれば、サポートケースなどを通してコミュニティーへのフィードバックにご協力ください。 明日の advent calendar 20日目では、「kaoto のお気に入り機能ベスト3」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com
OpenShift Virtualization on Azure Red Hat OpenShift、GAしました! techcommunity.microsoft.com ※本記事は OpenShift Virtualization アドベントカレンダーの 19日目の記事です。 qiita.com 目次 目次 はじめに 【積極採用中!】Red Hat 採用に関するお知らせ この記事のゴール おさらい Azure Red Hat OpenShift(通称ARO)とは? じゃあ、AROとAKS(Azure Kubernetes Service)はどう違うんだっけ? で、Red Hat OpenShift Virtualizationって何? Auzre Virtual MachineとRed Hat OpenShift Virtualization on AROはどう使い分けするの? あとがき はじめに 皆さんこんにちは、Red Hat Global Learning ServicesでLearning Solution Architectを担当している坂井 大和( @lab8010 )です。 主に X.com 上でRed Hat製品やサービスについて配信をしているので、もしよければフォローくださると幸いです。 この記事では、 『Microsoft Azure上で実行するRed Hat OpenShiftに、なんとサーバ仮想化機能もGAしたけども、これって何?』 という疑問に対して解説します。 【積極採用中!】Red Hat 採用に関するお知らせ Red Hatでは事業拡大に伴い人材を募集しています。 本記事でご紹介している『OpenShift Virtualization』に関するコンサルタントを募集しています。もし少しでも興味がある方は、ご応募または本記事を執筆している私坂井までお気軽にDMをください。( X / Linkedin ) redhat.wd5.myworkdayjobs.com この記事のゴール この記事を読み終わった頃には、読者様が次のことが出来る状態になって頂きたいと考えています。 Azure Red Hat OpenShiftについてそれとなくわかるようになる。 OpenShift Virtualization on AROとAzure Virtual Machinesの違いをそれとなく理解できる。 なお、私のこの記事では、あくまでもAROが持つVirtualization機能にフォーカスをしたいため、AROそのものについてはそこまで深掘りはしません。 本赤帽ブログでは次の記事が過去に投稿されていますので、AROそのものについて知りたい方はこちらの記事を参考にしてください。 (数年前の記事であるため、差分についてはお手数ですが最新情報をご確認いただくことを強くお勧めいたします。) rheb.hatenablog.com rheb.hatenablog.com それでは、早速本編に入っていきましょう。 おさらい Azure Red Hat OpenShift(通称ARO)とは? AROとは、 Microsoft Azureのデータセンター内で実行されるRed Hat OpenShift です。 Red Hat OpenShiftは、Red Hatが提供するKubernetesディストリビューションであり、ネイティブなKubernetesに対してRed Hatが選定したりカスタムした追加要素を組み込んだカスタムKubernetesです。 www.redhat.com このRed Hat OpenShiftは、オンプレミスな自社データセンターにて管理運用は可能ですが、AROで動かす価値は次の通りです。 パブリッククラウドが持つ堅牢なデータセンターとスタッフにより運用管理の活用(マネージドサービス) Microsoftが提供する他のサービスとの連携が可能 AROについて体系的に概要を学びたい場合は、以下のサイトより学習コンテンツにアクセスができます。 learn.microsoft.com あれ、Microsoft AzureにもKubernetesサービスってなかったっけ? はい、あります。Azure Kubernetes ServicesことAKSが存在します。 learn.microsoft.com learn.microsoft.com じゃあ、AROとAKS(Azure Kubernetes Service)はどう違うんだっけ? どちらもカスタムされたKubernetesという点では共通していると言えます。 ですが、内部で使用されているテクノロジーを比較してみた所以下の違いがあります。   AKS ARO ノードの実装方法 Azure VMの仮想マシン Azure VMの仮想マシン ノードで使用されるOS Ubuntu/Azure Linux Red Hat Enterprise Linux Core OS ノードで使用されるコンテナ テクノロジー Containerd CRI-O 使用されるCNI AKS-CNI OVN-Kubernetes RHELベースのコンテナイメージ (Universal Base Image)の利用 使用可能ではあるが、 コミュニティサポートとなる 使用可能であり、 サポートはRed Hatに依頼が可能   ベースとなるテクノロジーは上記のように違いますが、さらに言えばコンテナの中で使用可能なRHEL(UBI)については違いがあると言えます。 UBIについて知りたい場合はこちらのページが参考となります。 www.redhat.com AKSでもAROでもUBIを使用したコンテナイメージは活用できますが、上記記事内の次の記載が差別化をしています。 Run anywhere : you get the same quality bits, but you only get community and self-support. Run on RHEL or OpenShift : you get the same quality bits, but it’s fully supported by Red Hat, you can simply file a support ticket if you need any help. このことから、コンテナの中のイメージについてもRed Hatのサポートが必要であり、かつMicrosoft Azureが提供する他のマネージドサービスとの連携が必要な場合はAROが向いていると言えるでしょう。 また、AROはRed Hat OpenShiftということもあり、Ansibleによる制御 で、Red Hat OpenShift Virtualizationって何? こちらの記事で解説をしていますので、ご一読ください。 rheb.hatenablog.com Auzre Virtual MachineとRed Hat OpenShift Virtualization on AROはどう使い分けするの? 通常のAzure VMとAROの仮想インスタンスの比較 アークテクチャ視点で言えば 明確な違い があります。 Azure Virtual Machines(Azure VM) は、Microsoft内のAzureデータセンター内の物理サーバー上のハイパーバイザー上の仮想マシンとして実行されます。 Red Hat OpenShift Virtualization on ARO は、AROのために準備されたAzure Virtual Machines仮想マシンインスタンス内のRHCOS内のKVM/QEMUを使用して仮想マシンを実行する、いわゆるネスト化された仮想マシンが実行されます。 この点だけをパッと見てみると、パフォーマンス特性的な視点ではAzure VMの方が処理場登場するレイヤーは少ないためボトルネック面の懸念は少なく見えます。 (個人的な感想であり、データに基づく分析は必要だと思います。) では、そこまでしてRed Hat OpenShift上で仮想マシンを動かす価値は何か?と言われれば次の点があると言えます。 既にAROを用いてアプリケーションプラットフォームを構築しているが、どうしてもコンテナ化できない仮想マシンを部分的に所有している 仮想マシン内のゲストOSとしてのRHELについてRed Hatのサポートを受けたい この機能が登場したことで、『AROは使っているんだけど、どうしてもコンテナ化できない仮想マシンがあって、それをどうするか悩んでいたんだよなぁ...』というユーザーの方にとって見れば、この機能強化はそうした状況に対するソリューションになると言えます。 他にもピンポイントなユースケースはあるかもしれませんが、リリースされて間もない時点での記事のため、一般的に考え得るケースをまずは紹介してみました。 今後も本機能の魅力を伝える上で新しい視点があれば、この記事への追記または新しい記事でご紹介をしたいと思います。 あとがき 実は私、前職ではVMware認定インストラクターだけでなく、Microsoft認定トレーナーもやっていました。 www.credly.com Azureについてもいくつかの基本的なコースを教えていたこともあり、記事を書いていて非常に懐かしくもあり、そして身につけたスキルが思わぬ形で役に立つタイミングが来たなとも感じています。 ITインフラに関わるものとしては、プライベートもパブリックも両方のクラウドインフラに携わることは刺激にもなりますし、常に業務の中で両方に関われれば良いなと感じていたので、今後も赤帽ブログにてAROについても魅力的な記事を書いていきたいと思います。
※本記事は OpenShift Virtualization アドベントカレンダーの 18 日目の記事です。 qiita.com 皆さんこんにちは、OpenShift Virtualization とストレージを生業にしている Red Hat のうつぼ(宇都宮)です。 今現在、共通基盤で VMware を使っているお客様様はかなり多いです。4桁の VM が動く共通基盤は日本には普通にもありますし、そしてそこには3~4桁の数のユーザーさんがいらっしゃるでしょう。 またVMware ベースのクラウドサービスを提供している企業さんもいらっしゃいます。ユーザーさんも結構にいらっしゃると思います。 こういった複数ユーザーで共有する基盤ではマルチテナンシーの形態がとられるのが一般的ですが、OpenShift Virtualization でも実現できるのでしょうか? ということで今日のテーマはマルチテナンシーです。 2つのマルチテナンシー戦略 クラスタ共有型: 単一クラスタ内での論理分割(Project as a Tenant) ネットワークの分離(NetworkPolicy) ユーザーの権限管理(RBAC: Role/RoleBindings) 標準の ClusterRole RoleBindings カスタム Role まとめ OpenShift Virtualization(以下 Virt)を使ってクラウドサービスのような環境を作る際に重要となるのは マルチテナンシー(複数ユーザーの収容設計) の戦略です。 本稿では、マルチテナンシーの戦略と、それを実現 / 管理するためのプラクティスについて紹介します。 2つのマルチテナンシー戦略 複数のユーザーに VM 環境を提供する場合、それぞれのユーザーが別のユーザーの VM を触れてしまうとリスクが生じます。悪意はなくても間違って別のユーザーの VM を止めてしまうとか、そういったことは普通に起こり得ます。 そのため、ユーザーごとに分離された環境を提供することが求められます。これがマルチテナンシーの基本コンセプトです。 OpenShift に限らず一般的に、複数ユーザーにマルチテナンシーの環境を提供するには、大きく分けて2つのパターンがあります。 パターン1 共有型 : 単一の大きなクラスタを論理的に分割して提供する パターン2 専有型 : ユーザーごとに専用のクラスタを払い出す VMware の世界で言えば、共有型は 1つの vCenter / Cluster を Resource Pool や Folder で区切って権限委譲する形、専有型はユーザーごとに vCenter / Cluster を用意する形、でしょうか。 セキュリティ要件が非常に高いシステムや、特定のハードウェアを占有して提供するサービスなどでは、パターン2 の専有型になります。 しかし、パターン1 の共有型の方がコストメリットが良く、特段厳しい要件がなければできればこちらで進めたいと考える方が多いのかなと考えます。 そこで、共有型のマルチテナンシーを OpenShift ではどのように実現するのかのポイントを超ざっくり説明します。 クラスタ共有型: 単一クラスタ内での論理分割(Project as a Tenant) OpenShift の Project(≒ Namespace)という論理的な仕切りを「テナント」と見なすパターンです。リソース効率が最も良いというメリットがあります。 しかし、OpenShift はデフォルトでは性善説的に動くところがあり、何も設定しないと隣のテナントと普通に通信ができたりします。よってテナント間をきちんと分割するために、 ネットワークの分離 と ユーザーの権限管理 の設定が必要になります。 ネットワークの分離(NetworkPolicy) OpenShift は OVN-Kubernetes という SDN が標準で使われることが多いですが、デフォルトでは「全 Project 間の通信は許可」されています。例えばテナント A の VM からテナント B の DB にアクセスすることもできてしまいます。 これを防ぐために、 NetworkPolicy を使ってファイアウォールのようなルールを適用します。 NetworkPolicy は YAML で設定を行えます。 例えば、以下のような YAML を各テナント(Project)に適用することで、「同じ Project 内の通信は OK、それ以外からの通信は拒否」という状態を作れます。 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default namespace: tenant-a # 対象のテナント名 spec: podSelector: {} policyTypes: - Ingress --- kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace namespace: tenant-a spec: podSelector: {} ingress: - from: - podSelector: {} # 同じ Project 内の Pod (VM) からの通信のみ許可 これを基本として、後から要件に応じて NetworkPolicy を追加していくというのがよいでしょう。 「基本としてって簡単に言うけど、いちいちテナントごとにこれ書いて適用するのめんどくさい」という場合は、プロジェクトテンプレートを使うのがよいです。Project を作る際に自動的に NetworkPolicy を適用することができます。 参考:新規プロジェクトへのネットワークポリシーの追加 https://docs.redhat.com/ja/documentation/openshift_container_platform/4.20/html-single/network_security/index#nw-networkpolicy-project-defaults_default-network-policy ユーザーの権限管理(RBAC: Role/RoleBindings) 次に、「誰が何をしてよいか」の制御です。OpenShift の権限管理は RBAC(Role-Based Access Control)ベースで行われ、 Role と RoleBindings という仕組みを組み合わせて使うことで実現します。 Role : 「何をやっていいか」という記述(例: VMを作れる、消せる) RoleBinding : Role を「誰(User / Group)」に渡すかの紐付け 標準の ClusterRole 実は、Virt をインストールすると、VM 操作に特化した 5つの ClusterRole が自動的に追加されています。まずはこれらを使うのがよいでしょう。 ClusterRole名 権限の内容 想定ユーザー kubevirt.io:admin VM に関するフルコントロール権限。作成、削除、設定変更、コンソール接続、マイグレーションなど全てが可能。 テナント管理者 kubevirt.io:edit VM の作成や設定変更は可能。ただし、Role 自体の変更など権限管理に関わる操作は不可。 VMを作って壊す作業が多い開発担当者や運用担当者 kubevirt.io:view VM の設定情報やステータスの閲覧のみ可能。 VM へのコンソール接続はできない。 監査担当や監視システムユーザ kubevirt.io:migrate VM の Live migration を実行するための特定権限。 メンテナンス担当者(Live migration のみ許可) kubevirt.io:default 基本的なアクセス権のみを提供するベースロールで、単体だとほぼ何もできず一般的には使われることはない。 n/a ※ちなみに Role と ClusterRole の違いは、 Role : 単一の Namespace でのみ有効なもので、テナントごとに設定して利用する。 ClusterRole : クラスタ全体で有効なもので、どのテナントでも共通して利用できる。 という違いがあります。ゆえに、OpenShift の管理者としては ClusterRole の方が便利っちゃ便利なのです。 RoleBindings さて、これらの ClusterRole をユーザーに割り当てるためには、RoleBindings を作成します。 例えば tenant-a というテナントの管理者ユーザーに kubevirt.io:admin を割り当てるには、次のように定義します。 kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: vm-admin-binding namespace: tenant-a subjects: - kind: User name: "user-admin" apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: kubevirt.io:admin apiGroup: rbac.authorization.k8s.io カスタム Role しかし、「一般ユーザーにコンソールは操作させたいが、VM を勝手に削除されたくない」という要件はよくあります。 上記の標準 ClusterRole だと、 kubevirt.io:view ではコンソールが見れず、かといって kubevirt.io:edit だと VM を消せてしまいます。 その場合は、カスタマイズした Role を作成することで実現します。 Role は次のように、操作対象の resource と apiGroup 、そして許可する操作 verbs をリストして作ります。 kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: tenant-a name: vm-user-role rules: # 閲覧のみ許可(create, delete, patch 等は持たせない) - apiGroups: ["kubevirt.io"] resources: ["virtualmachines", "virtualmachineinstances"] verbs: ["get", "list", "watch"] # コンソール接続と電源操作(起動・停止・再起動)のみ実行許可 - apiGroups: ["subresources.kubevirt.io"] resources: ["virtualmachineinstances/console", "virtualmachines/start", "virtualmachines/stop", "virtualmachines/restart"] verbs: ["update"] この Role を先の例のようにユーザーやグループに対して RoleBindings を作れば、「コンソールは操作できるが VM は消せない」という権限を割り当てられます。 あ、もちろん ClusterRole も同じように作ることができるので、複数のテナントで共通して与える権限を作るには ClusterRole を作るほうが効率的です。 まとめ 今回はクラスタ共有型に特化して Virt でのマルチテナンシーの実装要素を紹介しました。 特に RBAC については、基本的にはまず標準の kubevirt.io:* ClusterRole の利用を検討し、ちょうどいいのがなければカスタムする、というアプローチをおすすめします。 NetworkPolicy や Role/RoleBindings は結構奥が深く、私が紹介したのはほんの一部分です。 これを突き詰めていくと OpenShift/Kubernetes はどうやって安全性を担保しているかの動作原理に到達し、目からウロコがポロポロと落ちること請け合いです。 私はこの辺は正直まだ勉強が足りず、フナとか鯉みたいにびっしりウロコが敷き詰められているので、精進したいと思います。 ということで今日はここまで。
OpenShift Advent Calendar 2025 18日目の記事です。 担当の志田です。よろしくお願いします。 qiita.com はじめに OpenShift におけるコンテナレジストリの役割 コンテナレジストリ比較 Harbor 運用の実践ポイント Harbor の HA(高可用性)構成 Harbor レプリケーションの強み セキュリティ(スキャン・署名・SBOM) Helm を使った Harbor デプロイ手順(実践編) 名前空間とサービスアカウントの作成 CNPG による DB 構築 オブジェクトストレージバケットの作成 Harbor のインストール(values.yaml のポイント) 使ってみる まとめ はじめに Kubernetes / OpenShift などのコンテナプラットフォームにおいて、コンテナレジストリは単なる保存先ではなく、ライフサイクルの中心となる必須コンポーネントです。そのため、 コンテナレジストリの選定と運用設計 は、プロジェクトの成否を分ける重要なテーマとなります。 本記事では、実務で直面する以下のポイントを中心に解説します。 OpenShift で利用できるレジストリ比較(内部レジストリ / Quay / Harbor / Nexus) Harbor 運用の実践ポイント(HA、レプリケーション、セキュリティ機能) Helm + CloudNativePG (CNPG) を使った Harbor の OpenShift デプロイ手順 👉 最近、お客様環境で Harbor を扱う機会があり、その軽量さと多機能ぶりのバランスが非常に良かったため、本記事ではHarborにフォーカスして、その特徴や実際のデプロイ手順を共有したいと思います。 OpenShift におけるコンテナレジストリの役割 OpenShift のエコシステムでは、あらゆるフローがレジストリを介して動いています。 Build : BuildConfig や Tekton でビルドされたイメージを Registry へ push Deploy : Deployment や ArgoCD が Registry から pull Governance : イメージの脆弱性スキャンや署名検証による実行制御 Air-gapped : oc mirror v2 による Operator カタログやリリースイメージの取り込み先 企業向け基盤としてレジストリを選定する場合、特に以下の要素が重視されます。 高可用性(HA) : 停止がデプロイ停止に直結するため 脆弱性スキャン : Trivy や Clair による自動検知 イメージ署名 : cosign 等による「正しいイメージ」の証明 SBOM 管理 : ソフトウェアサプライチェーンの透明性確保 外部ストレージ対応 : S3(ODF / MinIO / RGW等)によるスケーラビリティ コンテナレジストリ比較 オンプレミスのOpenShift環境でよく使われてるコンテナレジストリをいくつか比較してみましょう。 大規模なシステムで利用する場合はQuay、軽量に始めたい場合はHarborといった選択が良さそうですね。 項目 OpenShift 内部レジストリ Red Hat Quay Harbor Nexus Repository OpenShift との統合 ◎ 完全統合 ◎ 完全統合 ○(外部連携) ○(外部連携) HA構成 △(Shared PVC依存) ◎(分散構成) ◎(CNPG + S3) △(OSS版は不可) 脆弱性スキャン △(外部依存) ◎ Clair ◎ Trivy ×(OSS版なし) イメージ署名 cosign のみ cosign / Notary v2 cosign / Notary v2 ○(Proのみ) SBOM 管理 △ ◎ ◎ △ OCI Artifact 対応 △ ◎ ◎ △ S3 バックエンド ◎ ◎ ◎ ◎ OSS での利用 OpenShift 付属 ×(UpstreamはProject Quay)[1] ◎ 100% OSS ◎(ただし機能制限あり) 主な用途 小〜中規模・開発環境 大規模・ミッションクリティカル OSS志向・閉域網・多機能 Java/npm等の統合リポジトリ [1] Red Hat Quay のサブスクリプションは個別購入頂くか、セルフマネージド型OpenShiftの最上位エディションである Red Hat OpenShift Platform Plus をご購入頂くことでご利用可能です。また、フルマネージド型の Red Hat Quay.io も展開しております。 Harbor 運用の実践ポイント ここからは、オンプレミス環境で非常に人気の高い Harbor にフォーカスし、その特徴を見てみましょう。 Harbor の HA(高可用性)構成 Harbor を本番運用する場合、複数コンポーネントを冗長化し、外部サービスを HA 化することで安定稼働が実現できます。 外部 DB(CNPG) : PostgreSQL をクラスタ化し、単一障害点(SPOF)を排除。 外部 Redis(HA) : セッション・キャッシュ・ジョブキューを扱うため、Redis Sentinel/Cluster で冗長化。 共有オブジェクトストレージ : Registry は全ノードで同一のオブジェクトストレージを利用。 Harbor コンポーネントの水平スケール : core / portal / jobservice / registry は複数レプリカで運用。 ロードバランサ/Ingerss : すべてのリクエストを LB 経由で複数ノードに分散。 Harbor レプリケーションの強み Harbor はレプリケーション機能が極めて優秀です。 Pull-based / Push-based : 両方に対応。 フィルタリング : 特定のタグやプロジェクトのみを同期。 完全同期 : replicate_deletion を有効にすれば、削除操作も同期可能。 ユースケース : DMZ(検疫用)から内部レジストリへの転送や、DR 環境へのイメージコピーに最適です。 セキュリティ(スキャン・署名・SBOM) Harbor はセキュリティスイートとして完成されています。 脆弱性スキャン : Trivy が組み込まれており、Push 時に自動スキャンが可能。 署名 (cosign) : cosign sign で署名したイメージを Harbor UI 上で視覚的に確認でき、署名がないイメージの Pull を禁止するポリシーも設定可能。 SBOM : syft 等で生成した SBOM をイメージに添付し、Harbor で管理できます。 Helm を使った Harbor デプロイ手順(実践編) では、実際の本番運用に耐えうるようにできるだけ冗長な構成でOpenShiftにHarborをデプロイしてみましょう。 OpenShift 上に Helm + CNPG + ODF(Red Hat OpenShift Data Foundation) で Harbor を構築する手順の要約です。 使用する Helm Chart は goharbor/harbor-helm です。 ※本手順は参考例であり、本番環境での利用に際しては必ず十分な検証を実施した上で適用してください。 名前空間とサービスアカウントの作成 まず、Harborをデプロイするための名前空間とサービスアカウントを作成し、必要なSCC(Security Context Constraints)を付与します。 # Namespace作成します。 oc create ns harbor # ServiceAccount作成します。 oc create sa harbor -n harbor # ServiceAccountに必要なSCCを付与します。 oc adm policy add-scc-to-user anyuid -z harbor -n harbor oc adm policy add-scc-to-user containerized-data-importer -z harbor -n harbor # DB(CNPG)接続用認証情報をSecretで定義します。 oc create secret generic harbor-db-secret \ -n harbor \ --type=kubernetes.io/basic-auth \ --from-literal=username=harbor \ --from-literal=password=harbor CNPG による DB 構築 次に、DBを作成します。 CNPGクラスターを作成し、データベース registry を初期セットアップします。 データベースの永続領域(PV)には、ODFのブロックストレージである RBD(RADOS Block Device) を使用します。 ※前提として、 CNPG Operator を予めOpenShiftにインストールしておいてください。 # CNPGクラスタをデプロイします。 cat <<'EOF' | oc apply -f - apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: harbor-db namespace: harbor spec: bootstrap: initdb: database: registry encoding: UTF8 localeCType: C localeCollate: C owner: harbor secret: name: harbor-db-secret enableSuperuserAccess: true instances: 3 storage: size: 1Gi storageClass: ocs-storagecluster-ceph-rbd EOF # デプロイ状況を確認します。 oc get cluster.oistgresql.cnpg.io -n harbor # NAME AGE INSTANCE READY STATUS PRIMARY # harbor-db 5m 3 3 Cluster in healthy state harbor-db-1 #  ステータスがhealthyになればOKです オブジェクトストレージバケットの作成 Harborにpushされたイメージを格納するためのバックエンドストレージとしてオブジェクトストレージバケットを作成します。オプジェクトストレージには、ODFの RGW (RADOS Gateway) を使用します。 cat <<'EOF' | oc apply -f - apiVersion: objectbucket.io/v1alpha1 kind: ObjectBucketClaim metadata: name: harbor-bucket namespace: harbor spec: genetateBucketName: harbor-bucket storageClass: ocs-storagecluster-ceph-rgw EOF バケットが作成されたら、バケットのアクセスキーとシークレットキーが格納されたsecretが作成されますので抽出します。さらに、RGWのTLS証明書を抽出し、Harborが利用するためのsecretに格納します。 # バケットのアクセスキーとシークレットキーを取得します。 export S3_ACCESSKEY=$(oc get secerts harbor-bucket -n harbor -o jsonpath='{.data.AWS_ACCESS_KEY_ID}'|base64 -d) export S3_SECRETKEY=$(oc get secerts harbor-bucket -n harbor -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY_ID}'|base64 -d) # RGWのTLS証明書を取得します。 oc get secrets -n openshift-storage ocs-storagecluster-cos-ceph-rgw-tls-cert -o jsonpath='{.data..tls\.crt}'|base64 -d > ca.crt # Harborが使用するためのsecretを作成します。 oc create secret generic harbor-s3-secret \ -n harbor \ --from-file=ca.crt=ca.crt \ --from-literal=REGISTRY_STORAGE_S3_ACCESSKEY=$S3_ACCESSKEY \ --from-literal=REGISTRY_STORAGE_S3_SECRETKEY=$S3_SECRETKEY Harbor のインストール(values.yaml のポイント) Helm Chartのパラメータファイル values.yaml を作成し、OpenShiftにインストールします。 (※ values.yaml のパラメータはシステム要件の合わせて適宜変更してください。) 注意) Harborのキャッシュやセッション管理にRedisが使用できますが、このHelm Chartでは冗長構成が取れないため高可用性が求められる環境では外部のインメモリーデータストアを使用してくだい。 # 前項で作成したHarbor用オブジェクトストレージのエンドポイントとバケット名を取得します。 HARBER_BUCKET_HOST=$(oc get cm -n harbor harbor-bucket -o jsonpath='{.data.BUCKET_HOST}{\n}') HARBER_BUCKET_NAME=$(oc get cm -n harbor harbor-bucket -o jsonpath='{.data.BUCKET_NAME}{\n}') # values.yamlを作成します。 cat << EOF > ./values.yaml expose: type: ingress tls: enabled: true certSource: auto ingress: hosts: core: harbor.apps.cluster.ocp.local # Harborのホスト名 controller: default externalURL: https://harbor.apps.cluster.ocp.local # 外部接続用URL persistence: enabled: true resourcePolicy: "keep" persistentVolumeClaim: registry: existingClaim: "" storageClass: "ocs-storagecluster-ceph-rbd" # ODFのRBDを使用 subPath: "" accessMode: ReadWriteOnce size: 5Gi annotations: {} jobservice: jobLog: existingClaim: ""   storageClass: "ocs-storagecluster-ceph-rbd" # ODFのRBDを使用 subPath: "" accessMode: ReadWriteOnce size: 1Gi annotations: {} # DBにはCNPGを使用するので同梱されているdatabaseは使用しない # database: # existingClaim: "" # storageClass: "" # subPath: "" # accessMode: ReadWriteOnce # size: 1Gi # annotations: {} redis: existingClaim: "" storageClass: "ocs-storagecluster-ceph-rbd" # ODFのRBDを使用 subPath: "" accessMode: ReadWriteOnce size: 1Gi annotations: {} trivy: existingClaim: "" storageClass: "ocs-storagecluster-ceph-rbd" # ODFのRBDを使用 subPath: "" accessMode: ReadWriteOnce size: 5Gi annotations: {} imageChartStorage: disableredirect: false type: s3 # ODF RGWのオブジェクトストレージを使うのでs3を指定 s3: region: us-west-1 existingSecret: "harbor-s3-secret" # バケット接続用secret bucket: $HARBER_BUCKET_NAME # バケット名は環境変数から取得 regionendpoint: https://$HARBER_BUCKET_HOST # エンドポイントは環境変数から取得 secure: true harborAdminPassword: "Harbor12345" portal: replicas: 2 # レプリカ数2で冗長化 image: repository: docker.io/goharbor/harbor-portal tag: v2.13.1 serviceAccountName: "harbor" core: replicas: 2 # レプリカ数2で冗長化 image: repository: docker.io/goharbor/harbor-core tag: v2.13.1 serviceAccountName: "harbor" jobservice: replicas: 2 # レプリカ数2で冗長化 image: repository: docker.io/goharbor/harbor-jobservice tag: v2.13.1 serviceAccountName: "harbor" registry: replicas: 2 # レプリカ数2で冗長化 registry: image: repository: docker.io/goharbor/registry-photon tag: v2.13.1 controller: image: repository: docker.io/goharbor/harbor-registryctl tag: v2.13.1 serviceAccountName: "harbor" trivy: replicas: 2 # レプリカ数2で冗長化 enabled: true image: repository: docker.io/goharbor/trivy-adapter-photon tag: v2.13.1 serviceAccountName: "harbor" resources: requests: cpu: 200m memory: 512Mi limits: cpu: 1 memory: 1Gi database: type: external external: host: "harbor-db-rw.harbor.svc" # CNPGクラスタのservice port: "5432" username: "harbor" password: "harbor" coreDatabase: "registry" sslmode: "disable" # 注意) redisを冗長化する場合は外部のインメモリーデータストアを用意する redis: type: internal internal: image: repository: docker.io/goharbor/redis-photon tag: v2.13.1   serviceAccountName: "harbor" exporter: replicas: 2 # レプリカ数2で冗長化 image: repository: docker.io/goharbor/harbor-exporter tag: v2.13.1  serviceAccountName: "harbor" EOF # Harborをインストールします。 helm install harbor . -f values.yaml -n harbor # 状態を確認します。 helm list -n harbor # NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION # harbor harbor 1 2025-12-18 01:55:18.831366388 +0000 UTC deployed deployed 2.13.1 # STATUSがdeployedになればOK 使ってみる これで、Harborが立ち上がったのでブラウザから繋いでみます。 UIはシンプルですが、コンテナイメージの運用に必要な機能はほとんど網羅されており直感的で使いやすい印象です。 まとめ ユースケース 推奨レジストリ 学習・検証・リソース節約 OpenShift 内部レジストリ 大規模・全社共通・高度なセキュリティ・Red Hat サポート Red Hat Quay 軽量・OSS 活用・閉域網運用・高いコストパフォーマンス Harbor (CNPG 構成) コンテナレジストリは一度運用を始めると切り替えが難しいため、コンテナレジストリに何を使おうか迷ったら Harbor または Quay を選択することをお勧めします。 明日の Advent Calendar もお楽しみに!
Apache Camel Advent Calendar 18日目の記事は、サポート担当古市が担当します。 テーマは、「Camel ベストプラックティス」 アンチパターンでお伝えした改善点を意識していただく事で、保守性の高い camel route を開発できると思いますが、いくつか情報がまとまっていますのでご紹介します。 より深く Apache Camel を知りたい方は、ぜひこちらの書籍をご活用ください。Apache Camel 3.x までカバーしておりますので、学びの多い一冊となります。 www.manning.com 次に、Apache Camel エンジニアが執筆した書籍に、タイトル通りデザインパターンが詰まっています。 leanpub.com 過去に、赤帽ブログでこちらの書籍を紹介しておりますので、見逃された方はぜひチェックしてください。 rheb.hatenablog.com デザインパターンで紹介されている VECTORパターンについて突っ込んで執筆された記事もございます。 2018年の記事なので現在はサポートされていない camel-hystrix についても記載されておりますが、vectorパターンデザインのメリットを理解するには有用な記事かと思います。 qiita.com その他、業務を通しての感想ですが、direct エンドポイントを使い意味のある単位で Camel route を切り分けていると、初見でも読みやすいと感じます。 また、パッケージを分けるなど、ビジネスロジックとルーティングが明確に分かれていると読みやすいです。Exchange properties を有効活用されているコードを散見しますが、ぜひこれからは variable もご活用いただければ幸いです。 意外と多く感じるのが、ルーティングを検証するためのテストコードをご用意されていないユーザー様がいらっしゃることです。Testing Camel でご紹介した内容をぜひ開発業務に取り込んでいただければと思います。 今後の advent calendar で kaoto の紹介が始まりますが、ドキュメント生成機能をご利用いただく事で、ソースコードとドキュメントに乖離の無い、より保守性の高い camel route を使った運用が可能になります。要チェックです。 明日の advent calendar 19日目では、「kaoto を使った開発」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com
※本記事は OpenShift Virtualization アドベントカレンダーの 17日目の記事です。 こんにちは、Red Hat のソリューションアーキテクトの青柳萌里(Techcat)です。 最近VMware製品からOpenShift Virtualizationへ移行したいというお声をお客様からよくいただきます。 一方で2つの製品は設計思想が異なるため、少々用語が異なるのも事実。 そこで、今回はVMware管理者向けにOpenShiftの用語を解説した、下記のRed Hatの英語の記事を抄訳+ローカライズしてご紹介したいと思います。 よろしければ辞書的にご利用いただければと思います。 こちらの記事の翻訳につきましては元VMWare認定トレーナーでもある坂井大和さん( @lab8010 )とOpenShift SSPである山川達也さんに監修いただきました。お忙しい中、本当にありがとうございます!心から御礼を申し上げます。 (また社内確認や翻訳の確認をいただいた皆様、本当にありがとうございました。) リンクについては日本語版がご利用いただけるものは日本語ドキュメントへのリンクを、英語版のみの場合は英語版ドキュメントへのリンクを貼っています。 ドキュメントのバージョンは4.18を基本としておりますが、一部過去のバージョンのドキュメントでしか説明のないものは過去のバージョンのドキュメントへのリンクを記載させていただいております。(その場合参考程度にご覧いただけますと幸いです。)また「日々の運用で発生するタスク」については項目冒頭に記載のある通り、4.20を前提としたものになっています。 cloud.redhat.com ストレージ ネットワーク コンピュート オブザーバビリティ 仮想マシンコンポーネント 日々の運用で発生するタスク タイトル:VMware管理者向けOpenShift Virtualizationざっくりガイド 学習 • 8 項目 • 所用時間1 時間: 目的:VMware vSphereの経験を持つエンジニアが、Red Hat OpenShiftとRed Hat OpenShift Virtualizationの機能を使いこなすための学習ガイドです。 内容:主にVMware vSphere 8.0以上の機能とRed Hat OpenShift 4.18の機能を比較したガイド。 ストレージ ストレージ機能マッピング 機能 VMware OpenShift 仮想ディスクの保存場所 データストア PersistentVolumeClaim/PersistentVolume ポリシーベースのストレージ管理 vVols, Storage Policy Based Management (SPBM) ストレージクラス(Storage Class) 無停止VMストレージ移行 Storage vMotion ストレージライブマイグレーション(Storage live migration) ストレージのアベイラビリティ vSAN (vVols), NFS, SAN (Fiber Channel or iSCSi), Raw Device Mapping VMのストレージを管理するための枠組みである、 PersistentVolume (PV) および PersistentVolumeClaim (PVC) 。 様々なストレージバックエンドまたはSoftware Defined Storageソリューションとのシームレスな統合を可能にする枠組みである、 Container Storage Interface (CSI)。 レガシーストレージアレイへのアクセス すべての主要ストレージベンダーと互換性あり すべての主要ストレージベンダーがCSI準拠ドライバーを提供 ストレージ高速クローン 対応、VAAI経由。 対応、CSIドライバー経由 ディスクサイズ変更 対応 対応 ディスク/VMスナップショット(※1) 対応 対応。 VMスナップショットを使用したバックアップとリストア。 ストレージ分散リソーススケジューラ (Storage DRS) 対応 該当なし ※1 補足情報:OpenShiftのスナップショット機能はディスクのみのスナップショット(正確にはストレージのスナップショットをキックしている)であり、メモリレベルのスナップショットは未対応。 メニューの対応表 OpenShift Virtualization メニュー項目 VMware での相当機能 説明 Data Foundation (OpenShift Data Foundation ストレージとそのコンソールプラグインが必要) vSAN または VMFS ファイルシステムとしてセットアップされたローカル RAID ディスク Web コンソールで OpenShift Data Foundation ストレージを管理するためのエントリポイント Object Storage (OpenShift Data Foundation ストレージとそのコンソールプラグインが必要) 該当なし ポリシー、バケット、クレーム、レプリケーションなどのオブジェクトストレージの設定と管理 PersistentVolumes vVol または VMDK のリスト 静的または動的にプロビジョニングされたファイルおよびブロックベースの Persistent Volume (PV) を管理し、トラブルシューティングします。各 PV は、既存のストレージプロバイダーのいずれかによってバックアップされる単一のストレージボリュームを表します。 PersistentVolumesClaims 該当なし ストレージリクエスト、それらの PV へのバインド、およびワークロード (コンテナと VM) への割り当てを管理し、トラブルシューティングします。PVC は、PV がどのようにバインドされるか、およびそのライフサイクルの特性も定義します。 StorageClasses ストレージポリシー クラスタに統合されたストレージプロバイダーのクラスを管理します。各ストレージクラスは、動的ストレージリクエストをストレージプロバイダーにマップし、クラスタ管理者が決定したプロビジョニングプロパティを定義するプロファイルです。 VolumeSnapshot 仮想マシンストレージスナップショット ボリュームスナップショットとリストアリクエストの管理およびトラブルシューティング VolumeSnapshotClasses 該当なし クラスタに統合されたスナップショットプロバイダーのクラスを管理します。各スナップショットクラスは、スナップショットリクエストをスナップショットプロバイダーにマップし、クラスタ管理者が決定したスナップショット設定プロパティを定義するプロファイルです。 VolumeSnapshotContents 該当なし 既存のボリュームスナップショットの管理およびトラブルシューティング。各スナップショットは、統合されたスナップショットプロバイダーによってバックアップされます。|ボリュームスナップショットコンテンツはPersistent Volumeに似た概念となります。(※1) ※1 Persistent Volume ClaimとPersistent Volumeの関係性、VolumeSnapshotとVolumeSnapshotContentsの関係性が似ているということと思われる。 ネットワーク ネットワーク機能マッピング 機能 VMware OpenShift ホストネットワークの構成と管理 vSwitchによるホストごとの設定、またはDistributed Virtual Switch (DvSwitch)による単一管理 NMstate Operator および Multus Software-defined networking: VM間通信の保護/制限/制御 分散ファイアウォールを活用したNSXのマイクロセグメンテーションやQinQをはじめとした様々な機能 OpenShift SDN はOVN (Open Virtual Networking) により堅牢なネットワークソリューションを提供します。オーバーレイベースのネットワークはGENEVE (Generic Network Virtualization Encapsulation) を使用し、トンネルを介してVM間通信を可能にします ・IPアドレス管理 (IPAM) の割り当て ・ロードバランサーによるサービスの公開 ・OVNアクセスコントロールリスト (ACL) によるネットワークポリシー ・IPv4/IPv6デュアルスタッククラスタのサポート ・きめ細かなクラスタEgressトラフィック制御 ・ハードウェアオフロード、マイクロセグメンテーション、セカンダリネットワーク、OVN IGMPスヌーピングとリレーを使用したIPマルチキャストなどの高度なネットワーク機能 User Defined Networks (UDN) の概要 User Defined Networks (UDN) は、ネットワークを使用してnamespaceをネイティブに分離します。これにより、Podは「同一namaespace内の他のPodとのみ」通信が可能になります。 レイヤー2 または レイヤー3 のネットワークタイプを持つプライマリネットワークとして構成することが可能です。 複雑になりがちな NetworkPolicy(ネットワークポリシー)の記述・管理を軽減します。 異なるnamespaceやクラスター間での IPサブネットの再利用(IPアドレスの重複利用)が可能になります。 PodからVM、VMからPodへの接続性 PodとVM間のトラフィックは、Kubernetes Ingressまたは同様のメカニズム(例:NodePort)を経由する必要がある VMとPodは、 SDNまたは同じUDNに接続されている場合 、ネイティブピアであり、すべての機能が両方で等しく利用可能 ネットワークオブザービリティ サードパーティソリューションへのvSwitchポートミラーリング、およびセキュリティ目的のNSXトラフィック分析 Network Observability Operator メニューの対応表 OpenShift Virtualization メニュー項目 VMware での相当機能 説明 NodeNetworkConfigurationPolicy ( NMState Operator が必要 ) vSwitch/DvSwitch クラスタノードで望まれるネットワーク設定 NodeNetworkState ( NMstate Operator が必要 ) ESX/vCenter での v/DvSwitch ビューに類似 ノード上のネットワークステータス Service 該当なし SDN内部での自己検出と自動DNSを備えたLayer4ロードバランシング設定。MetalLBやクラウド提供のロードバランシングのようなIngress LBソリューションと組み合わせることで、クラスタ外部にサービスを公開可能。 Routes and Ingresses NSX ロードバランサー Routes: Webサービスをクラスタ外部に公開するためのアプリケーションロードバランシング設定 Ingresses: 一意のホスト名でアプリケーションにアクセスすることを可能にするリソース NetworkPolicy NSX-T ファイアウォール(※1) (マイクロセグメンテーションルール) アプリケーション中心のネットワークポリシーを管理 NetworkAttachmentDefinitions ポートグループ VLAN、プライベートネットワークなど、ネットワークへの仮想マシンの接続性 UserDefinedNetwork NSX-T オーバーレイセグメント(※2) オーバーレイネットワークセグメントの作成と管理 ※1,2 NSX-Tという製品は現状存在しません。現在存在するのはNSXとなります。 コンピュート コンピュート機能マッピング 機能 VMware OpenShift リソースバランシング Distributed Resource Scheduler Descheduler (デスケジューラ) の Pod 待避 (eviction) ポリシー ホスト / VM メトリクス vCenter, Aria Operations OpenShift MetricsとMonitoring , Red Hat Advanced Cluster Management コンピュートライブマイグレーション vMotion ライブマイグレーション(Live Migration ) CPU オーバーコミット 対応 対応 メモリオーバーコミット手法 Ballooning (バルーニング) および Transparent Page Sharing (TPS), スワップ KSM (Kernel Same-page Merging) および free page reporting 仮想マシンの(共同)配置制約 VM-VM間およびVM-ホスト間のアフィニティルール VM 、 Pod、ホスト に対する (アンチ) アフィニティルール ノード障害 vCenterがなくても、ノード障害の検出とVMの再スケジュールが15〜30秒以内に実行される フェンシングエージェント環境 を通じてサポートされます。HA設定については KCS を参照してください。 動的再構成 CPU、メモリ、ディスク、ネットワーク、およびいくつかの追加ハードウェアのホットアド/リムーブと再構成をサポート ストレージ 、 CPU 、 SR-IOV 、 Bridge Network 、および メモリ のホットアドをサポート コンピュートアクセラレーション CPUのPCIパススルー、vGPUをサポート GPU、汎用PCIパススルー、CPUパススルーをサポート、(NVIDIA) vGPUをサポート テンプレート管理 テンプレートVM、OVA/OVFデプロイメント、コンテンツライブラリにより、簡素化されたプロセスでVMをプロビジョニング可能 ブートソース、VMテンプレート、インスタンスタイプを管理するためのカタログ。 特定のブートソースに関連付けられている場合、VMテンプレート、インスタンスタイプ、または宣言的なYAMLで記述したVM定義からVMを作成できます。 VMのエクスポート/インポート OVFおよびOVAフォーマットを使用したVMのインポートとエクスポート Migration toolkit for virtualization を使用したOVA/VMのインポートとエクスポート ( エクスポート例 )。 メニューの対応表 OpenShift Virtualization メニュー項目 VMware での相当機能 説明 Nodes Host and Cluster > Host クラスタ内の現在のノードと、それらの設定およびランタイム詳細を一覧表示し、トラブルシューティングします。 NodeHealthChecks Config > vSphere DRS さまざまなノード状態に対する修復アクションを設定します。「Not Ready」または「Unknown」状態のノードをソフトリブートする、BMC APIからハードリブートする、リブート修復が失敗した後にノードの再インストールを強制するなど、さまざまな修復オペレーターがあります。 Machines (Automation) 該当なし 手動または自動スケーリングを使用して、OpenShift Machine APIオペレーターを介してインストールおよび自動化されたノードのメタデータを一覧表示し、トラブルシューティングします。 MachineSet (Automation) 該当なし 手動または自動スケーリングを使用して、OpenShift Machine APIオペレーターを介してインストールおよび自動化されたノードのメタデータを一覧表示し、トラブルシューティングします。 MachineSet (Automation) ホストプロファイル インフラストラクチャを手動または自動でスケーリングするための自動化プロファイルを設定します。スケールされたMachineSetはMachineオブジェクトを作成し、利用可能なベアメタルホストを割り当て、MachineSetで定義されたインストールと設定をトリガーします。 MachineAutoscalers (Automation) 該当なし MachineSetをスケーリングするための自動スケーリングルールを定義します。 MachineHealthChecks 該当なし 望ましい修復がMachineを削除すること(これによりノードの新規インストールがトリガーされる)である場合の、NodeHealthChecksの代替メカニズム。クラウドプロバイダーでは、ノードの削除と新しいベアメタルノードの作成が実行されます。 Bare Metal Host (Automation) 該当なし クラスタに追加されたベアメタルサーバーを一覧表示し、操作します。ベアメタルホストには、手動でインストールされたサーバーと、MachineSetスケーリングによって利用可能になりインストールされたサーバーが含まれます。BMC APIと統合することで、完全なサーバーライフサイクルが可能になります。 MachineConfigs (Automation) ホストプロファイル 宣言的なホスト設定を管理し、マシン プールごとに一貫した設定グループを確保し、設定のドリフトを防ぎます。 MachineConfigPools (Automation) ホストプロファイル ロールに基づいてノードにMachineConfigオブジェクトを割り当てる、さまざまなホスト設定プールを管理します。MachineConfigPoolsは、プラットフォームの更新/アップグレードを展開する際に、ノードをセグメント化し、異なるHAポリシーを定義することも可能にします。 Hardware Devices 該当なし 該当なし (特殊ハードウェアの有効化) オブザーバビリティ オブザーバビリティ機能マッピング 機能 VMware OpenShift トリガーに基づく通知/アラーム カスタムアラームは、イベント、条件、または状態トリガーに関するルール定義を提供し、重大度レベルを設定できます。 OpenShift Observability はルール定義を提供します。重大度レベルを設定でき、レベルごとに個別のアクションを設定できます。 多様な通知ターゲット カスタムアラームは、電子メール、SNMPトラップの設定、およびスクリプトの実行を提供します。 Alertmanager は、電子メール、Webhook、およびSlack、PagerDuty、MSTeamsを含むいくつかのサードパーティアプリのデフォルトハンドラを提供します。 イベントロギング vmware-n.logというログファイルへのロギングを有効にするためのVMごとの詳細オプションを提供します。 Vector/Loki/Logging Console プラグインは、従来のElasticsearch/Fluentd/Kibanaスタックを置き換え、より優れた洞察とオブザーバビリティを提供します。 Loggingのドキュメント も参照。 ログ転送 ホストのログはvCenterから別の場所/サードパーティのロギングアプリに送信できます。 Vectorのマルチログフォワーダー機能は、複数のRed Hatおよびサードパーティのロギングをサポートします。 クラスターロギングのサポートのドキュメント も参照。 メニューの対応表 OpenShift Virtualization メニュー項目 VMware での相当機能 説明 Alerting タスクとイベント イベントのリストを表示します。 Metrics タスクとイベント VMI/Podのパフォーマンスデータを表示します。 Dashboards パフォーマンス > 概要/詳細 パフォーマンスダッシュボード。 Target アカウント/パスワードによる統合アクセス 監視可能なサービスのリスト 仮想マシンコンポーネント 仮想マシンコンポーネントマッピングチャート 機能 VMware OpenShift ゲストエージェント VMware Tools QEMUゲストエージェント VMダンプ VMを右クリック > スナップショット、[仮想マシンのメモリを含める] ボックスにチェック。 virtctl VMクローン 対応 対応 タグとカスタム属性 タグとカスタム属性 ラベル (Labels) VM NIC 1000, e1000e, VMXNET 2 (Enhanced), VMXNET 3, Flexible, Vlance, PVRDMA, SR-IOV パススルー VirtIO、e1000e SCSIコントローラ LSI Logic SAS, BUSLogic Parallel, LSI Logic SAS, VMware Paravirtual SCSI SCSI, VirtIO, SATA 日々の運用で発生するタスク ※この項目のみOpenShift4.20を前提としています。 インフラストラクチャ管理タスク タスク デモ Red Hat Hybrid Cloud Console のインストール、設定、および管理 Assisted Installer ツールを使用した Single Node OpenShift のデプロイ。 Assisted Installer を使用したOpenShift Virtualizationクラスタのインストール(英語。) Assisted Installer を使用した OpenShift Virtualization のデプロイ。 OpenShift での Kube descheduler インスタンスの設定とデプロイ(英語)。 仮想化環境の定期的なメンテナンスとアップグレードの実行 メンテナンスモードへの移行によるノードメンテナンス 仮想マシン (VM)、テンプレート、スナップショット、およびリソース割り当ての管理。 ACMを使用したOpenShift上のVMの管理と監視 バックアップおよびDR(災害復旧)タスク タスク デモ VM バックアップおよびリカバリソリューションの実装と管理 Trilio を使用した Red Hat OpenShift のデータ保護(英語) Red Hat OpenShift Virtualization向けPortworxソリューション(英語) Veritas NetBackup を使用した VM のバックアップとリストア(英語) バックアップおよびリカバリーソリューションの詳細については、 Partner Ecosystem Catalog をご確認ください。 仮想化環境向けのDR(災害復旧)計画の策定とテスト。 RHACM と ODF を使用した VM のRegional Disaster Recovery(英語) セキュリティおよびコンプライアンスタスク タスク デモ パッチと更新の適用 Red Hat Ansible による仮想インフラストラクチャの自動化(英語) 自動化およびスクリプティングのタスク タスク デモ OpenShift CLI、PowerShell、または Python を使用したタスクの自動化 AAP を使用した OpenShift VM のインベントリ管理(英語) (該当する場合は)Infrastructure as Code (IaC) の管理 AAP を使用した VM の管理と監視(英語) Red Hat OpenShift Service on AWS での GitOps を使用したVM 作成(英語) その他参考に利用できるリスト: OpenShift用語集(最新リリース) 1.5. OpenShift Container Platform のノードの一般用語集 | ノード | OpenShift Container Platform | 4.20 | Red Hat Documentation
はじめに はじめに oc diff とは cluster-compare とは 必要なファイル 検証 まとめ OpenShift Advent Calendar 2025 の 17 日目です。担当の金子です。よろしくお願いします。 qiita.com 今回は、cluster-compare plugin をご紹介します。このツールは、github 上では kube-compare という名前ですが、期待した設定が行われているのかをチェックするためのツールです。 github.com 期待したものと一致しているかという点では、例えば diff ツールである oc diff に近いですが、どう違うのかをサンプルを参考に見ていきたいと思います。 oc diff とは コマンドのヘルプは以下のようになっています。これはこれから適用しようとしているYamlなどのリソースファイルと、すでに適用されているリソースの情報がどのように変わるのか?というところを確認するためのツールです。 Diff configurations specified by file name or stdin between the current online configuration, and the configuration as it would be if applied. The output is always YAML. KUBECTL_EXTERNAL_DIFF environment variable can be used to select your own diff command. Users can use external commands with params too, example: KUBECTL_EXTERNAL_DIFF="colordiff -N -u" By default, the "diff" command available in your path will be run with the "-u" (unified diff) and "-N" (treat absent files as empty) options. Exit status: 0 No differences were found. 1 Differences were found. >1 Kubectl or diff failed with an error. Note: KUBECTL_EXTERNAL_DIFF, if used, is expected to follow that convention. Examples: # Diff resources included in pod.json oc diff -f pod.json # Diff file read from stdin cat service.yaml | oc diff -f - ではサンプルとして、適当なYamlを生成します。 $ oc new-app httpd --dry-run -o yaml 出力結果 apiVersion: v1 items: - apiVersion: apps/v1 kind: Deployment metadata: annotations: image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"httpd:2.4-ubi9","namespace":"openshift"},"fieldPath":"spec.template.spec.containers[?(@.name==\"httpd\")].image"}]' openshift.io/generated-by: OpenShiftNewApp creationTimestamp: null labels: app: httpd app.kubernetes.io/component: httpd app.kubernetes.io/instance: httpd name: httpd spec: replicas: 1 selector: matchLabels: deployment: httpd strategy: {} template: metadata: annotations: openshift.io/generated-by: OpenShiftNewApp creationTimestamp: null labels: deployment: httpd spec: containers: - image: ' ' name: httpd ports: - containerPort: 8080 protocol: TCP - containerPort: 8443 protocol: TCP resources: {} status: {} - apiVersion: v1 kind: Service metadata: annotations: openshift.io/generated-by: OpenShiftNewApp creationTimestamp: null labels: app: httpd app.kubernetes.io/component: httpd app.kubernetes.io/instance: httpd name: httpd spec: ports: - name: 8080-tcp port: 8080 protocol: TCP targetPort: 8080 - name: 8443-tcp port: 8443 protocol: TCP targetPort: 8443 selector: deployment: httpd status: loadBalancer: {} kind: List metadata: {} さて、例えばReplica数を変更して、差分を見てみます。 以下が実行結果です。 $ oc diff -f updated.yaml diff -u -N /tmp/LIVE-4097228620/apps.v1.Deployment.sample-diff.httpd /tmp/MERGED-3257600314/apps.v1.Deployment.sample-diff.httpd --- /tmp/LIVE-4097228620/apps.v1.Deployment.sample-diff.httpd 2025-12-16 22:47:19.926721198 +0900 +++ /tmp/MERGED-3257600314/apps.v1.Deployment.sample-diff.httpd 2025-12-16 22:47:19.926721198 +0900 @@ -8,7 +8,7 @@ {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"image.openshift.io/triggers":"[{\"from\":{\"kind\":\"ImageStreamTag\",\"name\":\"httpd:2.4-ubi9\",\"namespace\":\"openshift\"},\"fieldPath\":\"spec.template.spec.containers[?(@.name==\\\"httpd\\\")].image\"}]","openshift.io/generated-by":"OpenShiftNewApp"},"creationTimestamp":null,"labels":{"app":"httpd","app.kubernetes.io/component":"httpd","app.kubernetes.io/instance":"httpd"},"name":"httpd","namespace":"sample-diff"},"spec":{"replicas":1,"selector":{"matchLabels":{"deployment":"httpd"}},"strategy":{},"template":{"metadata":{"annotations":{"openshift.io/generated-by":"OpenShiftNewApp"},"creationTimestamp":null,"labels":{"deployment":"httpd"}},"spec":{"containers":[{"image":" ","name":"httpd","ports":[{"containerPort":8080,"protocol":"TCP"},{"containerPort":8443,"protocol":"TCP"}],"resources":{}}]}}},"status":{}} openshift.io/generated-by: OpenShiftNewApp creationTimestamp: "2025-12-16T13:44:19Z" - generation: 2 + generation: 3 labels: app: httpd app.kubernetes.io/component: httpd @@ -19,7 +19,7 @@ uid: 074b93f2-71ad-49c1-ae22-4c831c157b9f spec: progressDeadlineSeconds: 600 - replicas: 1 + replicas: 3 revisionHistoryLimit: 10 selector: matchLabels: @@ -38,7 +38,7 @@ deployment: httpd spec: containers: - - image: image-registry.openshift-image-registry.svc:5000/openshift/httpd@sha256:379ba2fc60106c2026bafa8e7d0ad585d87e6e7fe3f0a6a3d714f744e450bdf2 + - image: ' ' imagePullPolicy: IfNotPresent name: httpd ports: 変更したレプリカ数だけでなく、OpenShift がデフォルトで埋め込んだ generation やイメージ名が差分として出力されています。 では、次に cluster-compare を見ていきましょう cluster-compare とは 必要なファイル cluster-compare では大きく以下の2つのファイルが必要となります。 指示書(metadata.yaml): 「比較のルールブック」 です。 cluster compare コマンドはこのファイルを読み込んで動きます。 正解データ(reference.yaml) : 「理想のカタチ(雛形)」 です。 Kubernetes のマニフェスト(YAML)そのものですが、チェックしたい部分だけを書きます。 実際にやってみましょう 検証 次はすでに定義されている deployment が期待どおりであるかを確認するYamlファイルを用意していきます。 cluster-compareの場合、必要なファイルは以下のようになります。 指示書の準備をします。以下のようなファイルを用意します。今回は設定していないもの以外は無視するので、 ignore-unspecified-fields: true を設定します。 # このファイルの役割: # 比較の設定(ルール)と、読み込むリファレンスファイル(reference.yaml)を指定します。 apiVersion: compare.openshift.io/v1 kind: ReferenceConfig metadata: name: httpd-replicas-check # このチェック設定自体の名前(任意の名前でOK) parts: - name: httpd-check # チェック項目のグループ名 components: - name: httpd-deployment allOf: # 読み込む「正解(Golden Config)」ファイルへのパス - path: reference.yaml # 【重要】比較のルール設定 config: # "true" にすると、reference.yaml に書いていない項目(imageやresourcesなど) # がクラスタ側に存在しても、それらを「差分」として扱わずに無視します。 # これにより「特定の項目だけチェックする」ことが可能になります。 ignore-unspecified-fields: true それでは次は、正解データです。reference.yaml ファイルの中身は以下のとおりです。 # このファイルの役割: # 「こうあるべき」という期待値を定義します。 # ここに書いていないフィールドは全て無視されます(imageなどが違っていてもOKになります)。 apiVersion: apps/v1 kind: Deployment metadata: # チェック対象のクラスタ上のリソース名と一致させる必要があります name: httpd spec: # 【ここがチェック対象】 # ここに "3" と書くことで、「クラスタ上の設定も 3 であること」を検証します。 # 1 や 2 になっていればエラー(差分)として検出されます。 replicas: 3 # 【ポイント】 # template や containers, image などをあえて書いていません。 # 書かないことで、それらの設定がどうなっていても検証をパス(無視)させます。 それでは比較内容を見てみましょう。実行結果をみると、replicas のみが検出されている事がわかります。 $ oc cluster-compare -r metadata.yaml W1216 23:05:26.956190 38961 compare.go:548] There may be an issue with the API resources exposed by the cluster. Found kind but missing group/version for Deployment.apps/v1 ********************************** Cluster CR: apps/v1_Deployment_sample-diff_httpd Reference File: reference.yaml Diff Output: diff -u -N /tmp/MERGED-3597769725/apps-v1_deployment_sample-diff_httpd /tmp/LIVE-655434274/apps-v1_deployment_sample-diff_httpd --- /tmp/MERGED-3597769725/apps-v1_deployment_sample-diff_httpd 2025-12-16 23:05:27.198646512 +0900 +++ /tmp/LIVE-655434274/apps-v1_deployment_sample-diff_httpd 2025-12-16 23:05:27.198646512 +0900 @@ -13,7 +13,7 @@ namespace: sample-diff spec: progressDeadlineSeconds: 600 - replicas: 3 + replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: ********************************** Summary CRs with diffs: 1/1 No validation issues with the cluster No CRs are unmatched to reference CRs Metadata Hash: 8e61ec9181a90a00222985c0353cdfcc722a04b4799ae106f03eb49ab169ee7a No patched CRs もっと細かい話はこちらを参照してください。 kube-compare/docs/reference-config-guide-v2.md at main · openshift/kube-compare · GitHub まとめ 今回は、OpenShift (Kubernetes) の設定差分を確認する2つのツール、 oc diff と cluster-compare (kube-compare) の違いについて、実例を交えてご紹介しました。最後に、両者の違いと使い分けのポイントを整理します。 ツールごとの特徴比較 特徴 oc diff cluster-compare 主な目的 作業前の影響確認 (Dry-run) 現状の診断・監査 (Audit) 比較の視点 「このファイルを適用したら、何が変わる?」 「今の状態は、あるべき姿(理想)と合っている?」 比較対象 手元の全フィールド vs 現状 指定した重要フィールド vs 現状 ノイズ 多い (generation, managedFields等) 少ない (意図的に無視できる) 結局どう使い分ける? 検証結果からも分かる通り、 「いつ」「何のために」 使うかで明確な棲み分けができます。 oc diff の出番 oc apply や oc replace を実行する直前の最終確認。 手元のマニフェストとクラスタの全差分を厳密に見たい時。 cluster-compare の出番 「なんか設定おかしくない?」と思った時のトラブルシューティング。 本番運用中のクラスタが、設計上の重要項目(レプリカ数や特定の設定値)を守れているか定期的にチェックする時。 特に、今回検証した ignore-unspecified-fields: true の機能は強力です。oc diff では避けられない「自動付与されたアノテーション」や「環境固有のIPアドレス」などのノイズを排除し、「人間が見るべき本当の差分」だけを抽出できるのが cluster-compare 最大のメリットと言えるでしょう。 「diff で差分が出すぎて見る気が失せる…」という経験がある方は、ぜひ cluster-compare をツールボックスの一つに入れてみてください。 明日の Advent Calendar もお楽しみに!
Apache Camel Advent Calendar 17日目の記事は、サポート担当古市が担当します。 テーマは、「Camel アンチパターン」 技術書籍では良く目にする「アンチパターン」というトピックですが、サポート窓口での対応を通して感じることはあります。 今回はサポート体験を通して気がついた Camel の取り扱い注意点についてご紹介します。 恐らく開発と保守が別れており、保守の方からのお問い合わせだからと思われますが、圧倒的に多い調査初動のトラブルがこちら。 問題となっているログがどの Camel route から出力されているか分からない。 12日目の記事でお話した問題です。 route template を積極的にご利用いただくことで、保守への負荷を下げるようご検討ください。 次に、3日目の記事で軽く触れましたが、こちらも大きな課題だと感じます。 Camel Component をほぼ使用せず、常に カスタムプロセッサーや Java Bean の実行でルーティングを構成する。 Camel Component を上手に取り込んだ camel route は、汎用性や拡張性が高く、保守の負荷も下がります。障害調査の際、芸術的に設計された camel route を拝見して感動したことがあります。 逆を言えば、ルーティングに property や variable を活用せず、ハードコードに近い Java Beanのみを乱用する camel route を拝見すると、正直 Quarkus単体で実装を済ませても良いぐらいに思えてしまいます。 何かがおかしいと思われた場合、積極的に camel community をご活用ください。きっとコミュニティーからリファクタリングのアドバイスをもらえるはずです。(過去に、数百の camel routeを 3つにまとめられるというアドバイスもありました。) 3つ目の課題はこちら。 複雑な処理を組み込み過ぎて、パフォーマンスが上がらない。 パフォーマンスに関するお問い合わせも多々ございます。中でも目立つ split / aggreate の使い方で特に気をつけていただきたいのが、とにかく軽めの処理で終わらせることです。 aggregate 処理中に別途 JDBCを使った SQL 処理をされている方もいらっしゃいました。メッセージのルーティングに関わる split / aggregate などの処理は極力シンプルで軽い処理で済ますべきです。 (補足となりますが split の際、message body が GB単位のテキストファイルというケースがたまにありますが、ストリーミング形式で読み取らないとヒープ領域が枯渇してしまうというトラブルに繋がりますので、ご注意ください。) camel component を使うべきとお伝えした後に矛盾するコメントとなりますが、不用意に複雑な機能を使う必要はありません。スモールスタートで少しづつ拡張するようご検討ください。 せっかく Camel の導入を検討されているのですから、このツールボックスの真の素晴らしさを体験していただきたいと心から願っています。 何か上手くいかないと感じましたら、お気軽にサポートサービスもご利用ください。アップストリームで活躍している開発スタッフ達を含め、皆様のお役に立てるよう対応させていただきます。 明日の advent calendar 18日目では、「Camel ベストプラックティス」についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com
※本記事は OpenShift Virtualization アドベントカレンダーの 16 日目の記事です。 qiita.com こんにちは、OpenShift のプリセールスを担当している山川です。 OpenShift Virtualizationは、メジャーなクラウド上での利用が可能となっています。 OpenShift 4.20の時点では、サブスクリプション持ち込みのAWS、Red Hat OpenShift Service on AWS (ROSA)、Oracle Cloud Infrastructure、Azure Red Hat OpenShift (ARO) が GA、Google Cloud が Technology Preview となっており、クラウド上で OpenShift Virtualization を利用していただくことも選択可能です。 今回は、AWS をすでにご利用のお客様からのご質問の多い項目に着目し、コンピュート、ストレージ、ネットワークの 3 つの観点から AWS 上で OpenShift Virtualization を利用するための疑問を解消していきたいと思います。 なお、ROSA と FSx for NetApp ONTAP を用いて OpenShift Virtualization を利用する方法は赤帽ブログで公開しておりますので、すぐに使いたいという方はぜひご参照ください。 rheb.hatenablog.com セルフマネージド OpenShift on AWS とマネージドサービス Red Hat OpenShift Service on AWS の選択 AWS 上で OpenShift Virtualization を利用する際には、Red Hat からサブスクリプションをご購入いただき持ち込み、セルフマネージド OpenShift を構築する方法、マネージドサービスである Red Hat OpenShift Service on AWS を利用する方法の 2 つがあります。 前者の場合、Control Plane / Compute Node をユーザーの VPC に構築します。 セルフマネージド OpenShift は Red Hat がサポート可能な Single Node OpenShift (1 Node に全てのコンポーネントを含んだ検証用途の構成)、Compact Cluster (Control Plane / Worker Node を 3 Node に集約した構成) をはじめとし、要件に応じて構成を選択することが可能です。 ROSAの場合、Control Plane は Red Hat が管理する VPC、Compute Node はユーザー管理の VPC に構築され、最低 2台の Compute Node から開始可能です。 クラスタの運用管理に必要な 2 つの VPC 間の通信は、AWS PrivateLink というサービスを介して通信が行われます。 PrivateLink を利用することが必要であるため、ROSA インストール時に VPC endpoint が自動で作成されています。 ROSA に関しては、クラスタ全体の管理は Red Hat が主体となり実施します。ROSA を用いることで運用の省力化が可能のため、AWS で OpenShift を利用されるユーザーにおすすめの方法となります。 EC2 インスタンスタイプの選定 セルフマネージド OpenShift on AWS、ROSA 共に EC2 上にクラスタが構築されます。 OpenShift Virtualization は、ベアメタルインスタンス上での利用が必須要件となっているため、仮想マシンをデプロイする Compute Node 1 台以上にベアメタルインスタンスを選択いただくことが必須があります。 なお、OpenShift 1 クラスタにベアメタルとベアメタル以外の Compute Node を混在する場合は、ベアメタルインスタンスの Compute Node にデプロイされるよう、nodeSelector やNode Affinity といった機能を用いて指定するようにしましょう。 docs.redhat.com 選択可能なストレージ OpenShift Virtualization は、必ず外部にストレージを設ける必要があります。 セルフマネージド OpenShift on AWS、ROSA、いずれの方法においても 4 種類のストレージ (Amazon Elastic Block Store (EBS)、Red Hat OpenShift Data Foundation (ODF)、FSx for NetApp ONTAP、Portworx) をサポートしています。 Virtualization | OpenShift Container Platform | 4.20 | Red Hat Documentation Amazon Elastic Block Store (EBS) AWSのEC2向け標準ブロックストレージです。 注意点は、RWX (ReadWriteMany) には対応しておらず、ReadWriteOnce (RWO) に対応しています。 Red Hat OpenShift Data Foundation (ODF) OpenShiftユーザーのための SDS (Software Defined Storage) です。OpenShift の GUI 上からインストールが可能であり、インストール後は OpenShift のGUI に統合された管理画面が表示されます。 3ノードに冗長化されてデータを保管するため、マルチAZ構成が可能です。RWX に対応しています。 利用する場合、OpenShift Platform Plus という Red Hat サブスクリプションの追加購入が必要となります。 FSx for NetApp ONTAP AWSが提供するマネージドで使えるNetApp製の高機能ファイルストレージとなります。 オプションで、マルチAZを選択することが可能です。RWX にも対応しています。 AWS のマネジメントコンソールを用いて展開が可能であり、支払いも AWS 経由です。 Portworx Pure Storage が提供する、設計された商用の SDS です。 3ノードに冗長化されてデータを保管するため、マルチAZ構成が可能です。 RWX に対応しています。 利用のためには別途ソフトウェアのライセンスを購入いただく必要がございます。 最もコストが最適化されるのは EBS ですが、OpenShift Virtualization でライブマイグレーションをする際には RWX のストレージが必要であることから機能制約に関する注意が必要です。 ライブマイグレーション等の機能が必要で、RWX に対応したストレージを用いた構成をご検討の場合、EBS 以外の選択肢をご検討ください。 AWS 外部からの接続について AWS への接続については、双方とも Internet Gateway、Site to Site VPN、Direct Connect、CloudFront Origin など、VPC の外部から内部へ通信する経路を確保できることにより、中の VM へのアクセスが可能となります。 VPC から OpenShift クラスタ内部には、Elastic Load Balancer を経由し、クラスター内のネットワークに入ります。 また、ROSAの場合、パブリックネットワーク (Public subnet に Network Load Balancer が構築される) とプライベートネットワーク (Private subnet に Network Load Balancer が構築される) をインストール時に選択することが可能です。 プライベートネットワークを指定する場合は、Internet Gateway からの通信をルーティングできないため、Site to Site VPN、Direct Connect、CloudFront Origin などを選択することで通信が通るよう設計ください。 パブリックネットワーク上にデプロイされた Red Hat OpenShift Service on AWS プライベートネットワーク上にデプロイされた Red Hat OpenShift Service on AWS OpenShift 内で VM の IP アドレスや VM が所属するネットワークセグメントを固定したい場合、User Defined Network という機能を用いて実現が可能です。 User Defined Network に関しては、下記の赤帽ブログ記事が分かりやすいので、ご参照ください。 rheb.hatenablog.com まとめ OpenShift Virtualization を AWS 上に構築する際には、様々なオプションから柔軟に選択をいただくことが可能です。 今回は、最初の検討で特に重要な観点について触れました。 本ブログを参考に、ぜひ OpenShift on AWS をお試しください!
Apache Camel Advent Calendar 16日目の記事は、サポート担当古市が担当します。 テーマは、「Camel で header/variable を使い分ける」 Camel 2.x ユーザーの皆さんにはお馴染みの message header。consumer endpointから受け取った exchange に対して、とりあえず setHeader() を実行されている方も多いのではないでしょうか。 ルーティングに直結するようなメタデータを格納するのに便利な header ですが、ルーティング中の処理で必要となるがメッセージ自体とは直接関係しないアプリケーションデータなどは、message header ではなく exhcange property に格納する使い分けをお勧めしています。 camel.apache.org 余談ですが、Camel 4.x で Exchange property に Simple言語でアクセスする場合、以下のようになります。 ${exchangeProperty.foo} //プロパティー名 foo にアクセス camel.apache.org exchange property の課題としては、Camel 自体も内部のコントロールに使用していることが多々あり、純粋にユーザーアプリケーションデータのみを取り扱うことができませんでした。 (例: split では、CamelSplitIndex, CamelSplitComplete, CamelSplitSize が使われます。) Camel 4.x で登場した variable を使うことで、この課題を克服できます。それだけでなく、variable はスコープの管理も可能であり、より柔軟なアクセス管理を実現できます。 ExchangeVariableRepository - exchange 毎に管理される。 Camel DSL 内では、デフォルトでこちらが使われる。 exchange.getVariable("myKey") RouteVariableRepository - ルート毎に管理される。 Camel DSL 内では、プリフィックス "route:" でアクセスする。 exchange.getVariable("route:myRouteId:myRouteKey") , context.getVariable("route:myRouteId:myRouteKey") GlobalVariableRepository - CamelContext 毎に管理される。 Camel DSL 内では、プリフィックス "global:" でアクセスする。 exchange.getVariable("global:myGlobalKey") , context.getVariable("myGlobalKey") camel.apache.org Exchange property と同様、コーディングは直感的でわかり易いかと思います。 variable は Parameter Binding にも対応していますので、Bean method からのアクセスも簡単に実装可能です。 camel.apache.org 今後はぜひ message header と variable を使い分け、よりメンテナンスのし易い設計をご検討いただければと思います。 明日の advent calendar 17日目では、「Camel アンチパターン」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com