Tanzu Kubernetes Cluster(TKC) 上に Harbor をインストールし、Tanzu Build Service(TBS) をインストールする - その1

表題の通り、Tanzu Kubernetes Grid Service(TKGs)が提供するKubernetes ランタイムサービスの一つである、Tanzu Kubernetes Cluster(TKC)上にHarbor をインストールし、そのHarbor を利用し、Tanzu Build Service(TBS) をインストールしたので、その手順になります。

本記事では、前段にあたる、TKCのデプロイ、TKC上へのHarborのインストールまでを記載しています。


前提

  • vSphere with Tanzu with NSX-T
    • 後程vSphere with Tanzu のNSX-T 環境で利用できるEmbedded Harbor を利用するので、vSphere with Tanzu with NSX-T 環境が必要になっています。
  • これ以降のvSphere7 のバージョン
    • 以下の手順では、vSphere7 で利用出来る様になった以下の機能を前提にしています。
      • Integration with Registry Service
      • Configurable Node Storage
    • * 上の両事項とも、オフィシャルドキュメントに言及がありますが、最新情報を得たい場合は、日本語ではなく、英語の方が良いと思います。
  • 何かしら独自のドメインを持っている事
    • 自分の環境では、Google Domain を利用し、GCP のDNS サービスを利用しています。

手順

TKC のデプロイ

オフィシャルドキュメントを参照し、vSphere with Tanzu 環境にTKC をデプロイします。デフォルトのまま、TKC をデプロイするとルートディスクが16GB になり、TBS を利用する際にディスク領域が足りなくなる可能性があるため、TKC デプロイ時に各ディレクトリのディスク領域を増やしておきます。

*この機能を利用するために、↑の前提条件が必要になってきます。

$ cat tkc-tbs-with-additional-vdisks.yaml
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
  name: tbs
  namespace: tadashi
spec:
  distribution:
    version: v1.18
  topology:
    controlPlane:
      count: 1
      class: best-effort-large
      storageClass: default
      volumes:
        - name: etcd
          mountPath: /var/lib/etcd
          capacity:
            storage: 32Gi
    workers:
      count: 1
      class: best-effort-large
      storageClass: default
      volumes:
        - name: containerd
          mountPath: /var/lib/containerd
          capacity:
            storage: 96Gi
  settings:
    network:
      cni:
        name: antrea
    storage:
      defaultClass: default # default storage class setting

$ kubectl apply -f tkc-tbs-with-additional-vdisks.yaml
$ kubectl-vsphere login --tanzu-kubernetes-cluster-name tbs --tanzu-kubernetes-cluster-namespace tadashi --server=<supervisor-control-plane-node-ip> --vsphere-username administrator@vsphere.local --insecure-skip-tls-verify
$ kubectl get nodes
NAME                                STATUS   ROLES    AGE     VERSION
tbs-control-plane-br8qc             Ready    master   4m33s   v1.18.15+vmware.1
tbs-workers-227hs-69cdcd8f8-jz2xt   Ready    <none>   115s    v1.18.15+vmware.1


TKC の設定

Harbor, TBS をTKC にデプロイするために、Pod Security Policy(PSP) を設定しておきます。

$ kubectl create clusterrolebinding default-tkg-admin-privileged-binding --clusterrole=psp:vmware-system-privileged --group=system:authenticated


Harbor のインストールは、Namespace harbor を利用するので作成しておきます。

$ kubectl get ns
NAME                           STATUS   AGE
default                        Active   5m8s
kube-node-lease                Active   5m10s
kube-public                    Active   5m10s
kube-system                    Active   5m10s
vmware-system-auth             Active   5m6s
vmware-system-cloud-provider   Active   4m58s
vmware-system-csi              Active   4m56s
$ kubectl create ns harbor

Let's Encrypt を用いた証明書発行

certbot をLaptop にインストールし、Let's Encrypt を用いて、証明書発行を出来るようにします。以下の手順で実行します。Let's Encrypt を利用した証明書発行に関しては、こちらの「Harbor + Route53 + Let’s Encrypt で作る証明書付きコンテナレジストリ」が非常に参考になります。

$ certbot --server https://acme-v02.api.letsencrypt.org/directory -d "harbor1.<MYDOMAIN>" --manual --preferred-challenges dns-01 certonly --work-dir /tmp/certbot/wd --config-dir /tmp/certbot/cfg --logs-dir /tmp/certbot/logs


証明書が発行されたら、TKC 上にsecret リソースを作成していきます。

