---
title: Tanzu Kubernetes Grid 1.4のk8sクラスタにHarborをインストールするメモ
tags: ["Kubernetes", "vSphere", "TKG", "Tanzu", "Cluster API", "Harbor"]
categories: ["Dev", "CaaS", "Kubernetes", "TKG"]
date: 2021-12-11T03:35:47Z
updated: 2021-12-11T13:25:38Z
---

> [TUNA-JP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/tuna-jp) その2の11日目のエントリです。<br>
> TCEじゃなくてTKGの内容ですが、TCEとTKGのちょっとした違いを知るという意味で良いよね？

基本的には以下のドキュメントの通りです。

https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.4/vmware-tanzu-kubernetes-grid-14/GUID-packages-harbor-registry.html

なお、Tanzu Community Editionの場合のインストール方法は [こちらの記事](/entries/674) を参照してください。

**目次**
<!-- toc -->

ここではTKGに付属するパッケージを `tkg-package-install` namespaceにインストールします。
`tkg-package-install` namespaceを作成します。

```
kubectl create ns tkg-package-install
```

### Cert Manager Packageのインストール

次のコマンドでCert Managerをインストールします。

```
tanzu package install cert-manager --package-name cert-manager.tanzu.vmware.com --version 1.1.0+vmware.1-tkg.2 --namespace tkg-package-install
```

### Contour Packageのインストール

今回はtype=LoadBalancerなServiceが利用できる環境を使用します。

次のコマンドでContourをインストールします。

```
cat <<EOF > contour-data-values.yaml
---
infrastructure_provider: "vsphere"
envoy:
  service:
    type: LoadBalancer
EOF
tanzu package install contour --package-name contour.tanzu.vmware.com --version 1.17.1+vmware.1-tkg.1 --namespace tkg-package-install -f contour-data-values.yaml
```

EnvoyにはExternal IPが振られています。

```
$ kubectl get svc -n tanzu-system-ingress
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
contour   ClusterIP      100.69.225.48   <none>          8001/TCP                     52s
envoy     LoadBalancer   100.65.46.194   10.213.232.22   80:31819/TCP,443:30648/TCP   52s
```

### Harbor Packageのインストール

