Tanzu Kubernetes Grid(TKGm) 1.2.1 にConcourse CI をインストールする

構築済のTanzu Kubernetes Grid(TKG) 環境に対して、Concourse CI をhelm でインストールした際のメモです。

前提

  • TKGm on vSphere 環境(TKGm v1.2.1)
  • type: LoadBalancer が使える事(この記事ではmetalLB を利用しています)

手順

Concourse リポジトリの追加

helm3 を利用しています。Concourse リポジトリを追加します。こちらの手順に従って、実施します。
こちらの「Getting Started with Concourse CI」も参考になると思います。
$ helm repo add concourse https://concourse-charts.storage.googleapis.com/

リポジトリを確認します。
$ helm repo list
NAME     	URL
bitnami  	https://charts.bitnami.com/bitnami
concourse	https://concourse-charts.storage.googleapis.com/

Concourse アクセス用の証明書取得(Let's Encrypt)

Let's Encrypt でConcourse Web 用の証明書を取得します。
$ certbot --server https://acme-v02.api.letsencrypt.org/directory -d "concourse1.<MYDOMAIN>" --manual --preferred-challenges dns-01 certonly --work-dir ~/lab-cert/concourse1/certbot/wd --config-dir ~/lab-cert/concourse1/certbot/cfg --logs-dir ~/lab-cert/concourse1/certbot/logs

Concourse 用のSecret 作成

Concourse chart のvalues.yaml で利用するので、前の手順で取得したcertprivatekeySecret を作成しておきます。
Concourse はNamespace Concourse に導入しようと思うので、Namespace も作成しておきます。
$ kubectl create ns concourse
$ kubectl create secret tls concourse-tls-secret -n concourse --cert=~/lab-cert/concourse1/certbot/cfg/live/concourse1.<MYDOMAIN>/fullchain.pem --key=~/lab-cert/concourse1/certbot/cfg/live/concourse1.<MYDOMAIN>/privkey.pem

Concourse chart のvalues.yaml を作成

以下の様な形で作成します。
webTlsCert は、certbot コマンドで作成されたfullchain.pem ファイルの1つ目の -----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- までを指定します。
webTlsKey は、certbot コマンドで作成されたprivkey.pem ファイルの内容を指定します。
$ cat << EOF >> concourse-values.yaml
concourse:
  web:
    externalUrl: https://concourse1.<MYDOMAIN>
    tls:
      enabled: true
web:
  service:
    api:
      type: LoadBalancer
  ingress:
    enabled: true
    hosts:
    - concourse1.<MYDOMAIN>
    tls:
      - secretName: concourse-tls-secret
        hosts:
          - concourse1.<MYDOMAIN>
persistence:
  worker:
    size: 80Gi
secrets:
  webTlsCert: |
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
  webTlsKey: |
    -----BEGIN PRIVATE KEY-----
    ...
    -----END PRIVATE KEY-----
EOF

Concourse chart のインストール

インストールします。
TKGm v1.2.1 on vSphere 環境の場合、こちらの手順を実施しておかないと、postgresql Pod の起動に失敗するため、事前に実施しておきます。
その上で以下を実行します。
$ helm upgrade --install concourse1 concourse/concourse -f ~/concourse/concourse-values.yaml --namespace concourse
Release "concourse1" has been upgraded. Happy Helming!
NAME: concourse1
LAST DEPLOYED: Fri Mar 19 15:11:58 2021
NAMESPACE: concourse
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
* Concourse can be accessed:

  * Within your cluster, at the following DNS name at port 8080:

    concourse1-web.concourse.svc.cluster.local

  * From outside the cluster, the URL(s) are:

    http://concourse1.<MYDOMAIN>
* If this is your first time using Concourse, follow the examples at https://concourse-ci.org/examples.html
......(SNIP)......

無事にインストール出来ている事を確認します。
$ kubectl get all -n concourse
NAME                                  READY   STATUS    RESTARTS   AGE
pod/concourse1-postgresql-0           1/1     Running   0          22h
pod/concourse1-web-68d866988f-wvfnf   1/1     Running   0          20h
pod/concourse1-worker-0               1/1     Running   0          22h
pod/concourse1-worker-1               1/1     Running   0          22h

NAME                                     TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                        AGE
service/concourse1-postgresql            ClusterIP      None             <none>           5432/TCP                       22h
service/concourse1-postgresql-headless   ClusterIP      None             <none>           5432/TCP                       22h
service/concourse1-web                   LoadBalancer   100.71.152.226   xxx.xxx.xxx.xxx   8080:32748/TCP,443:30492/TCP   22h
service/concourse1-web-worker-gateway    ClusterIP      None             <none>           2222/TCP                       22h
service/concourse1-worker                ClusterIP      None             <none>           <none>                         22h

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/concourse1-web   1/1     1            1           22h

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/concourse1-web-576567cb47   0         0         0       22h
replicaset.apps/concourse1-web-68d866988f   1         1         1       20h
replicaset.apps/concourse1-web-7d65bcc47    0         0         0       20h
replicaset.apps/concourse1-web-87bf5d657    0         0         0       21h
replicaset.apps/concourse1-web-988455c45    0         0         0       21h

NAME                                     READY   AGE
statefulset.apps/concourse1-postgresql   1/1     22h
statefulset.apps/concourse1-worker       2/2     22h

EXTERNAL-IPconcourse1.<MYDOMAIN> のAレコードとして、DNS サーバに登録します。

fly コマンドでConcourse にアクセス

Concouse Web UI からfly CLI をダウンロードし、fly コマンドでConcourse を操作します。Web ブラウザからは、concourse1.<MYDOMAIN> に証明書エラー無くアクセス出来ていたのですが、、、x509: certificate signed by unknown authority というエラーメッセージが出力されてしましました。。。
$ fly -t concourse1 login --concourse-url https://concourse1.<MYDOMAIN> -u test -p test
logging in to team 'main'

could not reach the Concourse server called concourse1:

    Get "https://concourse1.<MYDOMAIN>/api/v1/info": x509: certificate signed by unknown authority

is the targeted Concourse running? better go catch it lol

以下の通り、fly コマンドにオプションを付けると、無事にデプロイしたConcourse をターゲット登録出来ました。
$ fly -t concourse1 login --concourse-url https://concourse1.<MYDOMAIN> -u test -p test --ca-cert=~/lab-cert/concourse1/certbot/cfg/live/concourse1.<MYDOMAIN>/cert.pem
logging in to team 'main'


target saved

サンプルパイプラインのデプロイ

こちらのチュートリアルを参考にサンプルパイプラインをデプロイしてみます。
$ git clone https://github.com/starkandwayne/concourse-tutorial.git
$ cd concourse-tutorial/tutorials/basic/basic-pipeline

パイプラインをセットします。
$ fly -t concourse1 sp -c pipeline.yml -p hello-world
jobs:
  job job-hello-world has been added:
+ name: job-hello-world
+ plan:
+ - config:
+     image_resource:
+       name: ""
+       source:
+         repository: busybox
+       type: docker-image
+     platform: linux
+     run:
+       args:
+       - hello world
+       path: echo
+   task: hello-world
+ public: true

pipeline name: hello-world

apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: https://concourse1.<MYDOMAIN>/teams/main/pipelines/hello-world

the pipeline is currently paused. to unpause, either:
  - run the unpause-pipeline command:
    fly -t concourse1 unpause-pipeline -p hello-world
  - click play next to the pipeline in the web ui

ポーズを解除し、無事にパイプラインが成功している事が確認出来ました。



このブログの人気の投稿