このセクションの内容:

Helm チャートを使用した Kubernetes での License Server のデプロイ

Docker Hub で Parasoft 公式の Helm チャートが提供されています。完全なインストール手順は README に含まれています。Https://hub.docker.com/r/parasoft/lss-helm を参照してください。

手動による Kubernetes での Licenser Server のデプロイ

要件

まず、License Server を実行するための名前空間を作成します。例:

kubectl create namespace parasoft-lss-namespace

注意: 名前空間名 parasoft-lss-namespace は、このドキュメント全体のコマンドおよびリソースの例で使用されています。名前空間に別の名前を使用している場合は、parasoft-lss-namespace をすべて実際の名前空間名に変更してください。

License Server のライセンスが取得されると、たとえ同じ名前空間を再作成した場合でも、名前空間を削除するとマシンロック ライセンスが無効になります。

次に、Kubernetes クラスターが必要です。クラスターを開始したら、Licenser Server ポッドおよび関連リソースが必要とするサービス アカウントとパーミッションを作成します。

parasoft-permissions.yaml
# Stable access for clients to license server
apiVersion: v1
kind: ServiceAccount
metadata:
  name: parasoft-account
  namespace: parasoft-lss-namespace
automountServiceAccountToken: true
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: parasoft-read
  namespace: parasoft-lss-namespace
rules:
- apiGroups:
  - ""
  resources:
  - "namespaces"
  - "pods"
  verbs:
  - get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: parasoft-read-bind
  namespace: parasoft-lss-namespace
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: parasoft-read
subjects:
- kind: ServiceAccount
  name: parasoft-account
  namespace: parasoft-lss-namespac

Licenser Server 環境を作成する前に、yaml ファイルを使用して必要なサービス アカウントとパーミッションを作成します。

kubectl create -f parasoft-permissions.yaml

コンソールに以下のような出力が表示されるはずです。

serviceaccount/parasoft-account created role.rbac.authorization.k8s.io/parasoft-read created rolebinding.rbac.authorization.k8s.io/parasoft-read-bind created

カスタム キーストア

カスタム キーストアを設定する場合、.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

License Server 環境の作成

License Server 環境を作成するには、まず、シークレット (任意)、ボリューム、ポッドまたはステートフルセット、サービス (任意) を定義した yaml ファイルが必要です。シークレットは、リポジトリから License Server イメージを取得するために使用されます。ポッドまたはステートフルセットは、データを永続化するボリュームとコンテナーの正常性を確認する liveness プローブを備えた License Server コンテナーを実行するためのポッド セットアップを作成します。サービスは、ノードでポートを割り当て、ポッド内のポートにマッピングすることで、外部クライアントから License Server にアクセスできるようにします。ポッドまたはステートフルセットの yaml ファイルの例 (どちらも parasoft-dtp.yaml) を以下に示します。このサンプルは NFS ボリュームを使用しますが、これは必須ではありません。ニーズに合わせたボリューム タイプを使用できます。

注意: kind: Deployment はサポートされません。kind: Pod または kind: StatefulSet のいずれかを使用してください。これらはサポートされています。

ポッドまたはステートフルセットを使用して License Server をデプロイした後、Kind を切り替えると、マシンロック ライセンスが無効になります。

kind: Pod を使用した yaml の例

parasoft-lss.yaml
apiVersion: v1
kind: Pod
metadata:
  name: lss
  namespace: parasoft-lss-namespace
  labels:
    app: LSS
spec:
  volumes:
    - name: lss-data
      nfs:
        server: NFS_SERVER_HOST
        path: /lss/
# 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
  securityContext:
    runAsNonRoot: true
  containers:
    - name: lss-server
      securityContext:
        allowPrivilegeEscalation: false
        capabilities:
          drop: ["ALL"]
        seccompProfile:
          type: RuntimeDefault    
      image: LSS_DOCKER_IMAGE
      imagePullPolicy: Always
      env:
        - name: PARASOFT_POD_NAME			    #REQUIRED, DO NOT CHANGE
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: PARASOFT_POD_NAMESPACE		    #REQUIRED, DO NOT CHANGE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
# To inject JVM arguments into the container, specify the "env" property as in the example below, which injects LSS_JAVA_OPTS
#        - name: LSS_JAVA_OPTS
#          value: "-Dparasoft.use.license.v2=true"
      ports:
        - containerPort: 8080
          name: "http-server"
        - containerPort: 8443
          name: "https-server"
      volumeMounts:
        - mountPath: "/usr/local/parasoft/license-server/data"
          name: lss-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/license-server/app/tomcat/conf/.keystore"
#          subPath: keystore
#        - name: keystore-cfgmap-volume
#          mountPath: "/usr/local/parasoft/license-server/app/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
        initialDelaySeconds: 120
        periodSeconds: 60
        timeoutSeconds: 30
        failureThreshold: 5
  restartPolicy: Always
  serviceAccountName: parasoft-account
  automountServiceAccountToken: true
  imagePullSecrets:
    - name: YOUR_SECRET
---
apiVersion: v1
kind: Service
metadata:
  name: lss
  namespace: parasoft-lss-namespace
spec:
  type: NodePort
  selector:
    app: LSS
  ports:
    - port: 8080
      name: PORT_NAME_1
      nodePort: XXXXX
    - port: 8443
      name: PORT_NAME_2
      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

kind: StatefulSet を使用した yaml の例

