Hitachi

Hitachi Microservices Platform - Paxos Commit Transaction Orchestrator ユーザーズガイド


2.6.4 SQL-ParticipantのKubernetesマニフェストの作成(SQL-Participant限定)

7.5.3 SQL-Participantの要件」に記載されている要件を満たすように、ParticipantをデプロイするためのKubernetesマニフェストを作成してください。

Kubernetesマニフェストは、通常版とトライアル版で差異があります。トライアル版のKubernetesマニフェストを基に通常版のKubernetesマニフェストを作成する場合は、通常版の記述例に従って修正してください。

Kubernetesマニフェストの記述例を次に示します。

apiVersion: apps/v1     …1
kind: Deployment
metadata:
  name: sql-participant
  namespace: my-namespace
spec:
  replicas: 1     …24
  selector:
    matchLabels:
      app.kubernetes.io/name: sql-participant
  template:
    metadata:
      labels:
        app.kubernetes.io/name: sql-participant
    spec:
      serviceAccount: sql-participant-service-account     …10
      initContainers:
      - name: dependency-checker     …2
        image: myregistry.example.com/myproject/dependency-checker:V.R.S1
        args:
        - "30"
        - "10"
        - "10"
        - "10"
        - my-namespace/statefulsets/mediator
        - my-namespace/statefulsets/eads-server※2
        - my-namespace/statefulsets/postgresql
      containers:
      - name: sql-participant     …3
        image: myregistry.example.com/myproject/sql-participant:V.R.S1
        resources:     …21
          limits:
            cpu: 2
            memory: 1Gi
          requests:
            cpu: 1
            memory: 512Mi
        ports:
        - name: http     …13
          containerPort: 8080
          protocol: TCP
        - name: ucars-sql
          containerPort: 28081 …20
          protocol: TCP
        env:
        - name: TZ     …12
          value: Asia/Tokyo
        - name: HMPPCTO_JAVA_OPTIONS     …17
          value: -XX:+UseG1GC
        volumeMounts:
        - name: sql-participant-config
          mountPath: /deployments/config
        - name: sql-participant-ucars-config  …18
          mountPath: /opt/hitachi/ucars/conf
        - name: snapshot-volume  …19
          mountPath: /ucars-snapshots
        - name: eads-config     …11
          mountPath: /eads-properties
        - name: tomcat     …15
          mountPath: /deployments/tomcat
        - name: eads
          mountPath: /deployments/eads-log   …16
        livenessProbe:
          exec:     …6
            command:
            - /deployments/health_check.sh
            - "0"
            - "0"
            - "10"
            - "10"
            - "8080"
          initialDelaySeconds: 180
          periodSeconds: 30
          failureThreshold: 3
          timeoutSeconds: 10
        readinessProbe:     …26
            tcpSocket:
              port: 8080
            initialDelaySeconds: 30
            timeoutSeconds: 60
        lifecycle:
          postStart:     …7
            exec:
              command:
              - /deployments/health_check.sh
              - "30"
              - "10"
              - "10"
              - "10"
              - "8080"
          preStop:     …8
            exec:
              command:
              - /deployments/wait_transactions.sh
              - "10"
              - "10"
              - "10"
              - "10"
              - "8080"
      - name: filebeat-sidecar     …14
        image: myregistry.example.com/myproject/filebeat:V.R.S1
        resources:     …25
          limits:
            cpu: 1000m
            memory: 2Gi
          requests:
            cpu: 1000m
            memory: 2Gi
        args:
        - "-e"
        - "-E"
        - "http.enabled=true"
        env:     …24
        - name: HMPPCTO_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: HMPPCTO_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: HMPPCTO_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        livenessProbe:
          exec:
            command:
              - sh
              - -c
              - |
                #!/usr/bin/env bash -e
                curl --fail 127.0.0.1:5066
          initialDelaySeconds: 10
          periodSeconds: 10
          failureThreshold: 3
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
              - sh
              - -c
              - |
                #!/usr/bin/env bash -e
                filebeat test output
          initialDelaySeconds: 10
          periodSeconds: 10
          failureThreshold: 3
          timeoutSeconds: 5
        securityContext:
          runAsUser: 0
        volumeMounts:
          - name: beatconfig
            mountPath: /usr/share/filebeat/filebeat.yml
            readOnly: true
            subPath: filebeat.yml
          - name: tomcat
            mountPath: /deployments/tomcat
          - name: eads
            mountPath: /deployments/eads-log
      terminationGracePeriodSeconds: 180     …9
      volumes:
      - name: snapshot-volume
        persistentVolumeClaim:
          claimName: snapshot-volume
      - name: sql-participant-config
        configMap:
          name: sql-participant-config     …5
          items:
          - key: application.properties
            path: application.properties
      - name: sql-participant-ucars-config …18
        configMap:
          name: sql-participant-ucars-config
          items:
            - key: config.properties
              path: config.properties
      - name: eads-config     …11
        configMap:
          name: eads-config
          items:
          - key: hmp-pcto.eads-client.properties
            path: hmp-pcto.eads-client.properties
      - name: beatconfig     …14
        configMap:
          name: sql-p-filebeat-sidecar-config
      - name: tomcat     …15
      - name: eads     …16
