OperatorHub.ioからKubernetes上へCryostat Operatorをインストール

Red Hat で Java Platform Advocate として OpenJDK を担当している伊藤ちひろ(@chiroito)です。

この記事は、Red Hat Developerのブログ記事、Install the Cryostat Operator on Kubernetes from OperatorHub.io | Red Hat Developer の翻訳記事です。


https://developers.redhat.com/sites/default/files/styles/article_feature/public/2020_Java_ContainerJFR_Featured_Article__A-01.png?itok=K_g-UdJY

Cryostat はコンテナネイティブのJVM アプリケーションで、JDK Flight Recorder(JFR) を使ってコンテナのプロファイリングと監視を行うためのセキュアな API を提供します。Cryostat 2.0では、他の機能として、OperatorHub.ioカタログの一部として提供されているCryostat Operatorが導入されました。Cryostat Operator を使用すると、既存のKubernetes環境に Cryostat を簡単にインストールできます。この記事では、インストール手順を説明します。

前提条件

開始するには、cert-managerがインストールされた実行中のKubernetesクラスタが必要です。この記事で説明する手順は、ローカルのMinikubeクラスターを想定しています。

ステップ1.Cryostat Operatorのインストール

まず、OperatorHub.io の Cryostat Operator ページに移動することから始めましょう。このページには、簡単な概要、前提条件、Kubernetesカスタムリソース定義(CRD)、Cryostatに関する詳細情報へのリンクなど、Cryostat Operatorに関する有用な情報が記載されています。install をクリックすると、クラスタに Operator をインストールするために必要な手順を示すポップアップウィンドウが表示されます。

指示に従って、OLM(Operator Lifecycle Manager)をインストールすることから始めます。

curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.19.1/install.sh | bash -s v0.19.1

コマンドが終了したら、インストールが正常に行われたことを確認します。

kubectl get pods -n olm

このような感じで出力されるはずです。

​NAME                               READY  STATUS    RESTARTS  AGE
catalog-operator-84976fd7df-9w7ds  1/1    Running   0         44s
olm-operator-844b4b88f8-pvrtn      1/1    Running   0         44s
operatorhubio-catalog-5p87x        1/1    Running   0         43s
packageserver-5b7c7b9c65-7nfwc     1/1    Running   0         42s
packageserver-5b7c7b9c65-stvq8     1/1    Running   0         42s

次に、Cryostat Operator をインストールします。以下のコマンドで、my-cryostat-operator名前空間にOperator が展開されます。

kubectl create -f https://operatorhub.io/install/cryostat-operator.yaml

: このコマンドが何をするかについての詳細については、OperatorHub.ioを参照してください。

Cryostat Operatorが展開されるまで、20〜30秒かかります。以下のコマンドでその様子を確認できます。

kubectl get csv -n my-cryostat-operator -w

operator フェーズでSucceeded と表示されたら、Cryostat のデプロイメントを作成する準備はほぼ完了です。しかし、最初にいくつかのネットワーク設定に取り組む必要があります。

ステップ2.Ingressルーティングを設定

Kubernetesでは、Cryostat Operatorがクラスタ外で利用できるようにするために、各サービスにIngressの設定が必要です。より詳細な説明は、Cryostat OperatorのドキュメントのNetwork Optionsのセクションを参照してください。(ドキュメントには、さまざまなニーズに対応するための他のCryostat設定オプションに関する情報も含まれています)。

必要なIngressの設定を行うには、クラスタ上でIngress Controllerが動作している必要があります。Kubernetesには様々なIngress Controllerがありますが、今回のデモではNGINX Ingress Controllerを使用します。

Kubernetesのドキュメントには、NGINX Ingress Controllerを使用してMinikube上でIngressをセットアップする方法についての有益な情報が記載されています。まず、Ingress Controllerを有効化します。

minikube addons enable ingress

次に、NGINX Ingress Controllerが期待通りに動作していることを確認します。

kubectl get pods -n ingress-nginx

以下のような出力になり、コントローラのPodがREADYになったら、次のステップに進みます。

​NAME                                       READY  STATUS      RESTARTS  AGE
ingress-nginx-admission-create--1-9x9s4    0/1    Completed   0         37s
ingress-nginx-admission-patch--1-76m8b     0/1    Completed   1         37s
ingress-nginx-controller-5f66978484-ntw6f  1/1    Running     0         37s

ステップ3.Cryostatのデプロイメントを作成

Cryostat インスタンスをデプロイするには、Cryostat CRD を表す YAML ファイルを使用して、Cryostat オブジェクトを作成します。Cryostat Operator のドキュメントのNetwork Options セクションには、いくつかの小さな変更を行った後にこのデモで動作する Ingress の仕様の例があります。

まず、spec の下にあるminimalフィールドは、Cryostat CRD の必須フィールドなので追加し、false に設定します。これにより、最小値でないCryostatのデプロイが確保されます。

次に、3つのIngress設定のannotationsフィールドで、proxy-read-timeoutproxy-send-timeoutの値をデフォルトの60秒から3600秒に増やします。こうすることで、Cryostatが依存するウェブソケット接続が閉じられるのを防げます。

この例を修正すると、次のようになります。

