Skip to content

Infrastructure Adapterの作成

Infrastructure Adapterを独自に作成、コンパイルしてKubernetes Manifestを生成する方法を解説します。

事前準備として、Adapter作成の準備に従って、cue.mod/module.cueを使ったモジュール定義ができているリポジトリで作業をしてください。

Infrastructure Adapter の実装

サンプルのInfrastructure Adapterを作成します。 以下の例では、nginxサーバを構成するPodを定義しています。 パラメータとしてk8sNamespaceimageNameを受け取り、podのnamespace名にk8sNamespaceの値が、コンテナのイメージ名にimageNameの値が渡るようにしています。

  • ファイル例: .valuestream/local/web/main.cue
  • Infrastructure Adapter 例:
cue
package web

DesignPattern: {
	name: "web"

	parameters: {
		k8sNamespace: string
		imageName: string
	}

	resources: app: {
		pod: _pod
	}
	
	_pod: {
		apiVersion: "v1"
		kind:       "Pod"
		metadata: {
			name: "sample-pod"
			namespace: parameters.k8sNamespace
		}
		spec: {
			containers: [{
				name: "nginx"
				image: parameters.imageName
				ports: [{
				  containerPort: 80
			    }]
			}]
		}
	}
}

Adapterの記述の詳細については、What is Cloud Native Adapterを参照してください。

QVS Configの作成

作成したサンプルの Adapter をコンパイル対象として宣言する QVS Config を作成します。

  • ファイル例: .valuestream/qvs.yaml
  • QVS Config 例:
yaml
params:
  - name: k8sNamespace
    type: string
  - name: imageName
    type: string

modules:
  - name: github.com/qmonus/sample-module
    local:
      path: .

designPatterns:     
  - pattern: github.com/qmonus/sample-module/local/web
    params:
      k8sNamespace: $(params.k8sNamespace)
      imageName:    $(params.imageName)

QVS Configを構成するparamsmodulesdesignPatternsの詳細については、QVS Configで指定する各フィールドの詳細を参照してください。

パラメータファイルの作成

パラメータファイルは、QVS Config と一緒にコンパイルするパラメータを指定する JSON ファイルです。このファイルには、namevalue を指定したパラメータの配列を記載します。

パラメータファイル

実際にQmonus Value Streamを通してCI/CDを実行する際は、AssemblyLineの動作の中でパラメータが自動的に渡されるため、パラメータファイルを意識する必要はありません。 今回はコンパイルが正しく動作することをローカルで確認するために、パラメータ ファイルを一時的に作成します。

以下の例では、.valuestream/qvs.yamlに必要なパラメータであるk8sNamespaceimageNameを与えています。

  • ファイル例: .valuestream/params.json
  • コンテンツ例:
json
{
  "params": [
    {
      "name": "k8sNamespace",
      "value": "test-namespace"
    },
    {
      "name": "imageName",
      "value": "nginx:latest"
    }
  ]
}

作成したInfrastructure Adapterのコンパイル

Infrastructure Adapterのコンパイルを行うために、.valuestream上で、以下のコマンドを実行します。

bash
qvsctl manifest compile -c qvs.yaml -p params.json -m . -o output/nginx-pod.yaml

このコマンドでは、パラメータファイル: params.jsonからQVS Config: qvs.yamlに記述されているAdapterへ必要なパラメータを受け渡してマニフェストを出力しています。-mで、QVS Configのモジュールパス: github.com/qmonus/sample-moduleとカレントディレクトリ: .の対応付けを行い、-oではマニフェストの出力先としてoutput/nginx-pod.yamlを指定しています。

コンパイル成功時は、以下のようなログが出力されます。

Start to dump manifests - qvsconfig=qvs.yaml, param=params.json, output=output/nginx-pod.yaml
Resolving design pattern from YAML QVS Config
Resolved qvsconfig

Run composite for qvsconfig
[1] Resolving resource with input params {"k8sNamespace":"test-namespace","imageName":"nginx:latest"}
[1] Resolved web
[1] Params {
      k8sNamespace: "test-namespace"
      imageName:    "nginx:latest"
    }

Successfully dumped manifests to output/nginx-pod.yaml

.valuestream/output/nginx-pod.yamlとして以下のマニフェストが出力されていることを確認します。

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: test-namespace
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - containerPort: 80

以上でqvsctl manifest compileコマンドによるInfrastructure Adapterのコンパイルが確認できました。
さらにInfrastructure Adapterの試験方法(出力として想定しているマニフェストと、実際に出力されたマニフェストが一致することを試験する方法)を知りたい場合は、Infrastructure Adapterの試験を参照してください。