概要
Argo CDはGitOpsツールの一つで、使いやすいGUIインターフェイスとCLIベースでGitOpsを実現できるツールです。 ブログでも何度か取り上げたことがあります。
最近の記事だと例えば...
前回はNodePortを使ってサービスを公開しましたが、今回はArgo CDのWeb Interfaceへのアクセスをドメインで行う方法について取り上げます。
Argo CDはデフォルトではHTTPSアクセスを利用します。HTTPSベースでのアクセスを実現するには証明書が必要になります。 Kubernetesで証明書の取り扱いというと、SecretとCert-managerを使った方法が思いつきます。 しかし、ちょっと試した感じでは手元ではまだうまく動かせていません。
というわけでそちらについてはいずれご紹介するとして、今回はHTTPベースでのアクセスを目標にしてみようと思います。
参考にしたサイト
- https://argo-cd.readthedocs.io/en/stable/getting_started/
- https://dev.classmethod.jp/articles/eks-argocd-getting-started/
最初に必要なこと
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を触ったときは、うまく動かず逃亡することにしましたが、今回はどうでしょうか。また逃亡すことにならないよう根気よく頑張ってみたいと思います。