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
$ ./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 サービスにアサインされた、ExternalIP
をharbor1.<MYDOMAIN>
のAレコードでDNS登録します。
しばらくすると、証明書周りの警告等出ること無く、アクセス出来る様になっている事が確認出来ます。
$ docker login harbor1.<MYDOMAIN> -u devops@xxx.xxx
まとめ
TKC 上にLet's Encrypt の証明書を利用し、Harbor をhelm 経由でインストールする事が出来ました。この後は、このTKC 環境上にTBS をインストールしていきます。
- リンクを取得
- ×
- メール
- 他のアプリ