Tanzu Kubernetes Cluster(TKC) に Contour, Harbor, TBS, Concourse をデプロイした際の手順

Tanzu Kubernetes Cluster(TKC) にてんこ盛りでデプロイしたので、その際に実施した手順です。Contour をIngress として利用し、そのバックエンドで Harbor, Concourse にアクセス出来るようにしています。このHarbor を利用する形でTBS もデプロイしています。


環境

  • vSphere with Tanzu 7u2 + NSX ALB
  • Tanzu Kubernetes Cluster v1.19.7

手順

TKC のデプロイ

以下のTKC マニフェストを利用し、TKC をデプロイします。Tanzu Build Service(TBS) が Worker Node の /var/lib の領域を利用するため、50GB 以上を指定し作成しておきます。この環境は検証用環境でThin Provisioning で仮想ディスクが切り出されるため、256GB を指定しています。
$ cat tkc-fender.yaml
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
  name: fender
  namespace: tadashi
spec:
  distribution:
    version: 1.19.7
  topology:
    controlPlane:
      count: 1
      class: best-effort-medium
      storageClass: default
      volumes:
        - name: etcd
          mountPath: /var/lib/etcd
          capacity:
            storage: 64Gi
    workers:
      count: 1
      class: best-effort-large
      storageClass: default
      volumes:
        - name: containerd
          mountPath: /var/lib/containerd
          capacity:
            storage: 256Gi
  settings:
    network:
      cni:
        name: antrea
    storage:
      defaultClass: default # default storage class setting
$ kubectl apply -f tkc-fender.yaml

こちらの「Connect to the Tanzu Kubernetes Cluster Control Plane as the Administrator」に従って、デプロイしたTKC にアクセスするためのkubeconfig ファイルを取得しておきます。
$ kubectl -n tadashi get secrets fender-kubeconfig -o jsonpath='{.data.value}' | base64 -d > fender-kubeconfig
$ export KUBECONFIG=~/fender-kubeconfig

これからContour, Harbor, TBS, Concourse をデプロイするための準備が出来ました。

Contour のデプロイ

こちらの「Deploy the Contour Extension」に従ってデプロイしていきます。tanzu-extentions は事前にダウンロードして、展開しておきます。※TKG Extension v1.3.1 以降では、tmc-extension-manager.yaml のデプロイは不要です。

まず、tmc-extension-manager.yaml を apply します。
$ kubectl apply -f tmc-extension-manager.yaml

tkg-extensions-v1.3.0+vmware.1 ディレクトリ直下に移動し、cert-manager をインストールします。
$ kubectl apply -f cert-manager

ディレクトリをtkg-extensions-v1.3.0+vmware.1/extensions に移動し、以下のマニフェストを apply します。
$ kubectl apply -f ingress/contour/namespace-role.yaml

contour のvalues.yaml をコピーし、envoy.service.typeNodePort から LoadBalancer に変更します。変更したvalues.yaml を元にSecret を作成します。
$ cp ingress/contour/vsphere/contour-data-values.yaml.example \
ingress/contour/vsphere/contour-data-values.yaml
$ cat ingress/contour/vsphere/contour-data-values.yaml
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
infrastructure_provider: "vsphere"
contour:
  image:
    repository: projects.registry.vmware.com/tkg
envoy:
  image:
    repository: projects.registry.vmware.com/tkg
  service:
    type: "NodePort"%
$ vim ingress/contour/vsphere/contour-data-values.yaml
$ kubectl -n tanzu-system-ingress create secret generic contour-data-values \
--from-file=values.yaml=ingress/contour/vsphere/contour-data-values.yaml

contour をデプロイします。
$ kubectl apply -f ingress/contour/contour-extension.yaml

しばらくすると、サービスが起動してきます。
$ kubectl -n tanzu-system-ingress get app contour
NAME      DESCRIPTION           SINCE-DEPLOY   AGE
contour   Reconcile succeeded   11s            114s

