こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
今回はArgo CDをmicrok8sベースのクラスタにデプロイし、NodePort経由でWebUIにアクセス出来る環境を構築していきたいと思います。
用語
Argo CDとは?
公式から引用します。
。。。正直わからんので追加で色々調べます。
Argo CDは、Kubernetesのための宣言型、GitOps継続的デリバリーツールです。
"Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes."
継続的デリバリーとは?
AWSから引用します。
継続的デリバリーとは、ソフトウェア開発手法の 1 つで、コード変更が発生すると、自動的に実稼働環境へのリリース準備が実行されるというものです。
GitOpsとは?
RedHatから引用します。
GitOps は、Git リポジトリを信頼できる唯一の情報源として使用し、インフラストラクチャをコードとして提供します。登録されたコードは CI プロセスをチェックし、CD プロセスではセキュリティやコードとしてのインフラストラクチャ (IaC、Infrastructure as Code)、またはアプリケーションフレームワークに設定される境界線に関する要件がチェックし、適用します。コードの変更はすべて追跡されるため、アップデートが容易になると同時に、ロールバックが必要な場合のバージョン管理も可能です。
つまりyamlか何かに修正が入り、それをgithubみたいなリポジトリに追加したらArgo CDがそれを検知してKubernetesクラスタに自動で反映してくれるってことでしょうか?
継続的デリバリーって完全にプログラマーとかフロント側の人間の思想だと思うんですけど、それをインフラ側に適用する思想がGitOpsで、それを実現するのがArgo CD?
アプリケーション側の技術思想をインフラ側に組み込もうとしているってことかな?
アプリケーションの継続的デリバリー(CI/CDと呼ばれるもののCD部分?)をイメージにすると恐らく下記のような状態で、開発者がコード(.htmlや.py等)の修正・更新をgithubにアップロード。Jenkinsがそれを発見すると本番環境サーバに自動デプロイ。
この時あくまでも本番環境サーバ上にあるアプリケーションに着目してデプロイしているだけであり、その下にあるサーバに関しては自動デプロイの対象外。なぜならIaCという発想が無くインフラのコード化はなされていなかったから。コード化されていないから継続的デリバリーなんて出来るわけがなかった。
IaCが促進しインフラがコード化されるようになると、上記のアプリケーションの継続デリバリーはアプリケーションの下であるサーバに対してもその思想が流用されるようになった。特にArgo CDはKubernetesに特化している。という事・・・?
うーん。。。一旦ここまで。
この辺りは用語は知っているけれど触ったことがない領域の為、なかなかに難しい。。。
構築に入ります。
構築
以下の公式サイトに構築手順が書かれているので、基本的にはこれをベースに進めます。
まずArgo CD用のnamespaceを作成し、yamlよりデプロイしていきます。
root@k8s-master:~# kubectl create namespace argocd
root@k8s-master:~# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
デプロイ後、何がデプロイされているかを確認します。
相当量デプロイされていることが分かります。これらの他にSecret等もデプロイされています。
root@k8s-master:~# kubectl get all -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-applicationset-controller-7c9cb6785d-fbd4k 1/1 Running 0 2m58s
pod/argocd-notifications-controller-f9d4457df-qfrn5 1/1 Running 0 2m58s
pod/argocd-repo-server-677867cd57-jnl5v 1/1 Running 0 2m57s
pod/argocd-redis-74cb89f466-h7cm9 1/1 Running 0 2m57s
pod/argocd-server-74cd6d578d-xvjk7 1/1 Running 0 2m57s
pod/argocd-application-controller-0 1/1 Running 0 2m56s
pod/argocd-dex-server-69dbdcbf7d-bnlr9 1/1 Running 0 2m58s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.152.183.140 <none> 7000/TCP,8080/TCP 2m59s
service/argocd-dex-server ClusterIP 10.152.183.91 <none> 5556/TCP,5557/TCP,5558/TCP 2m59s
service/argocd-metrics ClusterIP 10.152.183.188 <none> 8082/TCP 2m59s
service/argocd-notifications-controller-metrics ClusterIP 10.152.183.70 <none> 9001/TCP 2m59s
service/argocd-redis ClusterIP 10.152.183.59 <none> 6379/TCP 2m59s
service/argocd-repo-server ClusterIP 10.152.183.187 <none> 8081/TCP,8084/TCP 2m59s
service/argocd-server ClusterIP 10.152.183.122 <none> 80/TCP,443/TCP 2m59s
service/argocd-server-metrics ClusterIP 10.152.183.242 <none> 8083/TCP 2m59s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-applicationset-controller 1/1 1 1 2m58s
deployment.apps/argocd-notifications-controller 1/1 1 1 2m58s
deployment.apps/argocd-repo-server 1/1 1 1 2m58s
deployment.apps/argocd-redis 1/1 1 1 2m58s
deployment.apps/argocd-server 1/1 1 1 2m57s
deployment.apps/argocd-dex-server 1/1 1 1 2m58s
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-applicationset-controller-7c9cb6785d 1 1 1 2m58s
replicaset.apps/argocd-notifications-controller-f9d4457df 1 1 1 2m58s
replicaset.apps/argocd-repo-server-677867cd57 1 1 1 2m57s
replicaset.apps/argocd-redis-74cb89f466 1 1 1 2m58s
replicaset.apps/argocd-server-74cd6d578d 1 1 1 2m57s
replicaset.apps/argocd-dex-server-69dbdcbf7d 1 1 1 2m58s
NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 2m57s
次にargo cliをインストールします。
以下が公式サイトとなります。
私はubuntu22.04で構築しておりましたのでcurlベースでインストールしました。
root@k8s-master:~# curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
root@k8s-master:~# install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
root@k8s-master:~# rm argocd-linux-amd64
Argo CDの公式サイトにNodePortでWebUIに接続する為の設定手順が無い為、ここからはオリジナルになります。
argocd-serverという名前のDeploymentがWebUIを提供しているDeployment(≒pod)になるのでdry-runして、yamlを生成。NodePortを30800としてデプロイしました。
root@k8s-master:~# kubectl expose deployment argocd-server -n argocd --type=NodePort --dry-run=client -o yaml > kubernetes-argocd-nodeport.yaml
root@k8s-master:~# vi kubernetes-argocd-nodeport.yaml
root@k8s-master:~# kubectl apply -f kubernetes-argocd-nodeport.yaml
service/self-rgocd-server-nodeport created
apiVersion: v1
kind: Service
metadata:
name: self-rgocd-server-nodeport
namespace: argocd
spec:
ports:
- name: port-1
port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30800
selector:
app.kubernetes.io/name: argocd-server
type: NodePort
Argo CDのWebUIにログインする為にはパスワードが求められます。(ユーザはadminです。)
Secretに"argocd-initial-admin-secret"というものがあり、この中にbase64でエンコードされたパスワードが放り込まれています。デコードして取り出しましょう。その結果"BVMp1vVt-odnyL4b"がパスワードになることが分かりました。
root@k8s-master:~# kubectl get secret -n argocd
NAME TYPE DATA AGE
argocd-notifications-secret Opaque 0 30m
argocd-initial-admin-secret Opaque 1 29m
argocd-secret Opaque 5 30m
root@k8s-master:~# kubectl describe secret argocd-initial-admin-secret -n argocd
Name: argocd-initial-admin-secret
Namespace: argocd
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 16 bytes
root@k8s-master:~# kubectl get secret --namespace argocd argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 --decode ; echo
BVMp1vVt-odnyL4b
https://(サーバのIPアドレス):30800でWebブラウザを使いアクセスします。
以下のログイン画面が出力されるので、ユーザとパスワードを入力。