この記事はOCIアドベントカレンダーの24日目のエントリーです。
弊社メンバーが他にも記事を書いてくれているので、ぜひ併せてお楽しみください。
Argo CDとは
コンテナ利用時のオーケストレーションツールとして人気の高いKubernetes。
そんなプラットフォーム上で利用可能なエコシステムのなかで代表的なCI/CDツールの一つがArgo CDです。
Argo CDはGitOpsと呼ばれる、Gitで管理されたリポジトリーを中心として継続的な開発&デリバリーを実現するツールセットの一つです。名前のとおり、CD(デリバリー)に特化しているのでCIには別のツール(例:GitHub Actions)などを組み合わせる必要があります。
CI/CDは抽象的な概念のため、実際にツールを触ってみると格段に理解が深まります。
今回は最近エンプラ界隈で人気上昇中のOracle Cloudを利用してKubernetes環境を準備し、そこで実際にArgo CDを動かしてみることにします。
実際に使ってみた
Kubernetesクラスターの構築
OCIアカウントを作成し、OKEコンソールにアクセス。クラスターの作成を実行します。
クイック作成で進めます。
ワーカーノードのシェイプは VM.Standard.E4.Flex
を選択。
OCIも既にKubernetes 1.24がリリースされているんですね。
クラスターの構築はさすがに時間がかかるので、ガイドにもある通り、先にCloud Shellの設定を進めておきます。右上のターミナルアイコンからCloud Shellを起動。
先ほど構築したOKEクラスターの設定画面から、Cloud Shellアクセス用の create-kubeconfig
コマンドをコピペし実行。
試しに get nodes
が通ったら疎通成功です。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.0.10.118 Ready node 2m56s v1.24.1
10.0.10.53 Ready node 2m44s v1.24.1
10.0.10.64 Ready node 2m15s v1.24.1
Argo CDのインストール
CNCF系は公式のGetting Startedが充実しておりありがたいですね。これをみながら進めます。
また、詰まりそうなところはクラメソさんの記事も参照しました。AWSのEKS前提ですがほぼ同じです。
まず、以下のコマンドをCloud Shellで実行してOKEクラスター上にArgo CDをデプロイします。
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
次に、クライアントにArgo CD用のCLIをインストールします。
Cloud Shellだとsudoがうまく動かなかったため、手元のMacを利用しました。
% brew install argocd
完了後はバージョン確認をしておきます。
% argocd version
argocd: v2.5.5+fc3eaec.dirty
BuildDate: 2022-12-16T18:35:58Z
GitCommit: fc3eaec6f498ddbe49a5fa9d215a219191fba02f
GitTreeState: dirty
GoVersion: go1.19.4
Compiler: gc
Platform: darwin/arm64
FATA[0000] Argo CD server address unspecified
次にArgo CDサーバーへの接続を可能にするため、OKEクラスター上で設定変更を行います。
Cloud Shellから以下を実行します。
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
service/argocd-server patched
そしてArgo CDサーバーへのログイン用IPアドレス(External IP)と初期パスワードを確認しておきます。
$ kubectl get svc argocd-server -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-server LoadBalancer 10.96.218.35 ***.***.***.*** 80:31928/TCP,443:32240/TCP 21m
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
*******
試しにMacのChromeで上記IPにアクセスすると、Argo CDのログイン画面にアクセスできました!
先ほど控えたadminユーザーのパスワードでログインも成功。
Argo CDで実際にアプリケーションをデプロイしてみる
Getting StartedガイドにGUI版の操作手順も載せてくれているので、GUIを利用してみます。
New App
ボタンからサンプルアプリのリポジトリーを追加。
(ちなみにアプリ名を日本語で あいさつ帳
にしようとしたらエラーで怒られたので諦めました)
そして Sync
ボタンを押すだけでサンプルアプリをデプロイしてくれるようです。
その前に、Cloud Shell上でデプロイ前のdefault
ネームスペースの状況を確認しておきます。
$ kubectl get pods
No resources found in default namespace.
$ kubectl get deployments
No resources found in default namespace.
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP,12250/TCP 52m
そしてArgo CDのGUIで Sync
ボタンをクリック。
ステータスが Healthy / Synced
になったら、CLoud Shellで再度OKEの状況を確認します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
guestbook-ui-76f97c94c-vlrdn 1/1 Running 0 18s
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
guestbook-ui 1/1 1 1 27s
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
guestbook-ui ClusterIP 10.96.13.21 <none> 80/TCP 13s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP,12250/TCP 53m
guestbook-ui
なるアプリの各リソースがデプロイされていますね!
Argo CD上でアプリケーションをクリックすると、各リソースを視覚的に表示してくれます。
せっかくなのでサンプルアプリにブラウザからアクセスしてみましょう。
今のままだと guestbook-ui
サービスにExternal IPが付与されていないので、以下のコマンドをCloud Shellで実行してみます。
$ kubectl patch svc guestbook-ui -p '{"spec": {"type": "LoadBalancer"}}'
service/guestbook-ui patched
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
guestbook-ui LoadBalancer 10.96.13.21 ***.***.***.*** 80:32390/TCP 13m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP,12250/TCP 66m
出現した外部IPにブラウザーでアクセスしてみると、FancyなGuestbookが表示されました!
まとめ
CNCF系のエコシステムは、K8s環境さえあれば簡単にGetting Startedできるのがありがたいですね。
「Conteniuous Delivery」と聞くとなんだか難しそうですが、ようはGitリポジトリーとKubernetesクラスターを紐づけておいて、ワンプッシュでアプリケーションをデプロイできる便利なツールなんだな〜というのがよく分かったと思います。
Oracle Cloudは近年、急速な投資で3大メガクラウドを追いかけていますが、エンプラ色を出しつつもこういったクラウドネイティブな機能もしっかり揃えてくれているのはかなり好印象ですね。
K8s系のOSSはパブリッククラウド製品が変わってもそのまま通用するので、アプリケーション資源の移行性という観点だけでなくエンジニアのスキル観点でもポータビリティが上がりそうです。