Terraform Cloud Agent をKubernetes で管理する

Terraform Enterprise, Terraform Cloud Business で利用できるTerraform Cloud Agent をKubenetes 上で動かした際のメモです。

Terraform Cloud Agent(以下TFC Agent) は、有償版のTerraform のTerraform EnterpriseTerraform Cloud Business で利用出来る機能です。

TFC Agent はコンテナイメージとして利用出来ますが、TFC Agent をKubernetes 上で稼働させた際のメモです。


TFC Agent のイメージ作成

この手順では、プライベートなコンテナレジストリを利用する場合を想定しています。カスタムTFC Agent イメージは「Terraform Cloud Agent コンテナをカスタマイズする」と同様に作成し、Harbor レジストリにプッシュしたものを利用します。


TFC Agent 用マニフェストの作成

Deployment リソースとしてTFC Agent を立ち上げます。以下の様な形でマニフェストを用意します。

$ kubectl create deployment tfc-agent --image=registry.<MYDOMAIN>/my-container-repo/tfc-agent-with-tanzu --dry-run=client -oyaml > deployment-tfc-agent-tanzu.yml
 
雛形となるファイルdeployment-tfc-agent-tanzu.yml を修正して、以下の様にマニフェストを作成します。TFC_AGENT_TOKENTFC_AGENT_NAME は環境に応じた値に書き換えて、マニフェストファイルを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: tfc-agent
  name: tfc-agent
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tfc-agent
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: tfc-agent
    spec:
      containers:
      - image: registry.<MYDOMAIN>/my-container-repo/tfc-agent-with-tanzu:latest
        name: tfc-agent-with-tanzu
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        env:
        - name: "TFC_AGENT_TOKEN"
          value: <TFC_AGENT_TOKEN>
        - name: "TFC_AGENT_NAME"
          value: <TFC_AGENT_NAME>

リソースのデプロイ

個別のネームスペースを作成し、そのネームスペースにTFC Agent のDeployment リソースを適用します。

k create ns tfc-agent
 

プライベートレジストリであるHarbor 認証情報をSecret リソースとして作成します。レジストリ情報に関しては、環境に応じて修正します。

k -n tfc-agent create secret docker-registry regsecret --docker-server=registry.<MYDOMAIN> --docker-username=******** --docker-password='********' 
 

作成したSecret リソースをdefault サービスアカウントにpatch しておきます。

k -n tfc-agent patch sa default -p '"imagePullSecrets": [{"name": "regsecret" }]' 
 

作成したマニフェストをデプロイします。

k -n tfc-agent apply -f deployment-tfc-agent-tanzu.yml 
 

少し待つと、以下の様にマニフェストで定義したリソースがデプロイされている事を確認出来ます。

$ k -n tfc-agent get all
NAME                             READY   STATUS    RESTARTS   AGE
pod/tfc-agent-64f9c46fd6-6x9k8   1/1     Running   0          68s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/tfc-agent   1/1     1            1           68s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/tfc-agent-64f9c46fd6   1         1         1       68s

TFC からの確認

Terraform Cloud のワークスペースの"Settings" -> "Execution Mode" -> "Agent" 設定しているワークスペースでTerraform Run($ terraform plan & terraform apply) を実行します。
 
Podのログを確認すると、TFC Agent で処理がなされている事を確認する事が出来ます。もちろん、Terraform Cloud 上でも処理が正常に終了している事が確認出来ています。
$ k -n tfc-agent logs pod/tfc-agent-64f9c46fd6-6x9k8
2021-11-01T02:19:35.086Z [INFO]  agent: Starting: name=tfc-agent-on-fender version=1.0.0
2021-11-01T02:19:35.094Z [INFO]  core: Starting: version=1.0.0
2021-11-01T02:19:35.806Z [INFO]  core: Agent registered successfully with Terraform Cloud: agent.id=agent-******** agent.pool.id=apool-********
2021-11-01T02:19:35.899Z [INFO]  agent: Core version is up to date: version=1.0.0
2021-11-01T02:19:35.899Z [INFO]  core: Waiting for next job
2021-11-01T02:23:41.510Z [INFO]  core: Job received: job.type=plan job.id=run-********
2021-11-01T02:23:41.511Z [INFO]  terraform: Handling run: run.id=run-******** run.operation=plan organization.name=******** workspace.name=********
2021-11-01T02:23:41.511Z [INFO]  terraform: Downloading Terraform release: url=https://releases.hashicorp.com/terraform/1.0.7/terraform_1.0.7_linux_amd64.zip
2021-11-01T02:23:46.002Z [INFO]  terraform: Extracting Terraform from release archive
2021-11-01T02:23:47.606Z [INFO]  terraform: Terraform CLI details: version=1.0.7
2021-11-01T02:23:47.606Z [INFO]  terraform: Downloading Terraform configuration
2021-11-01T02:23:47.818Z [INFO]  terraform: Running terraform init
2021-11-01T02:23:53.531Z [INFO]  terraform: Running terraform plan
2021-11-01T02:23:59.500Z [INFO]  terraform: Generating and uploading plan JSON
2021-11-01T02:24:04.315Z [INFO]  terraform: Generating and uploading provider schemas JSON
2021-11-01T02:24:09.406Z [INFO]  terraform: Persisting filesystem to remote storage
2021-11-01T02:24:15.352Z [INFO]  terraform: Finished handling run
2021-11-01T02:24:15.655Z [INFO]  core: Waiting for next job
2021-11-01T02:24:50.253Z [INFO]  core: Job received: job.type=apply job.id=run-********
2021-11-01T02:24:50.253Z [INFO]  terraform: Handling run: run.id=run-******** run.operation=apply organization.name=******** workspace.name=********
2021-11-01T02:24:50.426Z [INFO]  terraform: Extracting Terraform from release archive
2021-11-01T02:24:51.931Z [INFO]  terraform: Terraform CLI details: version=1.0.7
2021-11-01T02:24:51.931Z [INFO]  terraform: Restoring filesystem from remote storage
2021-11-01T02:24:55.493Z [INFO]  terraform: Running terraform init
2021-11-01T02:24:59.243Z [INFO]  terraform: Running terraform apply
2021-11-01T02:25:05.510Z [INFO]  terraform: Finished handling run
2021-11-01T02:25:06.375Z [INFO]  core: Waiting for next job

このブログの人気の投稿

Tanzu Mission Control(TMC) の NetworkPolicy を試してみる