後ほど必要になるので、envoy の EXTERNAL-IP をメモしておきます。
$ kubectl -n tanzu-system-ingress get svc
NAME      TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
contour   ClusterIP      10.100.210.152   <none>           8001/TCP                     73s
envoy     LoadBalancer   10.107.194.106   xx.xxx.xxx.xxx   80:32060/TCP,443:32072/TCP   72s

Contour をデプロイした後は、こちら「Access the Envoy Administration Interface Remotely」にある手順に従うと、Envoy の管理者インターフェースにアクセスする事が出来ます。
$ export KUBECONFIG=~/fender-kubeconfig
$ ENVOY_POD=$(kubectl -n tanzu-system-ingress get pod -l app=envoy -o name | head -1)
$ kubectl -n tanzu-system-ingress port-forward $ENVOY_POD 9001

続いて、Let's Encrypt を利用し、Contour で利用する証明書を取得します。

Let's Encrypt で証明書の取得

以下のコマンドで証明書を発行します。
この環境ではGoogle DNS を使っています。envoy にアサインされていたEXTERNAL-IP*.<MYDOMAIN> のAレコードとして登録しています。
$ certbot --server https://acme-v02.api.letsencrypt.org/directory \
-d "*.<MYDOMAIN>" --manual --preferred-challenges dns-01 certonly \
--work-dir ./<cluster-name>/wd \
--config-dir ./<cluster-name>/cfg \
--logs-dir ./<cluster-name>/logs

案内に従ってステップを進めていくと、DNS TXT レコード とそれに対応する Values が表示されるので、その組合せをGoogle DNS に登録します。
名前解決出来るまでしばらく時間が掛かりますが、以下のコマンドで登録したDNS TXT レコードの Values 値が返ってくればOKです。
$ nslookup -q=txt _acme-challenge.<MYDOMAIN>

クエリが通ったら、プロンプトでEnter を入力し、処理を終えます。
Congratulations! Your certificate and chain have been saved at: と出力されていれば、無事処理が終わっています。

Harbor のデプロイ

続いてHarbor をデプロイしていきます。この手順ではBitnami が提供しているHelm Chart を利用してデプロイしています。こちらにある手順に従って、事前にBitnami のHelm Chart を追加しておきます。
Harbor をデプロイするNamespace とRoleBinding 設定をしていきます。
$ kubectl create ns harbor
$ kubectl -n harbor create rolebinding harbor-role-binding \
--clusterrole=psp:vmware-system-privileged --group=system:authenticated

Harbor が利用するTLS のSecret を作成していきます。--cert--key で指定しているファイルは上の手順で作成したfullchain.pemprivkey.pem になります。
$ kubectl -n harbor create secret tls harbor-tls-secret \
--cert=./<cluster-name>/certbot/cfg/live/<MYDOMAIN>/fullchain.pem \
--key=./<cluster-name>/certbot/cfg/live/<MYDOMAIN>/privkey.pem

Helm のリポジトリをアップデートしておきます。
$ helm repo update
$ helm search repo bitnami |grep harbor
  bitnami/harbor                              	9.8.3        	2.2.1        	Harbor is an an open source trusted cloud nativ...

Harbor をインストールする際のvalues.yaml を作成します。この環境ではIngress として、Contour を利用しているので、ingress.annotations.kubernetes.io/ingress.class にContour を指定しています。
$ cat harbor-values.yaml
harborAdminPassword: xxxxx

service:
  type: ClusterIP
  tls:
    enabled: true
    existingSecret: harbor-tls-secret
    notaryExistingSecret: harbor-tls-secret

externalURL: registry.<MYDOMAIN>

ingress:
  enabled: true
  hosts:
    core: registry.<MYDOMAIN>
    notary: notary.<MYDOMAIN>
  annotations:
    ingress.kubernetes.io/force-ssl-redirect: "true"     # force https, even if http is requested
    kubernetes.io/ingress.class: contour                 # using Contour for ingress
    kubernetes.io/tls-acme: "true"                       # using ACME certificates for TLS

portal:
  tls:
    existingSecret: harbor-tls-secret

