ArgoCDのコンソールにALB経由でアクセスする定義をkustomizeでさっと作る

# はじめに

ArgoCDを導入しようと思い、[Getting Started](https://argo-cd.readthedocs.io/en/stable/getting_started/)を一通りこなして感触を確かめていました。このページではArgoCDのコンソールへのアクセス方法として、Port Forwardingしてlocalhostでアクセスするか、argocd-serverのservice typeを`LoadBalancer`に変更してLBのDNSを指定する方法が紹介されています。ただ、前者は実運用には辛いですし、後者はロードバランサーが自動的に生成されるまではよかったのですがCLBが起動（当方、AWS環境です）してきたので、このままだと使いづらいなと感じました。ALB経由でアクセスさせたく設定を入れていたのですが、変更する上でややハマりポイントがあったのでメモとして残します。

# デフォルト設定の確認

まず、ALBのターゲットに指定する情報を集めていきます。必要な情報はサービス名、待ち受けポート、ヘルスチェックパスです。[こちら](https://github.com/argoproj/argo-cd/blob/release-2.2/manifests/install.yaml#L2992-L3011)を確認すると、サービス名はargocd-server、待ち受けポートは80と443だとわかります。ALBでTLS終端させれば良いので、80をターゲットに指定することでアクセスできそうです。ヘルスチェックのエンドポイントには[/healthz](https://github.com/argoproj/argo-cd/blob/release-2.2/manifests/install.yaml#L3547-L3550)を指せば良さそうです。

図示すると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/b0dc55a1-0541-0534-4bd7-bfc2d078c7a1.png)


# ingressの作成
上記の情報を踏まえて以下のingressのマニフェストを作成しました。
　（前提として[aws-load-balancer-controller](https://github.com/kubernetes-sigs/aws-load-balancer-controller)は導入済みです）

```ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/backend-protocol-version: HTTP1
    alb.ingress.kubernetes.io/healthcheck-path: /healthz
    alb.ingress.kubernetes.io/success-codes: '200'
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/inbound-cidrs: xx.xx.xx.xx/32
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:region:000000000000:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  name: argocd
  namespace: argocd
spec:
  rules:
  - host: argocd.hogehoge.com
    http:
      paths:
      - path:
        pathType: ImplementationSpecific
        backend:
          service:
            name: argocd-server
            port:
              number: 80
  tls:
  - hosts:
    - argocd.hogehoge.com
```

こちらを適用することでALBが作られたのですが、https://argocd.hogehoge.com/ にアクセスしても、なぜかページが表示されません。

# ヘルスチェックの失敗

AWSコンソールを見てみると、ALBからターゲットへのヘルスチェックに失敗していることがわかりました。
![healthcheck_fail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316261/98413115-58aa-9771-608e-9a7c2c02320e.png)

調べたところ、[このページ](https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress)に答えがありました。これによるとargocd-serverでTLS終端をさせない場合は`--insecure`オプションをつけるとあります。確かに[install.yml](https://github.com/argoproj/argo-cd/blob/release-2.2/manifests/install.yaml#L3382-L3383)を見ると、何もオプションがついていないことがわかります。
ちなみにargocd-serverのオプション一覧は[こちら](https://argo-cd.readthedocs.io/en/stable/operator-manual/server-commands/argocd-server/)にあります。

当該環境ではkustomizeを使っていたので、`--insecure`オプションをつけるためにinstall.ymlにpatchを充てる形で対応しました。次のようなymlファイルを作成します。

```install-patch.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-server
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-server
  template:
    spec:
      containers:
      - command:
        - argocd-server
        - --insecure
        name: argocd-server
```

kustomization.ymlには次の内容を記載します。 

```kustomization.yml
namespace: argocd
resources:
  - https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
  - ingress.yml
patches:
  - install-patch.yml
```

こちらを適用することでヘルスチェックも通り、ALB経由でのArgoCDのコンソールアクセスが可能になりました。

#さいごに

同じポイントではまっている先人が多く、この記事と同じような内容の記事が数多く見られたので公開するか迷ったのですが、kustomizeを使った解決のアプローチがなかったので備忘も兼ねて残しておきました。同じツールセットを使っている方で同事象にハマった方の解決までの時間を数分でも短縮できると幸いです。