parasoft-lss.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: lss
  namespace: parasoft-lss-namespace
  labels:
    app: LSS
spec:
  selector:
    matchLabels:
      app: LSS
  serviceName: lss-service
  replicas: 1
  template:
    metadata:
      labels:
        app: LSS
    spec:
      volumes:
      - name: lss-data
        nfs:
          server: NFS_SERVER_HOST
          path: /lss/
#        persistentVolumeClaim:
#          claimName: lss-pvc
# 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
      securityContext:
        runAsNonRoot: true
      containers:
      - name: lss-server
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: [ "ALL" ]
          seccompProfile:
            type: RuntimeDefault
        image: LSS_DOCKER_IMAGE
        imagePullPolicy: Always
        env:
        - name: PARASOFT_POD_NAME			    #REQUIRED, DO NOT CHANGE
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: PARASOFT_POD_NAMESPACE		    #REQUIRED, DO NOT CHANGE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
# To inject JVM arguments into the container, specify the "env" property as in the example below, which injects LSS_JAVA_OPTS
#        - name: LSS_JAVA_OPTS
#          value: "-Dparasoft.use.license.v2=true"
        ports:
        - containerPort: 8080
          name: "http-server"
        - containerPort: 8443
          name: "https-server"
        volumeMounts:
        - name: lss-data
          mountPath: "/usr/local/parasoft/license-server/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/license-server/app/tomcat/conf/.keystore"
#          subPath: keystore
#        - name: keystore-cfgmap-volume
#          mountPath: "/usr/local/parasoft/license-server/app/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
          initialDelaySeconds: 120
          periodSeconds: 60
          timeoutSeconds: 30
          failureThreshold: 5
      restartPolicy: Always
      serviceAccountName: parasoft-account
      automountServiceAccountToken: true
      imagePullSecrets:
        - name: YOUR_SECRET
---
apiVersion: v1
kind: Service
metadata:
  name: lss
  namespace: parasoft-lss-namespace
spec:
  type: NodePort
  selector:
    app: LSS
  ports:
    - port: 8080
      name: PORT_NAME_1
      nodePort: XXXXX
    - port: 8443
      name: PORT_NAME_2
      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

yaml ファイルを使用した LSS 環境の作成

kubectl create -f parasoft-lss.yaml

Web ブラウザで UI にアクセスするには、サービス定義で割り当てたノード ポートをアドレスとして使用します (たとえば、NODE_HOST:NODE_PORT など)。

コンテナーに JVM 引数をインジェクトし、そのステータスを検証したい場合、次のコマンドを実行します。

kubectl exec <POD_NAME> -c <CONTAINER_NAME> -- printenv

安定したマシン ID のために必要な設定

上記の parasoft-lss.yaml サンプルを変更したり、独自の yaml を作成したりする場合は、安定したマシン ID を確保するために、アップグレードや再デプロイ時に以下のフィールドが一貫している必要があることに注意してください。

  • metadata: name
  • metadata: namespace
  • containers: name

さらに、以下の環境変数が必要です。

  • env: name: PARASOFT_POD_NAME
  • env: name: PARASOFT_POD_NAMESPACE

カスタム トラストストア

Kubernetes 環境でのカスタム トラストストアの使用は、上記のカスタム キーストアの使用と同様です。カスタム キーストアの使用手順を適宜読み換えてください。トラストストアの場所は /usr/local/parasoft/license-server/app/jre/lib/security/cacerts であることに注意してください。

トラブルシューティング

追加ログを有効化する

  1. log4j.xml を <INSTALL_DIR>/app/ ディレクトリから <INSTALL_DIR>/data/ にコピーします。
  2. <INSTALL_DIR>/data/ の log4j.xml ファイルを開き、Loggers 要素に次のロガーを追加します。

    <Logger name="com.parasoft.xtest" level="ALL">
      <AppenderRef ref="CONSOLE" />
    </Logger>
  3. yaml ファイルで LSS_JAVA_OPTS のコメント アウトされたセクションを探してコメントを解除し、LSS_JAVA_OPTS の値として次の内容を追加します。

    -Dparasoft.cloudvm.verbose=true -Dparasoft.logging.config.file=/usr/local/parasoft/license-server/data/log4j.xml
  4. アプリケーションを再起動します。
  5. 追加のログは catalina ログ ファイル (stdout) に記録されます。  このコマンドを実行すると、ログ ファイルをローカル ファイル システムに取得できます (lss-pod1-nfs をポッド名に、parasoft-lss-namespace を使用した名前空間に置き換えます)。

    kubectl logs lss-pod1-nfs -n parasoft-lss-namespace > lss-debug.log

トラブルシューティング

machineId が LINUX2-0

この問題は、根本的な権限に問題がある場合に発生する場合があります。この問題を解決するには、次のオプションを試してください。

  1. parasoft-permissions.yaml を使用して License Server に必要な権限が作成されていることを確認します。
    • 注意: アップグレードする場合は、必ずアップグレード先のバージョンの parasoft-permissions.yaml を使用してください。
  2. Parasoft が必要とするすべてのリソースが同じ名前空間を使用していることを確認します。

ポッドの再起動時に machineId が変更される

この問題は、サポートされていない Kubernetes オブジェクトを使用している場合に発生することがあります。kind: Deployment を使用していないことを確認してください。kind: Pod および kind: StatefulSet のみがサポートされます。 

  • No labels