3.4 Kubernetesクラスタの準備

Kubernetesでは、MicroTxをサービス・メッシュ内にインストールすることもサービスなしでインストールすることもできます。インストール・バンドルにはHelmチャートが用意されています。この項では、Istioサービス・メッシュを使用してKubernetesクラスタにMicroTxをインストールする手順を示します。

同様の構成を作成すると、サポートされている他の環境にMicroTxをインストールできます。Kubernetesクラスタで別のサービス・メッシュを使用する場合は、独自のHelmチャートを作成します。

次の図は、MicroTxが、他のマイクロサービスとともにKubernetesクラスタのIstioサービス・メッシュ内にインストールされたデプロイメント例を示しています。

MicroTxのコンポーネント

Istioは、サービス間通信を処理するために個別のインフラストラクチャ・レイヤーを提供するサービス・メッシュです。ネットワーク通信がサービスそのものから取り出されて、プロキシによって処理されます。Istioではサイドカー設計が使用されています。つまり、通信プロキシは各サービス・コンテナ外部の独自のコンテナ内で実行されます。Envoyは、マイクロサービス・コンテナ内にサイドカーとしてデプロイされるプロキシです。サービス・メッシュ内のすべての通信は、Envoyプロキシを介して行われます。

トピック:

3.4.1 Kubernetesでのデプロイメントの考慮事項

KubernetesにMicroTxをデプロイする際は、次の要因を考慮してください。

インストール・バンドルにはHelmチャートが用意されています。このドキュメントでは、Istioサービス・メッシュを使用したKubernetesクラスタでのMicroTxのサンプル・デプロイメントの詳細を示します。Kubernetesクラスタで別のサービス・メッシュを使用する場合は、独自のHelmチャートを作成します。

サポートされているKubernetesプラットフォーム

MicroTxは、データ・センターまたはクラウド環境で実行されているKubernetesクラスタにデプロイします。MicroTxは、次のプラットフォームでKubernetes 1.21.xまたは互換性のあるバージョンでテストされています:

  • Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)Oracle Cloud InfrastructureドキュメントKubernetesクラスタの作成を参照してください。
  • Minikube
  • Oracle Linux Container Native Environment

複数のKubernetesクラスタへのデプロイメント

アプリケーション・マイクロサービスおよびMicroTxは、単一のKubernetesクラスタ内の単一のIstioサービス・メッシュ内にデプロイできます。

アプリケーション・マイクロサービスが複数のKubernetesクラスタに分散される場合、またはMicroTxでOracle DatabaseまたはTuxedoと通信しようとする場合は、MicroTxを別のKubernetesクラスタにデプロイできます。このようなシナリオでは、各KubernetesクラスタがIstioサービス・メッシュを含みます。複数のIstioサービス・メッシュ間の通信を有効にするために、イングレス・ゲートウェイおよびエグレス・ゲートウェイを構成する必要があります。

3.4.2 Kubernetesクラスタの作成

Kubernetesクラスタを作成するか、既存のものを使用します。このクラスタにMicroTxをインストールします。

開始する前に、次の方法で環境を計画する必要があります:

  • MicroTxをホストするために単一ノードと複数ノードのどちらのKubernetesクラスタが必要かを決定します。開発環境では1つ以上の単一ノード・クラスタを作成し、本番環境では1つ以上の3ノード・クラスタを作成することをお薦めします。
  • 環境内の様々なコンポーネントを識別します。マイクロサービスがKubernetesクラスタで実行されている場合は、同じクラスタまたは別のクラスタにMicroTxをインストールできます。マイクロサービスが複数のKubernetesクラスタに分散されている場合、またはKubernetesクラスタに含まれないOracle DatabaseやTuxedoなどのコンポーネントとMicroTxが通信できるようにする場合は、MicroTxをホストするKubernetesクラスタを作成します。

3.4.3 必要なソフトウェアのインストールおよび構成