---
apiVersion: v1
kind: Service
metadata:
  name: sp
  namespace: my-namespace
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/name: sql-participant
  ports:
  - name: http     …13
    protocol: TCP
    port: 8080
    targetPort: http
  - name: ucars-sql
    protocol: TCP
    port: 28081 …20
    targetPort: ucars-sql
---
apiVersion: v1     …5
kind: ConfigMap
metadata:
  name: sql-participant-config
  namespace: my-namespace
data:
  application.properties: |
    server.port=8080
    server.tomcat.accesslog.enabled=true
    server.tomcat.basedir=tomcat
    server.shutdown=graceful
    spring.lifecycle.timeout-per-shutdown-phase=20s
    jp.co.Hitachi.soft.hmppcto.client.proposer.type=SQL
    spring.datasource.type=jp.co.Hitachi.soft.hmppcto.jdbc.client.PctoDataSource
    spring.datasource.driver-class-name=jp.co.Hitachi.soft.hmppcto.jdbc.client.PctoDriver
    spring.datasource.url=pctodriver
    spring.datasource.username=dummy
    spring.datasource.password=dummy
    spring.sql.init.mode=never
    jp.co.Hitachi.soft.hmppcto.sql.pod.service-name=sp.my-namespace
    jp.co.Hitachi.soft.hmppcto.sql.xa-server-name=sql-participant
    jp.co.Hitachi.soft.hmppcto.sql.jdbc.driver.path=/deployments/postgresql-42.2.22.jar
    jp.co.Hitachi.soft.hmppcto.sql.datasource.class-name=org.postgresql.xa.PGXADataSource
    jp.co.Hitachi.soft.hmppcto.sql.datasource.property.values=serverName=postgresql;portNumber=5432;databaseName=appuser1;user=appuser1;password=appuser1
    jp.co.Hitachi.soft.hmppcto.sql.pool.max-pool-size=10
    jp.co.Hitachi.soft.hmppcto.mediator.name=mediator
    jp.co.Hitachi.soft.hmppcto.mediator.name-suffix=.mediator.my-namespace.svc.cluster.local
    jp.co.Hitachi.soft.hmppcto.mediator.port=20551
    jp.co.Hitachi.soft.hmppcto.sql.db-type=PostgreSQL     …23
    jp.co.Hitachi.soft.hmppcto.tracing.url=http://jaeger-collector:14268/api/traces
    jp.co.Hitachi.soft.hmppcto.use-scaling=false
---
apiVersion: v1 …18
kind: ConfigMap
metadata:
  name: sql-participant-ucars-config
  namespace: my-namespace
data:
  config.properties: |
    monitor.rest.bindaddress=0.0.0.0
    monitor.rest.port=28081 …20
    snapshot.log.filepath=/ucars-snapshots/${HOSTNAME}/snapshot
    monitor.jvm.options=-Dfile.encoding=UTF-8
    healthcheck.startdelay.timeout=90000
    healthcheck.startdelay.actions.failure.retrymax=4
