とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など
各種SNSのフォローもよろしくお願いいたします。

Argo CD API ServerをIngressを使って公開する(HTTP Ver)

概要

Argo CDはGitOpsツールの一つで、使いやすいGUIインターフェイスとCLIベースでGitOpsを実現できるツールです。 ブログでも何度か取り上げたことがあります。

最近の記事だと例えば...

devops-blog.virtualtech.jp

前回はNodePortを使ってサービスを公開しましたが、今回はArgo CDのWeb Interfaceへのアクセスをドメインで行う方法について取り上げます。

Argo CDはデフォルトではHTTPSアクセスを利用します。HTTPSベースでのアクセスを実現するには証明書が必要になります。 Kubernetesで証明書の取り扱いというと、SecretCert-managerを使った方法が思いつきます。 しかし、ちょっと試した感じでは手元ではまだうまく動かせていません。

というわけでそちらについてはいずれご紹介するとして、今回はHTTPベースでのアクセスを目標にしてみようと思います。

参考にしたサイト

最初に必要なこと

Ingressを使ってコンテナアプリケーションに対してドメインを割り当てるため、クラスターにはIngressが必要です。またArgo CDを動かすためにクラスターではRBACが有効になっている必要があります。今回の内容を試したい場合は、以下のようにmicrok8sを使って環境をサクッと用意できます。

sudo snap install microk8s --classic --channel=1.22/stable
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube
sudo snap alias microk8s.kubectl kubectl
microk8s.enable rbac dns ingress

2行目のコマンドで、microk8sにアドオンとして必要な機能をセットアップしています。コマンドは microk8s.enable でも microk8s enableでも構いません。

Kubernetesにはexternal-dnsという、KubernetesユーザがクラウドプロバイダのWebコンソールやCLIを使わずとも簡単にDNSレコードを作成・更新してサービスを公開するために利用できるコンポーネントがありますが、今回は手順を単純化するためにexternal-dnsは使っていません。

このガイドに従ってセットアップする場合は、事前にIngressで設定するドメインとIPアドレスの紐付けをおこなっておいてください。

Argo CDセットアップの流れ

Argo CDのデプロイは通常この方法を実行するだけです。

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

バージョンを指定してArgo CDをインストールする場合は

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.3.4/manifests/install.yaml

標準インストールの方法では、httpプロトコルでアクセスするとhttpsのURLにリダイレクトして表示されます。 今回はこのURLリダイレクトする動きをやめたいので、install.yamlの以下のあたりに--insecureフラグを追記します(v2.3.3時点)。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/name: argocd-server
    app.kubernetes.io/part-of: argocd
  name: argocd-server
spec:
  selector:
    ...
    spec:
      ...
      containers:
      - command:
        - argocd-server
        - --insecure        #追記部分

修正したマニフェストを使って、Argo CDをデプロイします。

kubectl create namespace argocd
kubectl apply -n argocd -f edit-install.yaml

これでクラスター上でArgo CDが動作します。

Argo CDサービスを公開する

KubernetesのデフォルトはサービスとしてClusterIPが設定されているため、そのままでは外部クライアントからアクセスできません。Argo CDのQuickstartには、3つの方法が掲載されています。

  • Port Forwarding
  • Service Type Load Balancer
  • Ingress

ここに含まれない方法として前回の記事で利用したService Type NodePortを使う方法もありますが、Port Forwardingと同様に実運用向きではありません。また、Type Load Balancerを使うには、クラスターが実行されている環境によっては簡単には利用できません(例えばオンプレK8sなど)。

というわけで今回は、Ingressを使ってArgo CDへのアクセスを許可してみようと思います。

Ingressマニフェストの作成

次のようなIngressマニフェストを作成しました。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: argocd
spec:
  rules:
    - host: argocd.example.org
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: argocd-server
                port:
                  number: 80

ドメイン部分については、事前にDNSサーバーに名前引きできるように設定しておいてください。 digコマンドで名前引きできることを確認したら、作成したIngressマニフェストを使ってIngressを作成します。

アドレスが127.0.0.1になっているのは今回は気にしないで大丈夫です。

kubectl apply -f http-ingress.yaml 
kubectl get -f http-ingress.yaml
NAME              CLASS    HOSTS                ADDRESS     PORTS   AGE
example-ingress   public   argocd.example.org   127.0.0.1   80      20m

デプロイ後、アクセス用のパスワードを確認します。

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

WebブラウザーでArgo CDのWebインターフェイスにアクセスしてみましょう。 ログイン用のアカウントはadmin、パスワードは前の手順で確認したコマンドで出力されるパスワードです。

ログインできました。

Quickstartの「Create An Application From A Git Repository」をやってみました。問題なくGitOpsを始められました。

とりあえず、HTTPベースながら、Argo CDのIngressを使ったアクセスができるようになりましたので、次はHTTPSでアクセスできるようにしたいと思います。それにはCent-managerの使いこなしと、Let's Encriptとの格闘が待っています。以前別の案件でCert-managerとLet's Encriptを触ったときは、うまく動かず逃亡することにしましたが、今回はどうでしょうか。また逃亡すことにならないよう根気よく頑張ってみたいと思います。