---
title: Tanzu Community Editionのk8sクラスタにHarborをインストールするメモ
tags: ["Kubernetes", "vSphere", "TKG", "Tanzu", "Cluster API", "Harbor", "TCE", "Docker"]
categories: ["Dev", "CaaS", "Kubernetes", "TKG", "TCE", "Docker"]
date: 2021-12-10T13:29:10Z
updated: 2021-12-11T13:25:52Z
---

> [TUNA-JP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/tuna-jp) その2の10日目のエントリです。

"[Tanzu Community EditionをDocker上にインストールするメモ](/entries/670)" で構築したクラスタにHarborをインストールします。
依存PackageとしてCert ManagerとContourもインストールします。

以下はLinux上にインストールした環境で検証しています。

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

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

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

https://tanzucommunityedition.io/docs/latest/package-readme-cert-manager-1.5.3/
の通り。

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

```
tanzu package install cert-manager --package-name cert-manager.community.tanzu.vmware.com --version 1.5.3 --namespace tce-package-install
```

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

https://tanzucommunityedition.io/docs/latest/package-readme-contour-1.18.1/
の通り。

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

```
tanzu package install contour --package-name contour.community.tanzu.vmware.com --version 1.18.1 --namespace tce-package-install
```

今回はMetal LBがインストールされている環境にインストールしたので、EnvoyにはExternal IPが振られています。

```
$ kubectl get svc -n projectcontour 
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
contour   ClusterIP      100.71.19.88    <none>         8001/TCP                     42m
envoy     LoadBalancer   100.69.53.186   172.18.0.200   80:31910/TCP,443:31811/TCP   42m
```

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

https://tanzucommunityedition.io/docs/latest/package-readme-harbor-2.2.3/
の通り。

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

```
IMAGE_URL=$(kubectl get packages harbor.community.tanzu.vmware.com.2.2.3 -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 projectcontour 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.community.tanzu.vmware.com --version 2.2.3 --namespace tce-package-install --values-file harbor-values.yaml
```

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

```
$ kubectl get httpproxy -n harbor 
NAME                      FQDN                                  TLS SECRET   STATUS   STATUS DESCRIPTION
harbor-httpproxy          harbor-172-18-0-200.sslip.io          harbor-tls   valid    Valid HTTPProxy
harbor-httpproxy-notary   notary.harbor-172-18-0-200.sslip.io   harbor-tls   valid    Valid HTTPProxy
```

### Harborにアクセス

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

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

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

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

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

> Macの場合は次のコマンドを実行した後、**Dockerを再起動する**必要があります。TCE on 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/145577615-bf95722b-6043-43ed-8226-23cb00f045b1.png)

---

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