MicroTxをインストールする前に、必要なソフトウェアをローカル・マシンにインストールして構成する必要があります。

次の手順を実行して、必要なソフトウェアをインストールし、ローカル・マシンに環境を構成します:

  1. Kubernetesクラスタを操作するために、Kubernetesコマンドライン・インタフェース(Kubectl)バージョン1.21.x以降をインストールします。https://kubernetes.io/docs/tasks/tools/を参照してください。
    Kubectlを使用して、デプロイメントを作成および管理します。Kubectlは、Kubernetes APIを使用してクラスタとやり取りします。
  2. 最新バージョンのHelm 3.xをローカル・マシンにインストールします。詳細は、https://helm.sh/docs/intro/install/を参照してください。
    Helmを使用するとデプロイメントが容易になります。1つのコマンドを実行してアプリケーションとリソースをKubernetesクラスタにインストールできるためです。HelmはKubernetes APIサーバーとやり取りして、Kubernetesリソースのインストール、アップグレード、問合せおよび削除を行います。
  3. Istioバージョン1.12.1以降をデフォルトのIstioプロファイルを使用してKubernetesクラスタにインストールします。
    1. 次のコマンドを実行してIstioをダウンロードします。
      curl -sL https://istio.io/downloadIstioctl | sh -
    2. Istioパッケージのディレクトリに移動します。たとえば、パッケージがistio-1.12.1の場合:
      cd istio-1.12.1
    3. binフォルダにあるistioctlクライアント・ツールをワークステーションのPATHに追加します。次の例では、サンプル値が指定されています。ご自身の環境に基づいてパスを指定してください。
      export PATH=$PWD/bin:$PATH
    4. 前提条件チェックを実行して、クラスタがIstioのインストール要件を満たしているかどうかを検証します。
      istioctl x precheck

      次のメッセージが表示されます。次の手順に進み、問題がない場合はIstioをインストールできます。

      No issues found when checking the cluster. Istio is safe to install or upgrade!
      
    5. デフォルトのIstioプロファイルを使用して、KubernetesクラスタにIstioをインストールします。本番環境ではデフォルトのIstioプロファイルを使用することをお薦めします。さらに、次のコマンドを使用して、メッシュ・レベルでのJSON形式のログに対する分散トレースおよびプロキシ・アクセスを有効にします:
      istioctl install --set meshConfig.accessLogFile=/dev/stdout \
          --set meshConfig.accessLogEncoding=JSON \
          --set meshConfig.enableTracing=true \
          --set meshConfig.defaultConfig.tracing.sampling=100.0

    これによって、監査に使用できるアクセス・ログが作成されます。分散トレースを有効にして、マイクロサービスベースの分散システムの監視とトラブルシューティングを行います。たとえば、分散トランザクションの監視、根本原因の分析、サービスの依存関係の分析、パフォーマンスまたはレイテンシの最適化などです。

    Oracle Linux 8環境の場合のみ、次のコマンドを実行して追加のフラグ--set components.cni.enabled=trueを渡します。

    istioctl install --set meshConfig.accessLogFile=/dev/stdout \
        --set meshConfig.accessLogEncoding=JSON \
        --set meshConfig.enableTracing=true \
        --set meshConfig.defaultConfig.tracing.sampling=100.0 \
        --set components.cni.enabled=true

    詳細は、https://istio.io/latest/docs/setup/additional-setup/config-profiles/を参照してください。

  4. Kubernetesクラスタにマイクロサービス対応トランザクション・マネージャをデプロイするためのネームスペースを作成します。次のコマンドによって、otmmという名前のネームスペースが作成されます(otmmは、作成するネームスペースの名前):

    サンプル・コマンド

    kubectl create ns otmm

    サンプル・レスポンス

    namespace/otmm created
  5. 作成したネームスペースにistio-injection=enabledというラベルを付けて、サイドカーの自動インジェクションを有効にします。次のコマンドによって、otmmネームスペースにラベルが付けられます:

    サンプル・コマンド

    kubectl label namespace otmm istio-injection=enabled

    サンプル・レスポンス

    namespace/otmm labeled

