---
title: TAP GUIをスケールアウトする際のworkaround
tags: ["Kubernetes", "TAP GUI", "Tanzu", "TAP", "ytt"]
categories: ["Dev", "CaaS", "Kubernetes", "TAP"]
date: 2022-12-20T09:04:22Z
updated: 2022-12-20T09:06:14Z
---

TAP 1.3からTAP GUIのスケールアウトがサポートされました。`tap-values.yaml`に次のようにreplicasを設定できます。

```yaml
tap_gui:
  deployment:
    replicas: 3
```

しかし、セッションはインスタンス間で共有されないため、
TAP GUIの認証を有効にしている場合、スケールアウトするとリクエストがラウンドロビンされ、
ログインが成功しても、ログインしていないインスタンスにルーティングされ、認証エラーが表示されることがあります。

TAP GUIがこの問題をfixするまでは、Contourの [Session Affinity](https://projectcontour.io/docs/v1.22.0/config/request-routing/#session-affinity) を利用して、同じログインユーザーが同じインスタンスにルーティングされるようにする必要があります。

TAP GUIのHTTPProxyに対してSession Affityを有効にするために次のoverlayを作成します。

```yaml
cat EOF > tap-gui-session-affinity.yaml
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"kind":"HTTPProxy","metadata":{"name":"tap-gui"}})
---
spec:
  routes:  
  #@overlay/match by=overlay.subset({"services": [{"name": "server"}]}) 
  - services: []
    #@overlay/match missing_ok=True
    loadBalancerPolicy:
      strategy: Cookie
EOF
```

overlayをSecretに登録します

```
kubectl -n tap-install create secret generic tap-gui-session-affinity \
  -o yaml \
  --dry-run=client \
  --from-file=tap-gui-session-affinity.yaml\
  | kubectl apply -f-
```

作成したoverlayのSecret名をtap-values.yamlのpackage_overlaysへ次のように設定します

```
package_overlays:
# ...
- name: tap-gui
  secrets:
  - name: tap-gui-session-affinity
  # ...
```

packageinstallを更新します

```
tanzu package installed update -n tap-install tap -f tap-values.yaml
```