persistence:
  persistentVolumeClaim:
    registry:
      size: 100Gi
    jobservice:
      size: 10Gi
    chartmuseum:
      size: 10Gi
    trivy:
      size: 100Gi

※Docker Hub のRate Limit に当たってしまたっため、GCR レジストリにあるとgcr.io/bitnami-containers リポジトリを利用する場合は、以下の様な形のvalues.yaml を利用しました。
# values.yaml
global:
  imageRegistry: gcr.io

coreImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-core
portalImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-portal
jobserviceImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-jobservice
chartMuseumImage:
  registry: gcr.io
  repository: bitnami-containers/chartmuseum
registryImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-registry
registryctlImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-registryctl
trivyImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-adapter-trivy
clairImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-clair
clairAdapterImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-adapter-clair
notaryServerImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-notary-server
notarySignerImage:
  registry: gcr.io
  repository: bitnami-containers/harbor-notary-signer
nginxImage:
  registry: gcr.io
  repository: bitnami-containers/nginx

volumePermissions:
  image:
    registry: gcr.io
    repository: bitnami-containers/bitnami-shell

...(SNIP)...

redis:
  image:
    registry: gcr.io
    repository: bitnami-containers/redis
postgresql:
  image:
    registry: gcr.io
    repository: bitnami-containers/postgresql  


helm でHarbor をデプロイします。
$ helm upgrade --install harbor bitnami/harbor -f harbor-values.yaml --namespace harbor

Chart のバージョンを指定する場合は、以下のように実行。
$ helm upgrade --install harbor bitnami/harbor -f harbor-values.yaml --namespace harbor --version 9.8.3

無事にHarbor が立ち上がっている様です。
$ kubectl -n harbor get pods 
NAME                                    READY   STATUS    RESTARTS   AGE
harbor-chartmuseum-69965dcd88-w7st4     1/1     Running   0          3m9s
harbor-core-54f5cf46bc-frvjk            1/1     Running   0          3m9s
harbor-jobservice-76bdd989bf-4vzg6      1/1     Running   0          3m9s
harbor-notary-server-cc445d54d-dsw2v    1/1     Running   0          3m9s
harbor-notary-signer-798bbddc89-knrg8   1/1     Running   1          3m9s
harbor-portal-5f69977cbf-d46wk          1/1     Running   0          3m9s
harbor-postgresql-0                     1/1     Running   0          3m9s
harbor-redis-master-0                   1/1     Running   0          3m9s
harbor-registry-9f55dc7ff-5p9dd         2/2     Running   0          3m9s
harbor-trivy-0                          1/1     Running   0          3m9s

試しに、コンテナイメージをHarbor にアップロード出来るか確認してみます。Harbor UI から事前にdevops ユーザーを作成し、コンテナをアップロードする権限を追加しています。
$ docker login registry.<MYDOMAIN> -u devops -p xxxx
$ docker tag nginx:1.17.10 registry.<MYDOMAIN>/library/nginx:1.17.10
$ docker push registry.<MYDOMAIN>/library/nginx:1.17.10
The push refers to repository [registry.<MYDOMAIN>/library/nginx]
6c7de695ede3: Pushed
2f4accd375d9: Pushed
ffc9b21953f4: Pushed
1.17.10: digest: sha256:8269a7352a7dad1f8b3dc83284f195bac72027dd50279422d363d49311ab7d9b size: 948

無事にインストール出来たことが確認出来ました。このHarbor を利用して、TBS をデプロイしていきます。

TBS のデプロイ

こちら「Tanzu Kubernetes Grid 上に Tanzu Build Service をインストールする」の記事を参考に事前に必要なパッケージやコマンドをインストールしておきます。
上で作成したHarbor とregistry.pivotal.io にログインしておきます。registry.pivotal.io のログインにはVMware Tanzu Network のアカウントが必要になります。
$ docker login registry.<MYDOMAIN> -u devops -p xxxx
$ docker login registry.pivotal.io