3.4.4 DockerレジストリにアクセスするためのKubernetesシークレットの作成

Helmを使用してアプリケーションをインストールする場合は、Kubernetesシークレットを使用して、リモート・リポジトリからイメージをプルするための認証詳細を指定します。

指定したすべてのログイン詳細がKubernetesシークレットに含まれるのは、資格証明を含むdocker loginコマンドを使用してリモートDockerレジストリに手動でログインした場合です。

  1. 次のコマンドを使用してコマンドラインに資格証明を指定することで、シークレットを作成します。
    kubectl create secret docker-registry NAME --docker-server=SERVER --docker-username=USERNAME --docker-password=PASSWORD --docker-email=EMAIL --namespace=NAMESPACE

    説明

    • NAME: 作成するKubernetesシークレットの名前。この名前を書き留めておきます。後からシークレットを参照するためにマニフェスト・ファイルでこの名前を使用するためです。
    • SERVER: プライベートDockerレジストリの名前。形式は、Kubernetesプラットフォームによって異なります。たとえば、Oracle Cloud Infrastructure環境でのユーザー名の形式は<region-key>.ocir.ioです。
    • USERNAME: リモートDockerレジストリにアクセスするためのユーザー名。形式は、Kubernetesプラットフォームによって異なります。たとえば、Oracle Cloud Infrastructure環境でのユーザー名の形式は<tenancy-namespace>/<oci-username>です。
    • PASSWORD: リモートDockerレジストリにアクセスするためのパスワード。
    • EMAIL: Dockerレジストリの電子メールID。
    • NAMESPACE: MicroTxをデプロイするネームスペース。

    次のコマンドを使用して、otmmネームスペースにregcredという名前のKubernetesシークレットを作成します。

    kubectl create secret docker-registry regcred --docker-server=iad.ocir.io --docker-username=mytenancy/myuser --docker-password=pwd --docker-email=myuser@example.com --namespace=otmm
  2. 作成したシークレットの名前を書き留めます。この値は後で指定する必要があります。
  3. ターミナルを閉じます。
    コマンドラインにシークレットを入力すると、そのシークレットが保護されていないシェル履歴に格納されることがあります。kubectlの実行中にこのシークレットがPCの他のユーザーにも表示される可能性があります。この問題を解消するには、シークレットを作成した後にターミナルを閉じてください。

既存の資格証明に基づいてシークレットを作成することもできます。https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentialsを参照してください。

3.4.5 Istio用のSSL詳細を含むKubernetesシークレットの作成

HTTPSプロトコルを使用したIstioへのアクセスを有効にするには、SSLキーおよび証明書の詳細を含むKubernetesシークレットを作成する必要があります。MicroTxは、この情報によりHTTPSを使用してIstioにアクセスします。

開始する前に、IstioをKubernetesクラスタにインストールしていることを確認してください。「必要なソフトウェアのインストールおよび構成」を参照してください。
SSL証明書の詳細を含むKubernetesシークレットを作成するには:
  1. 使用するSSL証明書の場所を特定します。
  2. IstioをインストールしたKubernetesネームスペースにSSL証明書をインポートします。次のコマンドを実行して、SSL証明書の詳細を含むKubernetesシークレットを作成します。

    構文

    kubectl create secret tls tls-credential --key=ssl-key-file-path --cert=ssl-cert-file-path -n istio-system

    kubectl create secret tls tls-credential --key=~/certificates/example.dev.key --cert=~/certificates/example.dev.crt -n istio-system

    説明

    • tlsはシークレットのタイプです。
    • tls-credentialは、作成するKubernetesシークレットの名前です。
    • ssl-key-file-pathは、SSL証明書キー・ファイルの場所です。
    • ssl-cert-file-pathは、SSL証明書ファイルの場所です。
    • istio-systemは、Istioをインストールしたネームスペースです。デフォルトのネームスペースはistio-systemです。別のネームスペースにIstioをインストールした場合は、kubectl get nsコマンドを実行して、クラスタ内のすべてのネームスペースを確認します。