$ kubectl create secret tls harbor-tls-secret -n harbor --cert=/tmp/certbot/cfg/live/harbor1.<MYDOMAIN>/fullchain.pem --key=/tmp/certbot/cfg/live/harbor1.<MYDOMAIN>/privkey.pem

$ kubectl create -n harbor secret docker-registry regsecret --docker-server=<embedded-harbor-ip> --docker-username=administrator@vsphere.local --docker-password='********'

$ kubectl patch sa default -n harbor -p '"imagePullSecrets": [{"name": "regsecret" }]'


helm の設定

事前にhelm は使える様にしておきます。

この記事ではbitnami chart を利用し、Harbor をインストールします。

$ ./helm repo add bitnami https://charts.bitnami.com/bitnami


bitnami repo にあるbitnami/harbor を利用して、デプロイします。
$ ./helm search repo bitnami
NAME                             	CHART VERSION	APP VERSION  	DESCRIPTION
...SNIP...
bitnami/contour                  	4.1.3        	1.12.0       	Contour Ingress controller for Kubernetes
bitnami/dataplatform-bp1         	0.2.0        	1.0.0        	OCTO Data platform Kafka-Spark-Solr ... 
bitnami/discourse                	2.3.1        	2.6.2        	A Helm chart for deploying Discourse ... 
bitnami/dokuwiki                 	11.1.1       	20200729.0.0 	DokuWiki is a standards-compliant ...
bitnami/drupal                   	10.2.3       	9.1.4        	One of the most versatile open source ...
bitnami/ejbca                    	2.2.1        	6.15.2-6     	Enterprise class PKI Certificate ...
bitnami/elasticsearch            	14.3.0       	7.10.2       	A highly scalable open-source ...
bitnami/etcd                     	5.6.1        	3.4.14       	etcd is a distributed key value store ...
bitnami/external-dns             	4.8.6        	0.7.6        	ExternalDNS is a Kubernetes addon ...
bitnami/fluentd                  	3.6.2        	1.12.1       	Fluentd is an open source data ...
bitnami/ghost                    	12.3.3       	3.41.9       	A simple, powerful publishing ...
bitnami/grafana                  	5.2.4        	7.4.3        	Grafana is an open source, feature ...
bitnami/grafana-operator         	0.6.0        	3.9.0        	Kubernetes Operator based on the ...
bitnami/harbor                   	9.6.1        	2.1.3        	Harbor is an an open source trusted ...
...SNIP...


Harbor インストール

事前にこちらを参考に、kbld, kapp, ytt をインストールしておきます。
bitnam/harbor で利用するイメージをvSphere with Tanzu のEmbedded Harbor にRelocate し、そのイメージを利用して、Harbor をインストールします。

$ ./helm template harbor bitnami/harbor -n harbor | kbld -f- --lock-output ./manifest.lock.harbor

$ kbld relocate -f ./manifest.lock.harbor --repository <embedded-harbor-ip>/tadashi/harbor --lock-output ./manifest.lock.copied.harbor
relocate | exporting 14 images...
relocate | will export index.docker.io/bitnami/chartmuseum@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-adapter-clair@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-adapter-trivy@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-clair@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-core@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-jobservice@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-notary-server@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-notary-signer@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-portal@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-registry@sha256 ...
relocate | will export index.docker.io/bitnami/harbor-registryctl@sha256 ...
relocate | will export index.docker.io/bitnami/nginx@sha256 ...
relocate | will export index.docker.io/bitnami/postgresql@sha256 ...
relocate | will export index.docker.io/bitnami/redis@sha256 ...
relocate | exported 14 images
relocate | importing 14 images...
...SNIP...


helm を用いて、Harbor をインストールする際のvaluesファイルを作成します。こちらの記事が参考になります。

$ cat << EOF >> harbor-values.yaml
harborAdminPassword: <harborpassword>

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

externalURL: harbor1.<mydomain>

portal:
  tls:
    existingSecret: harbor-tls-secret

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


Harbor をインストールします。