---
apiVersion: v1     …11
kind: ConfigMap
metadata:
  name: eads-config
  namespace: my-namespace
data:
  hmp-pcto.eads-client.properties: |
    eads.client.connect.servers=sv1,sv2,sv3
    eads.client.sv1.address=eads-service-eads-service-0.my-namespace
    eads.client.sv1.port=24600
    eads.client.sv2.address=eads-service-eads-service-1.my-namespace
    eads.client.sv2.port=24600
    eads.client.sv3.address=eads-service-eads-service-2.my-namespace
    eads.client.sv3.port=24600
    eads.client.logger.dir=eads-log
    eads.client.connectionPool.poolsize=1
---
apiVersion: v1     …10
kind: ServiceAccount
metadata:
  name: sql-participant-service-account
  namespace: my-namespace
---
apiVersion: v1     …14
kind: ConfigMap
metadata:
  name: sql-p-filebeat-sidecar-config
  namespace: my-namespace
data:
  filebeat.yml: |
    filebeat.inputs:
      - type: filestream
        id: "eads"
        paths:
          - '/deployments/eads-log/eads_client_message*.log'
          - '/deployments/eads-log/maintenance/eads_client_maintenance*.log'
      - type: filestream
        id: "tomcat"
        paths:
          - '/deployments/tomcat/logs/access_log.*.log'
    processors:     …22
      - add_fields:
          target: kubernetes
          fields:
            namespace: ${HMPPCTO_POD_NAMESPACE}
            pod:
              name: ${HMPPCTO_POD_NAME}
            node:
              name: ${HMPPCTO_NODE_NAME}
    output.logstash:
      hosts: ["logstash.my-namespace.svc.cluster.local:5044"]
注※1

V.R.Sは使用するHMP-PCTOとFilebeatのバージョンに合わせて読み替えてください。

注※2

通常版の場合はmy-namespace/statefulsets/eads-serverを記載してください。トライアル版の場合はmy-namespace/deployments/ext-consを記載してください。

記述例の番号は、説明の番号と対応しています。

<説明>