Kubernetesシークレットの名前は、MicroTxをインストールする際にvalues.yamlファイルにこの詳細を指定する必要があるため、この名前を書き留めます。

3.4.6 認証および認可

認証によって、権限のある個人のみがシステムおよびデータにアクセスできるようになります。認可によって、システム権限およびデータへのアクセス制御が提供されます。これは認証に基づいて、個人が適切なアクセス権を取得することを保証します。

3.4.6.1 暗号化キーのKubernetesシークレットの生成

非同期コールをサポートするために、MicroTxは認可トークンとリフレッシュ・トークンを格納します。トークンを格納するには、トークンを暗号化する必要があります。トークンを直接格納することはできないためです。トークンを暗号化するには、暗号化キーを作成します。

MicroTxは、指定した暗号化キーを使用してトークンを暗号化します。MicroTxから参加側サービスへの非同期コールがある場合、MicroTxは、暗号化されたトークンをフェッチして復号化してから、そのトークンを認可ヘッダーに添付します。
authorizationauthTokenPropagationEnabledプロパティを有効化した場合は、暗号化キーを生成し、そのキーをDockerシークレットに追加する必要があります。生成する暗号化キーには、次の属性が必要です。
  • 対称アルゴリズム: AES-256
  • 暗号モード: GCMモードのAES
  • キーの長さ: 32バイト
  • 初期化ベクトルの長さ: 96ビット

MicroTxは、アクセス・トークンおよびリフレッシュ・トークンを暗号化し、後で参加側サービスへのコール時に使用します。MicroTxは、トランザクションごとに初期化ベクトルの新しい値を生成します。各トランザクション・レコードには、キー・バージョンや初期化ベクトル値などの暗号化されたメタデータ情報が含まれます。

  1. 次のコマンドを実行して、キーの長さが32バイトの暗号化キーを生成します。
    openssl rand -hex 16
    生成された値を書き留めます。たとえば、e9f0adab17c0180425147166c2ff1cd3です。
  2. 生成した暗号化キーを値として使用して、Kubernetesシークレットを作成します。このシークレットは、MicroTxをインストールするネームスペースに作成する必要があります。

    次のサンプル・コマンドでは、encryption-secret-key1という名前のKubernetesシークレットがotmmネームスペースに作成されます。

    kubectl create secret generic encryption-secret-key1 \ --from-literal=secret='e9f0adab17c0180425147166c2ff1cd3' -n otmm
  3. Kubernetesシークレットの名前とそのバージョンを書き留めます。これらの値は、values.yamlファイルのsecretKeyNameフィールドおよびversionフィールドに指定します。

    次のコード・スニペットは、values.yamlファイルのencryptionフィールドのサンプル値を示しています。この例のサンプル値は、このトピックのサンプル・コマンドで使用された値に基づいています。

    encryption:
      encryptionSecretKeyVersion: "1"
      encryptionSecretKeys:
          - secretKeyName: "encryption-secret-key0"
            version: "0"
          - secretKeyName: " encryption-secret-key1"
            version: "1"

3.4.6.2 トランザクション・トークンのキー・ペアの作成

アプリケーションは、各MicroTxトランザクションに固有のMicroTx署名付きトランザクション・トークンを含めることをサポートしています。

transactionTokenEnabledをtrueに設定すると、MicroTxは、署名付きトランザクション・トークンであるtmm-tx-tokenという新しいトークンを作成します。トランザクション・イニシエータがリクエストを開始すると、MicroTxtmm-tx-tokenを使用して応答します。参加側サービスからMicroTxへのコールを保護するために、MicroTxライブラリはリクエスト・ヘッダーでtmm-tx-tokenを渡します。ユーザーがtmm-tx-tokenトランザクション・トークンを作成したり、リクエスト・ヘッダーで渡したりする必要はありません。MicroTxライブラリは、指定した秘密キーと公開キーのペアに基づいてこのトークンを作成します。