$ ./helm template harbor bitnami/harbor -n harbor -f harbor-values.yaml | kbld -f- -f ./manifest.lock.copied.harbor | kapp deploy -f- -a harbor -y -n harbor
...SNIP...
Namespace  Name                      Kind    Conds.  Age  Op      Op st.  Wait to    Rs  Ri
harbor     harbor                     Service                -       -    create  -       reconcile  -   -
^   harbor-chartmuseum                        Deployment             -       -    create  -       reconcile  -   -
^   harbor-chartmuseum                        PersistentVolumeClaim  -       -    create  -       reconcile  -   -
^   harbor-chartmuseum                        Service                -       -    create  -       reconcile  -   -
^   harbor-chartmuseum-envvars                ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-chartmuseum-secret                 Secret                 -       -    create  -       reconcile  -   -
^   harbor-clair                              Deployment             -       -    create  -       reconcile  -   -
^   harbor-clair                              Secret                 -       -    create  -       reconcile  -   -
^   harbor-clair                              Service                -       -    create  -       reconcile  -   -
^   harbor-core                               ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-core                               Deployment             -       -    create  -       reconcile  -   -
^   harbor-core                               Secret                 -       -    create  -       reconcile  -   -
^   harbor-core                               Service                -       -    create  -       reconcile  -   -
^   harbor-core-envvars                       ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-core-envvars                       Secret                 -       -    create  -       reconcile  -   -
^   harbor-jobservice                         ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-jobservice                         Deployment             -       -    create  -       reconcile  -   -
^   harbor-jobservice                         PersistentVolumeClaim  -       -    create  -       reconcile  -   -
^   harbor-jobservice                         Secret                 -       -    create  -       reconcile  -   -
^   harbor-jobservice                         Service                -       -    create  -       reconcile  -   -
^   harbor-jobservice-envvars                 ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-jobservice-envvars                 Secret                 -       -    create  -       reconcile  -   -
^   harbor-nginx                              ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-nginx                              Deployment             -       -    create  -       reconcile  -   -
^   harbor-notary-server                      Deployment             -       -    create  -       reconcile  -   -
^   harbor-notary-server                      Secret                 -       -    create  -       reconcile  -   -
^   harbor-notary-server                      Service                -       -    create  -       reconcile  -   -
^   harbor-notary-server-envvars              Secret                 -       -    create  -       reconcile  -   -
^   harbor-notary-signer                      Deployment             -       -    create  -       reconcile  -   -
^   harbor-notary-signer                      Service                -       -    create  -       reconcile  -   -
^   harbor-portal                             ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-portal                             Deployment             -       -    create  -       reconcile  -   -
^   harbor-portal                             Service                -       -    create  -       reconcile  -   -
^   harbor-postgresql                         Secret                 -       -    create  -       reconcile  -   -
^   harbor-postgresql                         Service                -       -    create  -       reconcile  -   -
^   harbor-postgresql                         StatefulSet            -       -    create  -       reconcile  -   -
^   harbor-postgresql-extended-configuration  ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-postgresql-headless                Service                -       -    create  -       reconcile  -   -
^   harbor-postgresql-init-scripts            ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-redis                              ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-redis-headless                     Service                -       -    create  -       reconcile  -   -
^   harbor-redis-health                       ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-redis-master                       Service                -       -    create  -       reconcile  -   -
^   harbor-redis-master                       StatefulSet            -       -    create  -       reconcile  -   -
^   harbor-redis-scripts                      ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-registry                           ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-registry                           Deployment             -       -    create  -       reconcile  -   -
^   harbor-registry                           PersistentVolumeClaim  -       -    create  -       reconcile  -   -
^   harbor-registry                           Secret                 -       -    create  -       reconcile  -   -
^   harbor-registry                           Service                -       -    create  -       reconcile  -   -
^   harbor-trivy                              Service                -       -    create  -       reconcile  -   -
^   harbor-trivy                              StatefulSet            -       -    create  -       reconcile  -   -
^   harbor-trivy-envvars                      ConfigMap              -       -    create  -       reconcile  -   -
^   harbor-trivy-envvars                      Secret                 -       -    create  -       reconcile  -   -

Op:      54 create, 0 delete, 0 update, 0 noop
Wait to: 54 reconcile, 0 delete, 0 noop
...
12:26:35AM: ok: reconcile deployment/harbor-clair (apps/v1) namespace: harbor
12:26:35AM: ---- applying complete [54/54 done] ----
12:26:35AM: ---- waiting complete [54/54 done] ----

Succeeded