この例では、各KubernetesオブジェクトのNamespace名(.metadata.namespaceフィールド)は、「my-namespace」としています。

  1. ワークロードリソースを定義します。この例では、ワークロードリソースを「Deployment」としています。

  2. 初期化コンテナ構成にDependency-Checkerコンテナを定義します。「3.4.5 Dependency-Checkerコンテナイメージの作成(通常版限定)」で作成したコンテナイメージを指定します。

  3. コンテナ構成にSQL-Participantコンテナを定義します。「2.3.7 SQL-Participantコンテナイメージの作成(SQL-Participant限定)」で作成したコンテナイメージを指定します。

  4. 欠番

  5. SQL-Participantのパラメタを、Spring Bootのコンフィグソースに設定するように定義します。この例では、必須パラメタだけ指定しています。

  6. コンテナライフサイクル設定のLiveness Probeを定義します。

  7. コンテナライフサイクル設定のpostStartフックを定義します。

  8. コンテナライフサイクル設定のpreStopフックを定義します。

  9. Podライフサイクル設定のterminationGracePeriodSecondsを定義します。

  10. Podに対するロールベースアクセス制御(RBAC)に使用するServiceAccountを定義します。

  11. EADSクライアント定義のパラメタを、EADSクライアント定義ファイルのコンフィグソースに設定するように定義します。この例では、必須パラメタだけ指定しています。EADSクライアント定義ファイルのディレクトリおよび名称は「9.2.4 SQL-Participant」のパラメタjp.co.Hitachi.soft.hmppcto.external-consensus.eads.propertiesに指定した値と合わせる必要があります。

    トライアル版の場合、この定義は必要ありません。

  12. SQL-Participantコンテナのタイムゾーンを設定します。設定するタイムゾーンはユーザ任意です。この例では、タイムゾーンを日本標準時(Asia/Tokyo、UTC+09:00)としています。

  13. ユーザ責務のKubernetes アプリケーション(およびPrometheus向け)で使用する各種ポート番号をKubernetesクラスタ内で公開するように定義します。この例では、アプリケーションが使用するポートをTCPプロトコルの8080ポートとしています。

  14. このオレンジ色の背景で示す行は、Elastic Stack、JaegerおよびPrometheusを使用してトラブルシュート情報を収集する場合だけ記述します。

    FilebeatのSidecarコンテナを定義します。 /usr/share/filebeat/filebeat.yml にFilebeatの設定ファイルをマウントします。この設定によってEADSからのログをFilebeatが取得します。なお、output.logstashフィールドのNamespace名にはLogstashアプリケーションをデプロイするNamespaceを指定します。

  15. Tomcatのベースディレクトリとして /deployments/tomcat をマウントします。

  16. EADSのログ出力ディレクトリとして/deployments/eads-logをマウントします。

  17. SQL-ParticipantのJavaプロセス起動時にJava VMに渡すオプションを設定します。設定するオプションはユーザ任意です(ただし、「-XX:+UseG1GC」オプションは必ず含めてください)。この例では、オプションを「-XX:+UseG1GC」だけとしています。

  18. このオレンジ色の背景で示す行は、通常版(uCosminexus Application Runtime with Java for Spring Boot導入あり)の場合だけ記述します。

    uCosminexus Application Runtime with Java for Spring Bootの設定ファイル(config.properties)をSQL-Participantコンテナ内にマウントします。この例では、次のパラメタを設定しています。

    • monitor.rest.bindaddress=0.0.0.0

      プロセスモニタのHTTP機能に割り当てるIPアドレスを定義します。コンテナ外部から通信を受け付けることができるようにするために、設定を行います。

    • monitor.rest.port=28081

      プロセスモニタのHTTP機能の受付ポート番号を定義します。

    • snapshot.log.filepath=/ucars-snapshots/${HOSTNAME}/snapshot

      異常検知時のスナップショットログ出力先を、永続ボリュームにマウントするパスに変更します。親ディレクトリ名に「${HOSTNAME}」を採用してコンテナごとに異なるディレクトリに出力されるようにすることで、同時刻に複数のコンテナから同じファイル名で出力することを防止できます。

      スナップショットログの収集対象を追加したい場合は、「11.6.2 情報の収集方法」を参照して設定してください。

    • monitor.jvm.options=-Dfile.encoding=UTF-8

      プロセスモニタのエンコーディングにUTF-8を設定します。

    • healthcheck.startdelay.timeout=90000

      モニタ対象プロセス(SQL-Participant)開始完了通知待ちタイムアウト時間を定義します。SQL-Participantの起動時に、設定した時間が経過するとsnapshot.log.filepathで指定した先にスナップショットを出力します。モニタ対象プロセス開始完了通知待ちタイムアウト時間の詳細は、マニュアル「uCosminexus Application Runtime for Spring Bootユーザーズガイド」を参照してください。

    • healthcheck.startdelay.actions.failure.retrymax=4

      モニタ対象プロセス(SQL-Participant)開始完了通知待ちタイムアウトが発生した場合に、モニタ対象プロセス開始完了待ちをリトライする最大回数を定義します。最大リトライ回数を超えると、デフォルトの設定ではモニタ対象プロセスを停止します。モニタ対象プロセス開始完了待ちリトライ回数の詳細は、マニュアル「uCosminexus Application Runtime for Spring Bootユーザーズガイド」を参照してください。

      モニタ対象プロセス開始完了通知待ちタイムアウトの合計時間(下記のA)とSQL-Participantの開始に掛かる時間(下記のB、およびC)の関係を、「A>B>C」にしてください。

      A:モニタ対象プロセス開始完了通知待ちタイムアウトの合計時間

      healthcheck.startdelay.timeoutに指定した値×(healthcheck.startdelay.actions.failure.retrymaxに指定した値+1)

      B:postStartフックに指定するトランザクションヘルスチェックスクリプト(health_check.sh)の合計時間

      リトライ回数×リトライ間隔秒数

      C:コネクションプールの初期化で、DBとのコネクションの取得に失敗した場合に行うリトライの合計時間

      sql.pool.connection-retry-interval-in-secondsに指定した値×sql.pool.connection-retry-limitに指定した値

      AをBよりも大きな値にするのは、モニタ対象プロセス開始完了通知待ちタイムアウトによるプロセス停止が、postStartフックに指定するトランザクションヘルスチェックスクリプトによるSQL-Participantの開始完了待ちを中止することを防ぐためです。

      BをCよりも大きな値とするのは、postStartフックに指定するトランザクションヘルスチェックスクリプトのタイムアウトによるSQL-Participantの停止が、SQL-Participantのコネクション接続処理を中止することを防ぐためです。

      この記述例では、SQL-Participantの開始に掛かる時間(300秒)の間に、スナップショットを複数回(3回)出力するように設定しています。

  19. このオレンジ色の背景で示す行は、通常版(uCosminexus Application Runtime with Java for Spring Boot導入あり)の場合だけ記述します。

    uCosminexus Application Runtime with Java for Spring Bootスナップショットログの永続ボリュームをSQL-Participantコンテナ内にマウントします。.spec.template.spec.volumes[].persistentVolumeClaim.claimNameフィールドには、「2.6.8 uCosminexus Application Runtime with Java for Spring Bootスナップショットログの永続ボリュームおよび永続ボリューム要求のKubernetesマニフェストの作成(通常版限定)」で作成するuCosminexus Application Runtime with Java for Spring BootスナップショットログのPersistentVolumeClaimリソースの名称(.metadata.nameフィールドに指定した値)を設定してください。この例では、PersistentVolumeClaimリソースの名称を「snapshot-volume」としています。

  20. このオレンジ色の背景で示す行は、通常版(uCosminexus Application Runtime with Java for Spring Boot導入あり)の場合だけ記述します。

    uCosminexus Application Runtime with Java for Spring Bootのスナップショットログの手動取得のため、HTTP機能として公開する受付ポート番号を定義します。

  21. SQL-Participantコンテナのリソースを設定します。実稼働を通して、環境に合わせた設定を実施してください。

    オートスケール機能のメトリクスの監視にMetrics Serverを使用する場合は必ず指定してください。

  22. Kibanaなどの可視化ツールで検索する際、条件として使用するフィールドを付与するために環境変数を設定します。また、環境変数を使用してフィールドを付与する設定をConfigMapに記載します。

  23. SQL-Participantが接続するRDBMSを指定します。PostgreSQLを指定する場合、「9.4.1 PostgreSQL(SQL-Participant限定)」のパラメタも確認してください。

  24. replicasを設定します。オートスケール機能を使用する場合は設定しないでください。

  25. Filebeatコンテナのリソースを設定します。実稼働を通して、環境に合わせた設定を実施してください。

    オートスケール機能のメトリクスの監視にMetrics Serverを使用する場合は必ず指定してください。

  26. readinessProbeを設定します。

    Pod起動時にTCPポートが公開されるまで待機するために設定します。オートスケールを使用している場合は、必ず指定してください。

    tcpSocket.portには、13.で指定したHTTP機能として公開する受付ポート番号と同じ値を設定してください。

    Pod起動時に初期化処理が実行されるため、initialDelaySeconds(初回Probe実行までの待機秒数)を設定してください。推奨値は30秒です。推奨値を設定後、起動直後(スケールアウトなど)のSQL-ParticipantへのHTTP通信時、Connection Refusedが発生していないか検証し、発生している場合はinitialDelaySecondsの設定値をより大きい値に設定してください。

    timeoutSecondsにReadiness Probeのタイムアウト秒数を設定してください。initialDelaySecondsの設定秒数より大きい値を設定してください。推奨値はinitialDelaySecondsの推奨値にバッファを加えた60秒です。

重要

Kubernetesマニフェスト作成時の注意事項

  • Kubernetesマニフェストは、行頭のインデント(文字の開始位置)が厳密に評価されます。注意して作成してください。

  • SQL-Participantを構成するPodを定義したKubernetesのServiceのService名とNamespace名の長さの合計は、40バイト以下としてください。