生成するトランザクション・トークンには、次の属性が必要です:
  • 非対称アルゴリズム: RSA 3072
  • キーの長さ: 3072ビット
  • ハッシュ・アルゴリズム: SHA256

開始する前に、OpenSSLをインストールしたことを確認します。

  1. 次のコマンドを使用して、キーの長さが3072ビットのRSA秘密キーを作成します:
    openssl genrsa -aes256 -out private.pem 3072
  2. コマンド・プロンプトでパスフレーズを入力し、[Enter]を押します。後で指定する必要があるため、パスフレーズを覚えておいてください。

    private.pemという名前の新しいファイルが現在の作業フォルダに作成されます。このファイルにRSA秘密キーの値が含まれています。

  3. 生成した秘密キーに対するRSA公開キーを作成します。以下のコマンドを使用します。

    次のコマンドによって、現在の作業フォルダにpublic.pemという名前の新しいファイルが作成されます。このファイルにRSA公開キーの値が含まれています。

    openssl rsa -in private.pem -outform PEM -pubout -out public.pem
  4. 次のコマンドを実行して、private.pemファイルをbase64でエンコードします。

    コマンド例

    base64 private.pem

    private.pemファイルのbase64エンコード値が返されます。

    レスポンス例

    LS0tLS...LS0tLQo=

    レスポンス例は、読みやすくするために省略記号(...)を使用して一部を省いています。

    private.pemファイルのbase64エンコード値を書き留めます。

  5. private.pemファイルのbase64エンコード値を含むKubernetesシークレットを作成します。

    次のコマンドは、MicroTxをインストールするotmmネームスペースにTMMPRIVKEY1という名前のKubernetesシークレットを作成します。

    kubectl create secret generic TMMPRIVKEY1 \ --from-literal=secret='LS0tLS...LS0tLQo=' -n otmm

    Kubernetesシークレットの名前を書き留めます。この値は、後でvalues.yamlファイルに指定する必要があります。

  6. 次のコマンドを実行して、public.pemファイルをbase64でエンコードします。

    コマンド例

    base64 public.pem

    public.pemファイルのbase64エンコード値が返されます。

    レスポンス例

    LS0tLS...LS0tCg==

    レスポンス例は、読みやすくするために省略記号(...)を使用して一部を省いています。

    public.pemファイルのbase64エンコード値を書き留めます。

  7. public.pemファイルのbase64エンコード値を含むKubernetesシークレットを作成します。

    次のコマンドは、otmmネームスペースにTMMPUBKEY1という名前のKubernetesシークレットを作成します。

    kubectl create secret generic TMMPUBKEY1 \ --from-literal=secret='LS0tLS...LS0tCg==' -n otmm

    Kubernetesシークレットの名前を書き留めます。この値は、後でvalues.yamlファイルに指定する必要があります。

  8. ステップ2で指定した秘密キーのパスフレーズを値として含むKubernetesシークレットを作成します。

    次のコマンドは、otmmネームスペースにTMMPRIVKEYPASSWD1という名前と<pph...>というキー・パスフレーズでKubernetesシークレットを作成します。

    kubectl create secret generic TMMPRIVKEYPASSWD1 \ --from-literal=secret='<pph...>' -n otmm

    ここで、<pph...>は秘密キーのパスフレーズです。これを環境に固有の値に置き換えます。

    ノート:

    キー・パスフレーズはプレーンテキスト形式で入力する必要があるため、キー・パスフレーズをbase64でエンコードしないでください。

    Kubernetesシークレットの名前を書き留めます。この値は、後でvalues.yamlファイルに指定する必要があります。