---
title: Tanzu Kubernetes Grid ExtensionsのHarborをTKG on vSphereにインストールする場合に発生する問題のworkaroundをyttで設定するメモ
tags: ["Kubernetes", "TKG", "Tanzu", "TKG Extensions", "Harbor", "Grafana", "ytt"]
categories: ["Dev", "CaaS", "Kubernetes", "TKG", "Extensions", "Harbor"]
date: 2021-02-20T15:07:34Z
updated: 2021-03-29T06:45:01Z
---

> TKG 1.3では対応不要です。

[TKG ExtensionsのHarbor](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-extensions-harbor-registry.html)をTKG on vSphereにインストールする場合、
環境によってはうまく動作しません。例えば

* 認証は成功する(`docker login`はできる)HarborのUIで画面遷移しない(実はBackendのRedisでfile openに失敗しているため)
* TrivyがPodが起動しない

など。HarborだけでなくGrafanaも起動しません。

回避方法は[TKG 1.2.1のKnown Issue](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2.1/rn/VMware-Tanzu-Kubernetes-Grid-121-Release-Notes.html#TKG-3153)に書かれている通り、
`vsphere-csi-controller` Deploymentの`csi-provisioner`コンテナの`args`に`--default-fstype=ext4`を付ければ良いです。

既に作成されたクラスタに対しては

```
kubectl patch deployment -n kube-system vsphere-csi-controller --type=json -p='[{"op": "add", "path": "/spec/template/spec/containers/4/args/-", "value": "--default-fstype=ext4"}]'
kubectl delete pod -n kube-system -l app=vsphere-csi-controller
```

を行えば良いです。

新規作成のクラスタに関しては、`~/.tkg`以下のmanifestを修正すれば良いです。Know Issueのドキュメントには`csi.lib.yaml`を直接編集するように書いてありますが、
このファイルは編集しない方が良いです。`~/.tkg`以下のカスタマイズは `~/.tkg/providers/infrastructure-vsphere/ytt/vsphere-overlay.yaml`にytt overlayのOverlayファイルを書くのがベターです。

今回の変更内容に対するoverlayは少し複雑ですが、次の内容で適用できます

```yaml
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:yaml", "yaml")

#@ def csi_controller_config():
spec:
  template:
    spec:
      containers:
      #@overlay/match by="name"
      - name: csi-provisioner
        args:
        #@overlay/match by=overlay.index(2)
        #@overlay/insert after=True
        - --default-fstype=ext4
#@ end
#@ csi_controller = lambda i,left,right: left["metadata"]["name"].endswith("-vsphere-csi-controller")
#@ configmap = overlay.subset({"kind": "ConfigMap"})
#@overlay/match by=overlay.and_op(configmap, csi_controller), expects="1+"
---
data:
  #@overlay/replace via=lambda a,_: yaml.encode(overlay.apply(yaml.decode(a), csi_controller_config()))
  data:
```
