Harborをコピペでインストールする in TKG2.1

姉妹記事はこちら。[vSphere with TanzuのWorkload Cluster上にHarborを立てる](https://qiita.com/ipppppei/items/43c2257ded66a8244552)
姉妹記事はTKG1.6ベースで書いていて、Harborを立てる際にコピペしてよく使っていた。
今回はそれをTKG2.1向けにアップデートしたのがこのメモ。
細かいところで小さな差分はあるが、ほぼほぼ変わっていない。

※4/13訂正
古いtanzuコマンド(v0.25.4)で実施していたため、v2.1.0のtanzuコマンド(v0.28.0)向けに更新した。

## 前提
以下を前提とする。
- TKGのWorkload Clusterが構築済み(今回はStandalone版TKG2.1.0を利用）
- `type: LoadBalancer`が利用可能
- [Carvelツール](https://carvel.dev/#install)をインストール済み
- kubectl, yq, tanzuコマンドがインストール済み
- tanzu login実行済み

`type: LoadBalancer`はなくても進めることが可能だが、ここでは前提とした。

## 導入
### Tanzu Repositoryの導入
アップデートの検証をしたいので、TKG2.1.1ではなくTKG2.1.0でインストールする。
```sh
export TKG_VER=2.1.0
export TKG_REPO=projects.registry.vmware.com/tkg/packages/standard/repo:v${TKG_VER}
```
TanzuPackageのリポジトリを追加する。他のTanzuPackageをインストールしている人は省略可能。
```sh
tanzu package repository add tanzu-standard --url $TKG_REPO --namespace tkg-system
```

### cert-managerのインストール
利用可能なバージョンを確認する。(省略可能)
```sh
tanzu package available list cert-manager.tanzu.vmware.com -A
```
cert-managerをインストールする。package指定のオプション名が変わり、`--create-namespace`が使えなくなっている。
```sh
export NAMESPACE=my-packages
export CERT_MANAGER_VER='1.7.2+vmware.3-tkg.1'
kubectl create ns $NAMESPACE
tanzu package install cert-manager --package cert-manager.tanzu.vmware.com --namespace $NAMESPACE --version $CERT_MANAGER_VER
```

### Contourのインストール
利用可能なバージョンを確認する。(省略可能)
```sh
tanzu package available list contour.tanzu.vmware.com -A
```
Contourの設定ファイルを生成する。なお設定ファイルの出典元は[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.1/using-tkg-21/workload-packages-contour.html#deploy-contour-into-the-workload-cluster-2)。`type`を`LoadBalancer`に書き換えている。
```yaml
cat << EOF > ./contour-data-values.yaml
---
infrastructure_provider: vsphere
namespace: tanzu-system-ingress
contour:
 configFileContents: {}
 useProxyProtocol: false
 replicas: 2
 pspNames: "vmware-system-restricted"
 logLevel: info
envoy:
 service:
   type: LoadBalancer
   annotations: {}
   nodePorts:
     http: null
     https: null
   externalTrafficPolicy: Cluster
   disableWait: false
 hostPorts:
   enable: true
   http: 80
   https: 443
 hostNetwork: false
 terminationGracePeriodSeconds: 300
 logLevel: info
 pspNames: null
certificates:
 duration: 8760h
 renewBefore: 360h
EOF
```

Contourをインストールする。
```sh
export NAMESPACE=my-packages
export CONTOUR_VER=1.22.3+vmware.1-tkg.1
tanzu package install contour \
--package contour.tanzu.vmware.com \
--version $CONTOUR_VER \
--values-file contour-data-values.yaml \
--namespace $NAMESPACE
```

### Harborのインストール
利用可能なバージョンを確認する。(省略可能)
```sh
tanzu package available list harbor.tanzu.vmware.com -A
```
バージョンを環境変数に格納する。
```sh
export HARBOR_VER=2.6.3+vmware.1-tkg.1
```

carvelツールとyqがない場合はインストールする。
```sh
mkdir local-bin/
curl -L https://carvel.dev/install.sh | K14SIO_INSTALL_BIN_DIR=local-bin bash
export PATH=$PWD/local-bin/:$PATH
sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq
```

パスワードを自動で設定するスクリプトと設定ファイルをHarborのイメージから抜き出して実行し、設定ファイルを書き換える。なおこの際にバージョン内の"+"は"_"に置換すること。
```sh
imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v$(echo  $HARBOR_VER|sed "s/+/_/") -o /tmp/harbor
cp /tmp/harbor/config/values.yaml ./harbor-data-values.yaml 
bash /tmp/harbor/config/scripts/generate-passwords.sh ./harbor-data-values.yaml
```
ログインパスワードとドメインを設定する。
```sh
export HARBOR_PASSWORD=xxxx
export HARBOR_DOMAIN=harbor.10.151.199.248.sslip.io
sed -i "s/harborAdminPassword: .*/harborAdminPassword: ${HARBOR_PASSWORD}/g" harbor-data-values.yaml
sed -i "s/hostname: .*/hostname: ${HARBOR_DOMAIN}/g" harbor-data-values.yaml
```
コメントを削除する。
```sh
yq -i eval '... comments=""' harbor-data-values.yaml
```

作成したファイルを使ってインストールする。
```sh
export NAMESPACE=my-packages
tanzu package install harbor \
--package harbor.tanzu.vmware.com \
--version $HARBOR_VER \
--values-file harbor-data-values.yaml \
--namespace $NAMESPACE
```

## 動作確認
ドメインを/etc/hostsに入れて、ブラウザで確認する。
```sh
export HARBOR_DOMAIN=harbor.10.151.199.248.sslip.io
export ENVOY_IP=$(kubectl get svc -n tanzu-system-ingress envoy -o jsonpath={.status.loadBalancer.ingress[0].ip})
echo "$ENVOY_IP $HARBOR_DOMAIN" | sudo tee -a /etc/hosts 
```
ユーザ名は`admin`、パスワードは先程設定したパスワードを利用すれば、無事ログインできることが確認できる。