TBS のインストールに必要なコンテナイメージをHarbor 上に展開します。Harbor 上にプロジェクトは事前に作成しておき、メンバーとしてdevops ユーザーを加えています。
$ kbld relocate -f images.lock --lock-output images-relocated.lock --repository registry.<MYDOMAIN>/tanzu/build-service
...(SNIP)...
relocate | imported 15 images
Succeeded

TBS をデプロイします。
$ ytt -f values.yaml -f manifests/ -v docker_repository="registry.<MYDOMAIN>/tanzu/build-service" -v docker_username=devops -v docker_password=xxxx | kbld -f images-relocated.lock -f- | kapp deploy -a tanzu-build-service -f- -y

...(SNIP)...

Changes

Namespace               Name                                                            Kind                            Conds.  Age  Op      Op st.  Wait to    Rs  Ri
(cluster)               build-service                                                   Namespace                       -       -    create  -       reconcile  -   -
^                       build-service-admin-role                                        ClusterRole                     -       -    create  -       reconcile  -   -
^                       build-service-admin-role-binding                                ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       build-service-authenticated-role                                ClusterRole                     -       -    create  -       reconcile  -   -
^                       build-service-authenticated-role-binding                        ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       build-service-secret-syncer-role                                ClusterRole                     -       -    create  -       reconcile  -   -
^                       build-service-secret-syncer-role-binding                        ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       build-service-user-role                                         ClusterRole                     -       -    create  -       reconcile  -   -
^                       build-service-warmer-role                                       ClusterRole                     -       -    create  -       reconcile  -   -
^                       build-service-warmer-role-binding                               ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       builders.kpack.io                                               CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       builds.kpack.io                                                 CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       cert-injection-webhook-cluster-role                             ClusterRole                     -       -    create  -       reconcile  -   -
^                       cert-injection-webhook-cluster-role-binding                     ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       clusterbuilders.kpack.io                                        CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       clusterstacks.kpack.io                                          CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       clusterstores.kpack.io                                          CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       custom-stack-editor-role                                        ClusterRole                     -       -    create  -       reconcile  -   -
^                       custom-stack-viewer-role                                        ClusterRole                     -       -    create  -       reconcile  -   -
^                       customstacks.stacks.stacks-operator.tanzu.vmware.com            CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       defaults.webhook.cert-injection.tanzu.vmware.com                MutatingWebhookConfiguration    -       -    create  -       reconcile  -   -
^                       defaults.webhook.kpack.io                                       MutatingWebhookConfiguration    -       -    create  -       reconcile  -   -
^                       images.kpack.io                                                 CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       kpack                                                           Namespace                       -       -    create  -       reconcile  -   -
^                       kpack-controller-admin                                          ClusterRole                     -       -    create  -       reconcile  -   -
^                       kpack-controller-admin-binding                                  ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       kpack-webhook-certs-mutatingwebhookconfiguration-admin-binding  ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       kpack-webhook-mutatingwebhookconfiguration-admin                ClusterRole                     -       -    create  -       reconcile  -   -
^                       metrics-reader                                                  ClusterRole                     -       -    create  -       reconcile  -   -
^                       proxy-role                                                      ClusterRole                     -       -    create  -       reconcile  -   -
^                       proxy-rolebinding                                               ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       sourceresolvers.kpack.io                                        CustomResourceDefinition        -       -    create  -       reconcile  -   -
^                       stacks-operator-manager-role                                    ClusterRole                     -       -    create  -       reconcile  -   -
^                       stacks-operator-manager-rolebinding                             ClusterRoleBinding              -       -    create  -       reconcile  -   -
^                       stacks-operator-system                                          Namespace                       -       -    create  -       reconcile  -   -
^                       validation.webhook.kpack.io                                     ValidatingWebhookConfiguration  -       -    create  -       reconcile  -   -
build-service           build-pod-image-fetcher                                         DaemonSet                       -       -    create  -       reconcile  -   -
^                       build-service-warmer-namespace-role                             Role                            -       -    create  -       reconcile  -   -
^                       build-service-warmer-namespace-role-binding                     RoleBinding                     -       -    create  -       reconcile  -   -
^                       ca-cert                                                         ConfigMap                       -       -    create  -       reconcile  -   -
^                       canonical-registry-secret                                       Secret                          -       -    create  -       reconcile  -   -
^                       cb-service-account                                              ServiceAccount                  -       -    create  -       reconcile  -   -
^                       cert-injection-webhook                                          Deployment                      -       -    create  -       reconcile  -   -
^                       cert-injection-webhook                                          Service                         -       -    create  -       reconcile  -   -
^                       cert-injection-webhook-role                                     Role                            -       -    create  -       reconcile  -   -
^                       cert-injection-webhook-role-binding                             RoleBinding                     -       -    create  -       reconcile  -   -
^                       cert-injection-webhook-sa                                       ServiceAccount                  -       -    create  -       reconcile  -   -
^                       cert-injection-webhook-tls                                      Secret                          -       -    create  -       reconcile  -   -
^                       http-proxy                                                      ConfigMap                       -       -    create  -       reconcile  -   -
^                       https-proxy                                                     ConfigMap                       -       -    create  -       reconcile  -   -
^                       no-proxy                                                        ConfigMap                       -       -    create  -       reconcile  -   -
^                       secret-syncer-controller                                        Deployment                      -       -    create  -       reconcile  -   -
^                       secret-syncer-service-account                                   ServiceAccount                  -       -    create  -       reconcile  -   -
^                       setup-ca-certs-image                                            ConfigMap                       -       -    create  -       reconcile  -   -
^                       sleeper-image                                                   ConfigMap                       -       -    create  -       reconcile  -   -
^                       warmer-controller                                               Deployment                      -       -    create  -       reconcile  -   -
^                       warmer-service-account                                          ServiceAccount                  -       -    create  -       reconcile  -   -
kpack                   build-init-image                                                ConfigMap                       -       -    create  -       reconcile  -   -
^                       build-init-windows-image                                        ConfigMap                       -       -    create  -       reconcile  -   -
^                       canonical-registry-secret                                       Secret                          -       -    create  -       reconcile  -   -
^                       canonical-registry-serviceaccount                               ServiceAccount                  -       -    create  -       reconcile  -   -
^                       completion-image                                                ConfigMap                       -       -    create  -       reconcile  -   -
^                       completion-windows-image                                        ConfigMap                       -       -    create  -       reconcile  -   -
^                       controller                                                      ServiceAccount                  -       -    create  -       reconcile  -   -
^                       kp-config                                                       ConfigMap                       -       -    create  -       reconcile  -   -
^                       kpack-controller                                                Deployment                      -       -    create  -       reconcile  -   -
^                       kpack-controller-local-config                                   Role                            -       -    create  -       reconcile  -   -
^                       kpack-controller-local-config-binding                           RoleBinding                     -       -    create  -       reconcile  -   -
^                       kpack-webhook                                                   Deployment                      -       -    create  -       reconcile  -   -
^                       kpack-webhook                                                   Service                         -       -    create  -       reconcile  -   -
^                       kpack-webhook-certs-admin                                       Role                            -       -    create  -       reconcile  -   -
^                       kpack-webhook-certs-admin-binding                               RoleBinding                     -       -    create  -       reconcile  -   -
^                       lifecycle-image                                                 ConfigMap                       -       -    create  -       reconcile  -   -
^                       rebase-image                                                    ConfigMap                       -       -    create  -       reconcile  -   -
^                       webhook                                                         ServiceAccount                  -       -    create  -       reconcile  -   -
^                       webhook-certs                                                   Secret                          -       -    create  -       reconcile  -   -
stacks-operator-system  canonical-registry-secret                                       Secret                          -       -    create  -       reconcile  -   -
^                       controller-manager                                              Deployment                      -       -    create  -       reconcile  -   -
^                       controller-manager-metrics-service                              Service                         -       -    create  -       reconcile  -   -
^                       leader-election-role                                            Role                            -       -    create  -       reconcile  -   -
^                       leader-election-rolebinding                                     RoleBinding                     -       -    create  -       reconcile  -   -
^                       stackify-image                                                  ConfigMap                       -       -    create  -       reconcile  -   -