$ kubectl get all -n harbor
NAME                                        READY   STATUS    RESTARTS   AGE
pod/harbor-chartmuseum-9f7cb964-ljczn       1/1     Running   0          2m43s
pod/harbor-clair-64f9c85fd6-c5v4f           2/2     Running   3          2m43s
pod/harbor-core-5895fc6df-pwspz             1/1     Running   0          2m46s
pod/harbor-jobservice-74c598cb76-kgqp8      1/1     Running   0          2m44s
pod/harbor-nginx-c5999ff66-6sbsh            1/1     Running   3          2m46s
pod/harbor-notary-server-5c4c66557-nstj4    1/1     Running   0          2m44s
pod/harbor-notary-signer-78b8cf475d-ppzdq   1/1     Running   0          2m46s
pod/harbor-portal-85bc4b5f68-n4q6x          1/1     Running   0          2m43s
pod/harbor-postgresql-0                     1/1     Running   0          2m43s
pod/harbor-redis-master-0                   1/1     Running   0          2m41s
pod/harbor-registry-f7c5fdf8c-ffrl8         2/2     Running   0          2m43s
pod/harbor-trivy-0                          1/1     Running   0          2m46s

NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)           AGE
service/harbor  LoadBalancer  10.99.38.0     xxx.xxx.xxx.xxx  80:30480/TCP,443:30944/TCP,4443:31141/TCP  2m47s
service/harbor-chartmuseum    ClusterIP  10.106.70.16   <none>    80/TCP                        2m44s
service/harbor-clair          ClusterIP  10.111.115.151 <none>    6060/TCP,6061/TCP,8080/TCP    2m45s
service/harbor-core           ClusterIP  10.105.93.143  <none>    80/TCP                        2m42s
service/harbor-jobservice     ClusterIP  10.99.202.158  <none>    80/TCP                        2m43s
service/harbor-notary-server  ClusterIP  10.111.76.184  <none>    4443/TCP                      2m45s
service/harbor-notary-signer  ClusterIP  10.106.151.148 <none>    7899/TCP                      2m45s
service/harbor-portal         ClusterIP  10.109.24.218  <none>    80/TCP                        2m45s
service/harbor-postgresql     ClusterIP  10.105.105.81  <none>    5432/TCP                      2m45s
service/harbor-postgresql-headless   ClusterIP   None    <none>    5432/TCP                      2m45s
service/harbor-redis-headless  ClusterIP  None           <none>    6379/TCP                      2m45s
service/harbor-redis-master    ClusterIP  10.104.43.197  <none>    6379/TCP                      2m45s
service/harbor-registry        ClusterIP  10.104.99.132  <none>    5000/TCP,8080/TCP             2m45s
service/harbor-trivy           ClusterIP  10.101.207.25  <none>    8080/TCP                      2m44s

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/harbor-chartmuseum     1/1     1            1           2m44s
deployment.apps/harbor-clair           1/1     1            1           2m44s
deployment.apps/harbor-core            1/1     1            1           2m47s
deployment.apps/harbor-jobservice      1/1     1            1           2m45s
deployment.apps/harbor-nginx           1/1     1            1           2m47s
deployment.apps/harbor-notary-server   1/1     1            1           2m45s
deployment.apps/harbor-notary-signer   1/1     1            1           2m47s
deployment.apps/harbor-portal          1/1     1            1           2m44s
deployment.apps/harbor-registry        1/1     1            1           2m44s

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/harbor-chartmuseum-9f7cb964       1         1         1       2m44s
replicaset.apps/harbor-clair-64f9c85fd6           1         1         1       2m44s
replicaset.apps/harbor-core-5895fc6df             1         1         1       2m47s
replicaset.apps/harbor-jobservice-74c598cb76      1         1         1       2m45s
replicaset.apps/harbor-nginx-c5999ff66            1         1         1       2m47s
replicaset.apps/harbor-notary-server-5c4c66557    1         1         1       2m45s
replicaset.apps/harbor-notary-signer-78b8cf475d   1         1         1       2m47s
replicaset.apps/harbor-portal-85bc4b5f68          1         1         1       2m44s
replicaset.apps/harbor-registry-f7c5fdf8c         1         1         1       2m44s

NAME                                   READY   AGE
statefulset.apps/harbor-postgresql     1/1     2m44s
statefulset.apps/harbor-redis-master   1/1     2m43s
statefulset.apps/harbor-trivy          1/1     2m47s


harbor サービスにアサインされた、ExternalIPharbor1.<MYDOMAIN>のAレコードでDNS登録します。

しばらくすると、証明書周りの警告等出ること無く、アクセス出来る様になっている事が確認出来ます。






docker コマンドでもHarbor UI 上で作成したユーザーとクレデンシャル情報でアクセス出来る事が確認出来ています。

$ docker login harbor1.<MYDOMAIN> -u devops@xxx.xxx

まとめ

TKC 上にLet's Encrypt の証明書を利用し、Harbor をhelm 経由でインストールする事が出来ました。この後は、このTKC 環境上にTBS をインストールしていきます。

このブログの人気の投稿