設定項目を変更するために、次のコマンドでHarbor Packageの[imgpkgBundle](https://carvel.dev/imgpkg/docs/latest/)をダウンロードします。

```
IMAGE_URL=$(kubectl get package harbor.tanzu.vmware.com.2.2.3+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
imgpkg pull -b ${IMAGE_URL} -o /tmp/harbor
```

設定項目を定義する`values.yaml`をコピーし、パスワードなどを自動生成します。

```
cp /tmp/harbor/config/values.yaml harbor-values.yaml
/tmp/harbor/config/scripts/generate-passwords.sh harbor-values.yaml 
```

Harborのホスト名を決めます。ここではsslip.ioを利用します。

```
ENVOY_IP=$(kubectl get svc -n tanzu-system-ingress envoy -ojsonpath='{.status.loadBalancer.ingress[0].ip}')
HARBOR_HOST=harbor-$(echo ${ENVOY_IP} | sed 's/\./-/g').sslip.io
```

> `a-b-c-d.sslip.io`も`harbor-a-b-c-d.sslip.io`も`a.b.c.d`に解決されます。

このホスト名を`harbor-values.yaml`に設定します。

```
sed -i."" "s/harbor\.yourdomain\.com/${HARBOR_HOST}/g" harbor-values.yaml
```

先頭の2行を削除します。

```
sed -i."" '1,2d' harbor-values.yaml
```

この`harbor-values.yaml`を使ってHarborをインストールします。

```
tanzu package install harbor --package-name harbor.tanzu.vmware.com --version 2.2.3+vmware.1-tkg.1 --namespace tkg-package-install --values-file harbor-values.yaml
```

インストールが完了しても、TKG 1.4.0の段階では配布されているnotaryのイメージにバグがあり、次のようにharbor-notary-signerが`CrashLoopBackOff`状態になります。

```
$ kubectl get pod -n tanzu-system-registry 
NAME                                    READY   STATUS             RESTARTS   AGE
harbor-core-6884d769f8-cz9s2            1/1     Running            2          4m18s
harbor-database-0                       1/1     Running            0          4m17s
harbor-jobservice-6f7b69dd85-fr9w5      1/1     Running            0          4m17s
harbor-notary-server-6785fcff9-2z98f    1/1     Running            0          4m16s
harbor-notary-signer-74ff959f9b-b7zdz   0/1     CrashLoopBackOff   5          4m16s
harbor-portal-8688f8fd6f-7zk7g          1/1     Running            0          4m15s
harbor-redis-0                          1/1     Running            0          4m15s
harbor-registry-85c9b4bff-kdt6t         2/2     Running            0          4m15s
harbor-trivy-0                          1/1     Running            0          4m15s
```

Workaroundは以下のKBに記載されています。

https://kb.vmware.com/s/article/85725

パッチを充てるため、次のytt overlayファイルを作成します。

```yaml
cat <<EOF > overlay-notary-signer-image-fix.yaml
#@ load("@ytt:overlay", "overlay")

#@overlay/match by=overlay.and_op(overlay.subset({"kind": "Deployment"}), overlay.subset({"metadata": {"name": "harbor-notary-signer"}}))
---
spec:
  template:
    spec:
      containers:
      #@overlay/match by="name",expects="0+"
      - name: notary-signer
        image: projects.registry.vmware.com/tkg/harbor/notary-signer-photon@sha256:4dfbf3777c26c615acfb466b98033c0406766692e9c32f3bb08873a0295e24d1
EOF
```

overlayファイルを次のコマンドで適用します。

```
kubectl -n tkg-package-install create secret generic harbor-notary-singer-image-overlay \
-o yaml \
--dry-run=client \
--from-file=overlay-notary-signer-image-fix.yaml \
| kubectl apply -f-
kubectl -n tkg-package-install annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=harbor-notary-singer-image-overlay --overwrite=true
```

harbor-notary-signerが`Running`状態になることを確認してください。

```
$ kubectl get pod -n tanzu-system-registry  
NAME                                    READY   STATUS    RESTARTS   AGE
harbor-core-6884d769f8-cz9s2            1/1     Running   2          9h
harbor-database-0                       1/1     Running   0          9h
harbor-jobservice-6f7b69dd85-fr9w5      1/1     Running   0          9h
harbor-notary-server-6785fcff9-2z98f    1/1     Running   0          9h
harbor-notary-signer-7d5856c46b-p5vl7   1/1     Running   0          49s
harbor-portal-8688f8fd6f-7zk7g          1/1     Running   0          9h
harbor-redis-0                          1/1     Running   0          9h
harbor-registry-85c9b4bff-kdt6t         2/2     Running   0          9h
harbor-trivy-0                          1/1     Running   0          9h
```

インストールが完了し、次のHTTPProxyリソースができていることを確認します。

```
$ kubectl get httpproxy -n tanzu-system-registry 
NAME                      FQDN                                   TLS SECRET   STATUS   STATUS DESCRIPTION
harbor-httpproxy          harbor-10-213-232-22.sslip.io          harbor-tls   valid    Valid HTTPProxy
harbor-httpproxy-notary   notary.harbor-10-213-232-22.sslip.io   harbor-tls   valid    Valid HTTPProxy
```


### Harborにアクセス

次のコマンドでHarborのCA証明書をダウンロードします。

```
kubectl get secret -n tanzu-system-registry harbor-tls --template '{{index .data "ca.crt" | base64decode}}' > ca.crt
```

次のコマンドでも取得できます。
```
curl -sk https://${HARBOR_HOST}/api/v2.0/systeminfo/getcert  > ca.crt
```

Linuxの場合、このCA証明書をDockerが信頼できるように次のフォルダに移動します。

```
sudo mkdir -p /etc/docker/certs.d/${HARBOR_HOST}
sudo mv ca.crt /etc/docker/certs.d/${HARBOR_HOST}
```

Macの場合は次のコマンドを実行した後、**Dockerを再起動する**必要があります。
```
# https://blog.container-solutions.com/adding-self-signed-registry-certs-docker-mac
sudo security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain ca.crt
```

生成されたHarborのパスワードを取得し、ログインします。

```
HARBOR_PASSWORD=$(grep harborAdminPassword harbor-values.yaml  | awk '{print $2}')
docker login ${HARBOR_HOST} -u admin -p ${HARBOR_PASSWORD}
```

> `Error response from daemon: Get "https://${HARBOR_HOST}/v2/": x509: certificate signed by unknown authority`がでたら、CA証明書を信頼する設定が間違っています。

ログインできたら、Dockerイメージをpushします。

```
docker pull gcr.io/google-samples/hello-app:1.0
docker tag gcr.io/google-samples/hello-app:1.0 ${HARBOR_HOST}/library/hello-app:1.0
docker push ${HARBOR_HOST}/library/hello-app:1.0
```

Webブラウザからも確認できます。

![image](https://user-images.githubusercontent.com/106908/145662100-1a3f66f0-ba67-4b3d-b753-fcfa2243a617.png)

---

[次](/entries/675)は自己署名証明を使用したHarborにTanzu Kubernetes Clusterからアクセスする方法を紹介します。