Op:      82 create, 0 delete, 0 update, 0 noop
Wait to: 82 reconcile, 0 delete, 0 noop

...(SNIP)...

Succeeded

RoleBinding の設定が無いとPod が立ち上がらないので、上のコマンドを実行しているターミナルとは別のターミナルを開いて、TBS デプロイ時に作成される以下3つのNamespace に対してRoleBinding 設定をしておきます。
$ kubectl -n build-service create rolebinding tbs-role-binding \
--clusterrole=psp:vmware-system-privileged --group=system:authenticated
$ kubectl -n kpack create rolebinding tbs-role-binding \
--clusterrole=psp:vmware-system-privileged --group=system:authenticated
$ kubectl -n stacks-operator-system create rolebinding tbs-role-binding \
--clusterrole=psp:vmware-system-privileged --group=system:authenticated

ClusterBuilder をインストールします。
$ kp import -f descriptor-100.0.80.yaml
$ kp clusterbuilder list
NAME       READY    STACK                          IMAGE
base       true     io.buildpacks.stacks.bionic    registry.<MYDOMAIN>/tanzu/build-service/base@sha256:e49bfb99292dd424d41debba05b21a1abed5b806ded08a8fedfab5c5491f3434
default    true     io.buildpacks.stacks.bionic    registry.<MYDOMAIN>/tanzu/build-service/default@sha256:e49bfb99292dd424d41debba05b21a1abed5b806ded08a8fedfab5c5491f3434
full       true     io.buildpacks.stacks.bionic    registry.<MYDOMAIN>/tanzu/build-service/full@sha256:38841a236b15059a390975ea6f492d7bda0d294287d267fe95ff731993363946
tiny       true     io.paketo.stacks.tiny          registry.<MYDOMAIN>/tanzu/build-service/tiny@sha256:97b734efc85782bebdbe090c3bed0fd281ed0c0eec2dffb12d04825468f5091d


