このトピックでは、DTP を Docker およびクラウド環境にデプロイするための情報を提供します。このセクションの内容:
アーキテクチャの検討事項
DTP は次のパーツから構成されています。
- DTP に送信される解析、カバレッジ、テスト実行、その他のデータを保存するデータベース
- DTP の動作を決定する設定ファイル、拡張機能、その他の動的コンポーネントがある DTP データ ディレクトリ (<DTP_DATA>)
- Report Center、Data Collector などのコア アプリケーションを含む DTP アプリケーション ディレクトリ (<DTP_INSTALL>)
従来型の環境にデプロイする場合も、コンテナー化された環境にデプロイする場合も、データベースは DTP とは別のサーバーまたはマシンにインストールされ、別個のセキュリティまたは高可用性措置によってカバーされるのが通常です。
いっぽう、DTP のデータ ディレクトリは、必要に応じてコンテナーにマウントできるよう、イメージの外部にデータを永続化できる場所にインストールするべきです。そうすると、新しく DTP のインスタンスをデプロイしなければならない問題が発生したとき、新しい DTP アプリケーション ディレクトリのイメージにすばやくデータ ディレクトリを接続できます。コンテナー化されたデプロイメントのクローンは、それぞれ別のマシン ID を持つので、別個のライセンスが必要です。
Windows では、データ ディレクトリは常に %ProgramData%\Parasoft\DTP になります。Linux インストーラーでは、データ ディレクトリの場所を指定するプロンプトが表示されます。どちらの場合も、ディレクトリを古いインスタンスから切り離し、新しいインスタンスに接続できるようにする必要があります。永続ストレージ ディレクトリをコンテナーまたはクラウドにデプロイされた VM にマウントする方法については、環境ベンダーのドキュメントを参照してください。
要件
コンテナー イメージは、「要件」セクションで指定されているのと同じ要件を満たす必要があります。DTP の要件を満たすようイメージまたは VM を設定する方法については、Docker またはクラウド環境ベンダーのドキュメントを参照してください。
デプロイメント プロセス
DTP をコンテナー化されたシステムにインストールするのと、静的なシステムにインストールするのでは違いがあります。インストール手順については「DTP の新規インストール」セクションを参照してください。サーバー インスタンスの設定については、クラウド環境ベンダーのドキュメントを参照してください。
クラウド環境へのコンテナーのプッシュ
コンテナー化された DTP のインスタンスを Amazon AWS や Microsoft Azure などの動的基盤にデプロイできます。すると、自前のホスト環境のメンテナンスに関わる管理負荷を軽減できます。さらに詳しい内容については、ご使用のクラウド環境のドキュメントを参照してください。
Docker での DTP のデプロイ
Parasoft は、公式の Docker イメージを Docker Hub に公開しています。各イメージの Readme に完全なインストール手順が含まれています。Extension Designer があるバージョンとないバージョンの 2 種類が利用可能です。以下のリンクから、ニーズに合うバージョンを選択してください。
- DTP (Extension Designer あり): https://hub.docker.com/r/parasoft/dtp-extension-designer
- DTP (Extension Designer なし): https://hub.docker.com/r/parasoft/dtp
Kubernetes での DTP のデプロイ
Kubernetes を Docker でデプロイするには、以下の手順で行います。
このバージョンでは、Kubernetes に複数の DTP サーバーをデプロイすることはサポートされていません。サポートは、単一ノードの Kubernetes クラスターで動作する DTP の単一インスタンスに限定されます。
要件
まず、Kubernetes クラスターが必要です。クラスターを起動したら、DTP の Pod と関連リソースが必要とする名前空間、サービス アカウント、および権限を作成します。このために使用する yaml ファイルの例を以下に示します。
apiVersion: v1 kind: Namespace metadata: name: parasoft-namespace --- # Stable access for clients to license server kind: Service apiVersion: v1 metadata: name: parasoft-service namespace: parasoft-namespace spec: selector: tag: parasoft-service ports: - name: https port: 443 protocol: TCP --- apiVersion: v1 kind: ServiceAccount metadata: name: parasoft-account namespace: parasoft-namespace --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: parasoft-namespace-role namespace: parasoft-namespace rules: - apiGroups: - "*" resources: - "*" verbs: - "*" --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: parasoft-namespace-bind namespace: parasoft-namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: parasoft-namespace-role subjects: - kind: ServiceAccount name: parasoft-account namespace: parasoft-namespace
DTP 環境を構築する前に、yaml ファイルを使用して、必要とされる名前空間、サービス アカウント、および権限を作成します。
kubectl create -f parasoft-permissions.yaml
コンソールに以下のような出力が表示されるはずです。
namespace/parasoft-namespace created service/parasoft-service created serviceaccount/parasoft-account created role.rbac.authorization.k8s.io/parasoft-namespace-role created rolebinding.rbac.authorization.k8s.io/parasoft-namespace-bind created
提供された設定に定義されている parasoft-namespace 名前空間は必須であり、parasoft-permissions.yaml を文書化されているとおりに使用することを推奨します。DTP Pod が使用するサービス アカウントは parasoft-namespace 名前空間へのアクセスを必要とします。そのため、提供された権限設定で定義されたリソースに対して異なる名前を持つカスタムの権限設定を作成する場合は、parasoft-namespace という名前の名前空間も作成する必要があります。この名前空間の要件が満たされていない場合、DTP はインストールされているライセンスを無効として扱います。
カスタム キーストア
カスタム キーストアを設定する場合、.keystore および server.xml ファイルの構成マップを作成する必要があります。以下のコマンドは、カスタムの .keystore および server.xml ファイルのファイル マッピングを含む keystore-cfgmap という構成マップを作成します。この例では、各ファイル マッピングにキーが与えられています。.keystore ファイルに keystore、server.xml ファイルに server-config です。各ファイル マッピングにキーを指定する必要はありませんが、キーをファイル名にしたくない場合に便利です。
~$ kubectl create configmap keystore-cfgmap --from-file=keystore=/path/to/.keystore --from-file=server-config=/path/to/server.xml configmap/keystore-cfgmap created
DTP をセットアップする
DTP をセットアップするには、Secret (オプション)、ボリューム、Pod、内部アクセス サービス、外部アクセス サービス (オプション) を定義した yaml ファイルを作成します。Secret は、リポジトリから DTP イメージを取得するために使用されます。Pod は、DTP サーバーと Data Collector を別々のコンテナーで実行するように設定されています。各コンテナーには、データを永続化するためのボリュームと、Kubernetes の Docker Healthcheck に相当する Liveness Probe が設定されます。内部アクセス サービスは、DTP の Pod を他の Pod に公開し、明示的な IP アドレスの代わりにサービス名を介して通信できるようにします。外部アクセス サービスは、ノードでポートを割り当て、Pod 内のポートにマッピングすることで、外部クライアントから DTP と Data Collector にアクセスできるようにします。このために使用する yaml ファイルの例を以下に示します。この例では、NFS ボリュームが使用されていますが、これは必須ではありません。
apiVersion: v1 kind: Pod metadata: name: dtp namespace: parasoft-namespace labels: app: DTP spec: volumes: - name: dtp-data nfs: server: NFS_SERVER_HOST path: /dtp/ # Uncomment section below if you are setting up a custom keystore; you will also need to uncomment out the associated volumeMounts below # - name: keystore-cfgmap-volume # configMap: # name: keystore-cfgmap containers: - name: dtp-server image: DTP_DOCKER_IMAGE # To inject JVM arguments into the container, specify the "env" property as in the example below, which injects JAVA_CONFIG_ARGS # env: # - name: JAVA_CONFIG_ARGS # value: "-Dparasoft.use.license.v2=true" args: ["--run", "dtp"] imagePullPolicy: Always ports: - name: "http-server" containerPort: 8080 - name: "https-server" containerPort: 8443 volumeMounts: - mountPath: "/usr/local/parasoft/data" name: dtp-data # Uncomment section below if you are setting up a custom keystore. Note that updates made to these files will not be reflected inside the container once it's been deployed; you will need to restart the container for it to contain any updates. # - name: keystore-cfgmap-volume # mountPath: "/usr/local/parasoft/dtp/tomcat/conf/.keystore" # subPath: keystore # - name: keystore-cfgmap-volume # mountPath: "/usr/local/parasoft/dtp/tomcat/conf/server.xml" # subPath: server-config # To prevent liveness probe failures on environments with low or overly taxed RAM/CPU, we recommend increasing the timeout seconds livenessProbe: exec: command: - healthcheck.sh - --verify - dtp initialDelaySeconds: 120 periodSeconds: 60 timeoutSeconds: 30 failureThreshold: 5 - name: data-collector image: DTP_DOCKER_IMAGE # To inject JVM arguments into the container, specify the "env" property as in the example below, which injects JAVA_DC_CONFIG_ARGS # env: # - name: JAVA_DC_CONFIG_ARGS # value: "-Dcom.parasoft.sdm.dc.traffic.max.length=250000 -Dcom.parasoft.sdm.dc.build.details.to.keep=5" args: ["--run", "datacollector", "--no-copy-data"] imagePullPolicy: Always ports: - containerPort: 8082 volumeMounts: - mountPath: "/usr/local/parasoft/data" name: dtp-data # To prevent liveness probe failures on environments with low or overly taxed RAM/CPU, we recommend increasing the timeout seconds livenessProbe: exec: command: - healthcheck.sh - --verify - datacollector initialDelaySeconds: 120 periodSeconds: 60 timeoutSeconds: 30 failureThreshold: 5 # Uncomment section below if using DTP with Extension Designer # - name: extension-designer # image: DTP_DOCKER_IMAGE # args: ["--run", "dtpservices"] # imagePullPolicy: Always # ports: # - containerPort: 8314 # volumeMounts: # - mountPath: "/usr/local/parasoft/data" # name: dtp-data # To prevent liveness probe failures on environments with low or overly taxed RAM/CPU, we recommend increasing the timeout seconds # livenessProbe: # exec: # command: # - healthcheck.sh # - --verify # - dtpservices # initialDelaySeconds: 120 # periodSeconds: 60 # timeoutSeconds: 30 # failureThreshold: 5 # Uncomment section below if using Extension Designer with an external MongoDB # env: # - name: DEP_USE_REMOTE_DB # value: "true" # - name: DEP_DB_HOSTNAME # value: "mongodb-hostname" # Put your mongodb hostname here # - name: DEP_DB_PORT # value: "27017" restartPolicy: Always serviceAccountName: parasoft-account imagePullSecrets: - name: YOUR_SECRET --- apiVersion: v1 kind: Service metadata: name: dtp namespace: parasoft-namespace spec: selector: app: DTP ports: - name: "http-server" protocol: TCP port: 8080 targetPort: 8080 - name: "data-collector" protocol: TCP port: 8082 targetPort: 8082 - name: "https-server" protocol: TCP port: 8443 targetPort: 8443 # Uncomment section below if using DTP with Extension Designer # - name: "extension-designer" # protocol: TCP # port: 8314 # targetPort: 8314 --- apiVersion: v1 kind: Service metadata: name: dtp-external namespace: parasoft-namespace spec: type: NodePort selector: app: DTP ports: - port: 8080 name: HTTP_PORT_NAME nodePort: XXXXX - port: 8082 name: DC_PORT_NAME nodePort: XXXXX - port: 8443 name: HTTPS_PORT_NAME nodePort: XXXXX # Uncomment section below if using DTP with Extension Designer # - port: 8314 # name: EXTENSION_DESIGNER_PORT_NAME # nodePort: XXXXX # SERVICE CONFIG NOTES: # 'name' can be whatever you want # 'nodePort' must be between 30000-32768 # 'spec.selector' must match 'metadata.labels' in pod config
DTP 環境を作成する
クラスタ上のボリューム マウントの場所を用意します。デフォルトでは、イメージは UID が 1000、GID が 1000 の "parasoft" ユーザーとして実行されます。このユーザーが読み取りと書き込みのアクセス権を持つように、ボリュームを準備します。
次に、前回作成した DTP セットアップの yaml ファイルで定義されている DTP 環境を作成します。
kubectl create -f parasoft-dtp.yaml
これにより、永続ボリュームの内容が初期化されますが、DTP と Data Collector のコンテナを正しく動作させるためには、さらにセットアップが必要です。
JVM 引数をコンテナーに挿入し、そのステータスを確認したい場合は、次のコマンドを実行します。
kubectl exec <POD_NAME> -c <CONTAINER_NAME> -- printenv
データベースに接続するように DTP を設定する
DTP データ ディレクトリにマウントされている永続ボリュームに、該当する JDBC ドライバーをダウンロードしてインストールします。
DTP_DATA_DIR/lib/thirdparty/
DTP データベースを初期化します。同じクラスターに存在する MySQL データベースの場合:
kubectl exec dtp -c dtp-server -- cat dtp/grs/db/dtp/mysql/create.sql | kubectl exec -i <mysql pod name> -- mysql -u<username> -p<password>
PSTRootConfig.xml ファイルの <dtp-db-connection> セクションで、データベースの URL を設定します。このファイルは、DTP データ ディレクトリにマウントされている永続ボリュームにあります。
DTP_DATA_DIR/conf/PSTRootConfig.xml
DTP 環境を再作成する
この時点で、DTP 環境は完全に構成されています。変更を有効にするには、コンテナを再起動する必要があります。これを行うには、単に環境を破棄します。
kubectl delete -f parasoft-dtp.yaml
次に、「DTP 環境を作成する」と同じコマンドを使用して環境を再作成します。
DTP と Extension Designer を併用する場合、初期設定を完了した後、Extension Designer のリバース プロキシ設定を更新し、DTP と Extension Designer にアクセスするための期待されるホスト名と公開ポートを反映する必要があります。
カスタム トラストストア
Kubernetes 環境でのカスタム トラストストアの使用は、上記のカスタム キーストアの使用と同様です。カスタム キーストアの使用手順を適宜読み換えてください。なお、トラスト ストアの場所は /usr/local/parasoft/dtp/jre/lib/security/cacerts
です。