<200b>apiVersion: operator.cryostat.io/v1beta1
kind: Cryostat
metadata:
 name: cryostat-sample
spec:
 minimal: false
 networkOptions:
   coreConfig:
     annotations:
       nginx.ingress.kubernetes.io/backend-protocol : HTTPS
       nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
       nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
     ingressSpec:
       tls:
       - {}
       rules:
       - host: testing.cryostat
         http:
           paths:
           - path: /
             pathType: Prefix
             backend:
               service:
                 name: cryostat-sample
                 port:
                   number: 8181
   commandConfig:
     annotations:
       nginx.ingress.kubernetes.io/backend-protocol : HTTPS
       nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
       nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
     ingressSpec:
       tls:
       - {}
       rules:
       - host: testing.cryostat-command
         http:
           paths:
           - path: /
             pathType: Prefix
             backend:
               service:
                 name: cryostat-sample-command
                 port:
                   number: 9090
   grafanaConfig:
     annotations:
       nginx.ingress.kubernetes.io/backend-protocol : HTTPS
       nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
       nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
     ingressSpec:
       tls:
       - {}
       rules:
       - host: testing.cryostat-grafana
         http:
           paths:
           - path: /
             pathType: Prefix
             backend:
               service:
                 name: cryostat-sample-grafana
                 port:
                   number: 3000

このコードをcryostat-sample.yamlという名前のファイルにコピーしてください。このファイルの準備ができたら、それを使ってmy-cryostat-operatorネームスペースに Cryostat のデプロイメントを作成できます。

kubectl apply -f cryostat-sample.yaml -n my-cryostat-operator

次に、デプロイの健全性を確認します。

kubectl get pods -n my-cryostat-operator -w

cryostat-sample podを構成する3つのコンテナが全てREADYになったら、次に進みます。

​NAME                                                   READY  STATUS             RESTARTS  AGE
cryostat-operator-controller-manager-6f7fdb5c68-cwgc5  1/1    Running            0         85s
cryostat-sample-d57dd74bb-5bqj9                        0/3    Pending            0          0s
cryostat-sample-d57dd74bb-5bqj9                        0/3    Pending            0          0s
cryostat-sample-d57dd74bb-5bqj9                        0/3    ContainerCreating  0          0s
cryostat-sample-d57dd74bb-5bqj9                        2/3    Running            0          2s
cryostat-sample-d57dd74bb-5bqj9                        2/3    Running            0         11s
cryostat-sample-d57dd74bb-5bqj9                        3/3    Running            0         11s

ステップ4.CryostatのサービスURLをMinikubeにルーティング

次に、Ingressのコンフィギュレーションを入手します。

kubectl get ingress -n my-cryostat-operator

ここまでの設定が正しければ、このコマンドの出力は次のようになります。

​NAME                     CLASS  HOSTS                     ADDRESS    PORTS    AGE
cryostat-sample          nginx  testing.cryostat          localhost  80, 443  5m4s
cryostat-sample-command  nginx  testing.cryostat-command  localhost  80, 443  5m4s
cryostat-sample-grafana  nginx  testing.cryostat-grafana  localhost  80, 443  5m4s

Minikubeはローカルで動作しているため、ADDRESS列のIPv4アドレスは実際には3つのサービスの内部アドレスとなります。クラスタ内のサービスが公開される外部アドレスを取得するには、次のコマンドを実行します。

minikube ip

: この記事では、IP_ADDRESSはこのコマンドが返すアドレスの代わりに使用します。

次のステップでは、コンピュータの/etc/hostsファイルを編集します。(このファイルのパスは、LinuxとmacOSの両方で有効です。Windowsの場合、パスはC: \Windows\System32\Drivers\hostsです)このファイルを編集するには、管理者権限が必要です。

SUDO_EDITOR=gedit sudoedit /etc/hosts

ファイルの一番下に次の行を追加します。

{IP_ADDRESS} testing.cryostat testing.cryostat-command testing.cryostat-grafana

{IP_ADDRESS}は、上記のminikube ipコマンドを実行したときの結果であることを忘れないでください。

この追加により、Webブラウザは上記3つのホストのいずれかを含むHTTPS URLへのリクエストをMinikubeにルーティングするようになります。testing.cryostat-grafanaホストは、現在の Cryostat インスタンスにリンクされている Grafana ダッシュボードにアクセスするためのものです。testing.cryostat-commandホストは、非推奨のコマンドチャンネルから残されたものです。

hostsファイルを変更すると、https://testing.cryostatでCryostatのウェブクライアントUIにアクセスできるようになります。

結論

この記事で説明した手順でCryostat Operatorをインストールした後、次にできることがいくつかあります。Cryostat で動作するように Java アプリケーションを構成して、Web クライアントを使用して監視できます。また、Java アプリケーションを監視するためのカスタムターゲットを設定できます。Cryostat 2.0 のその他の便利な新機能については、Cryostat 2.0を発表:コンテナ用JDK Flight Recorder - 赤帽エンジニアブログ を参照してください。Cryostat で何ができるかについては、ContainerJFR入門: コンテナのためのJDK Flight Recorder - 赤帽エンジニアブログをご覧ください。

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