TBS を利用してコンテナイメージが作成出来るかどうか確認してみます。Harbor 上にプロジェクトは事前に作成しておき、メンバーとしてdevops ユーザーを加えています。
$ kubectl create ns tbs-apps
$ kubectl -n tbs-apps create rolebinding tbs-role-binding \
--clusterrole=psp:vmware-system-privileged --group=system:authenticated
$ kp secret create harbor-pezfender --registry registry.<MYDOMAIN> \
--registry-user devops --namespace tbs-apps
$ kp image create go-hello-world --tag registry.<MYDOMAIN>/apps/go-hello-world --local-path ./go/hello-world/ --cluster-builder tiny --namespace tbs-apps --wait
Creating Image...
Uploading to 'registry.<MYDOMAIN>/apps/go-hello-world-source'...
	Uploading 'registry.<MYDOMAIN>/apps/go-hello-world-source@sha256:66b5b9b5e2784486f0b04474526fc9789e1c1656e968fb7c8a0dbeddf0bf7771'
Image "go-hello-world" created
===> PREPARE
Build reason(s): CONFIG
CONFIG:
	resources: {}
	- source: {}
	+ source:
	+   registry:
	+     image: registry.<MYDOMAIN>/apps/go-hello-world-source@sha256:66b5b9b5e2784486f0b04474526fc9789e1c1656e968fb7c8a0dbeddf0bf7771
Loading secret for "registry.<MYDOMAIN>" from secret "harbor-pezfender" at location "/var/build-secrets/harbor-pezfender"
Pulling registry.<MYDOMAIN>/apps/go-hello-world-source@sha256:66b5b9b5e2784486f0b04474526fc9789e1c1656e968fb7c8a0dbeddf0bf7771...
Successfully pulled registry.<MYDOMAIN>/apps/go-hello-world-source@sha256:66b5b9b5e2784486f0b04474526fc9789e1c1656e968fb7c8a0dbeddf0bf7771 in path "/workspace"
===> DETECT
tanzu-buildpacks/go-dist  0.1.3
tanzu-buildpacks/go-build 0.0.23
===> ANALYZE
Previous image with name "registry.<MYDOMAIN>/apps/go-hello-world" not found
===> RESTORE
===> BUILD
Tanzu Go Distribution Buildpack 0.1.3
  Resolving Go version
    Candidate version sources (in priority order):
      <unknown> -> ""

    Selected Go version (using <unknown>): 1.15.5

  Executing build process
    Installing Go 1.15.5
      Completed in 35.264s

Tanzu Go Build Buildpack 0.0.23
  Executing build process
    Running 'go build -o /layers/tanzu-buildpacks_go-build/targets/bin -buildmode pie .'

      Completed in 1m14.441s

  Assigning launch processes
    web: /layers/tanzu-buildpacks_go-build/targets/bin/workspace
===> EXPORT
Adding layer 'tanzu-buildpacks/go-build:targets'
Adding 1/1 app layer(s)
Adding layer 'launcher'
Adding layer 'config'
Adding layer 'process-types'
Adding label 'io.buildpacks.lifecycle.metadata'
Adding label 'io.buildpacks.build.metadata'
Adding label 'io.buildpacks.project.metadata'
Setting default process type 'web'
*** Images (sha256:7fb06b63c1df7c2eeba471da84b1913d5bd6963b64722af74dc17c52f1f35e45):
      registry.<MYDOMAIN>/apps/go-hello-world
      registry.<MYDOMAIN>/apps/go-hello-world:b1.20210401.122003
Adding cache layer 'tanzu-buildpacks/go-dist:go'
Adding cache layer 'tanzu-buildpacks/go-build:gocache'
===> COMPLETION
Build successful

問題なく使える様です。最後にこのTKC にConcourse をデプロイします。

Concourse のデプロイ

Helm Chart を利用してデプロイします。こちらの手順を参考に事前にレポジトリを追加しておきます。
Concourse というNamespace にデプロイしていきます。
$ kubectl create ns concourse
$ kubectl -n concourse create rolebinding concourse-role-binding \
--clusterrole=psp:vmware-system-privileged --group=system:authenticated

Ingress 経由でTLS 通信させる設定にするために、Secret を作成しておきます。
$ kubectl -n concourse create secret tls concourse-tls-secret \
--cert=./<cluster-name>/certbot/cfg/live/<MYDOMAIN>/fullchain.pem \
--key=./<cluster-name>/certbot/cfg/live/<MYDOMAIN>/privkey.pem

Concourse のvalues.yaml を作成します。
$ cat concourse-values.yaml
concourse:
  web:
    externalUrl: https://concourse.<MYDOMAIN>
  kubernetes:
    keepNamespaces: false
web:
  service:
    api:
      type: ClusterIP
  ingress:
    annotations:
      ingress.kubernetes.io/force-ssl-redirect: "true"     # force https, even if http is requested
      kubernetes.io/ingress.class: contour                 # using Contour for ingress
      kubernetes.io/tls-acme: "true"                       # using ACME certificates for TLS
    enabled: true
    hosts:
    - concourse.<MYDOMAIN>
    tls:
      - secretName: concourse-tls-secret
        hosts:
          - concourse.<MYDOMAIN>
persistence:
  worker:
    size: 40Gi

デプロイします。
$ helm upgrade --install concourse concourse/concourse -f concourse-values.yaml --namespace concourse

Pod は問題なく起動している様です。
$ kubectl get pods -n concourse
NAME                            READY   STATUS    RESTARTS   AGE
concourse-postgresql-0          1/1     Running   0          73m
concourse-web-97f647746-2xb4s   1/1     Running   0          70m
concourse-worker-0              1/1     Running   0          73m
concourse-worker-1              1/1     Running   0          73m

fly CLI でインストールしたConcourse をターゲット登録し、サンプルPipeline を流してみます。
$ fly -t pezfender login --concourse-url https://concourse.<MYDOMAIN> -u test -p test
$ fly -t pezfender set-pipeline -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://concourse.<MYDOMAIN>/teams/main/pipelines/hello-world

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

無事にアクセス出来ました。



TKC のデプロイから始まり、Contour、Harbor、TBS、Concourse とデプロイし終わりました。

このブログの人気の投稿