本記事はAP Tech Blog Week Vol.5のものになります。
はじめに
こんにちは、ACS事業部の小原です。
Kubernetes環境の管理やデプロイメントは、手動操作が多く、エラーのリスクも高いと感じていませんか?
今回は、そんな悩みを解決する1つの手段として、GitOpsツールであるArgo CDを用いた自動化について取り上げます。
Azure Kubernetes Service (AKS)環境と連携させてみたいと思います。
Argo CDを活用することで、インフラをコードとして管理し、Gitリポジトリの履歴から変更を追跡できるようになります。
- 一貫性と再現性のある環境構築
- 手動操作によるヒューマンエラーの削減
- 迅速かつ安全なデプロイ
- 変更履歴の可視化とロールバックの容易さ
を実現できます。
本記事のゴール
以下の理解が進むことをゴールとします。
- GitOps、Argo CDとは何か
- Argo CDの導入方法
- GitOpsを使うと何がうれしいのか
用語の説明
GitOps
- バージョン管理システムであるGitを使いインフラ管理を一元的に管理する方法
- DevOpsの手段のひとつ
Argo CD
- GitOpsを実現するためのツールの1つ
- Gitリポジトリ内のマニフェストと実際のクラスターの状態と比較し、差異があればクラスターへ反映する
構成
前提
すでにAKS環境が用意されアクセスできることを前提に進めます。
実践
Gitリポジトリを信頼できる情報源として、AKSクラスターの管理とデプロイを自動化していきたいと思います。
1. 事前準備(オプション)
asdfのインストール
私の環境では、バージョン管理ツールのasdfを準備することにします。
今後、異なるバージョンを使用したい場合に切り替えられるようにするためです。
こちらを参考にダウンロードとインストールを進めます。
asdf-vm.com
プラグインの追加
argocdプラグインをasdfに追加します。
$ asdf plugin add argocd
インストール
argocdの最新バージョンをインストールしてみます。
$ asdf install argocd latest
インストールしたバージョンを確認します。
$ asdf list argocd *2.12.4
今回はバージョン2.12.4を使っていきます。
グローバルの設定
利用したいバージョンを設定します。
$ asdf global argocd latest
2. Argo CDのインストール
公式ページの手順を参考に進めていきます。
ネームスペース作成
ネームスペースを作成することで、Kubernetesリソースを論理的に分離できます。
$ kubectl create namespace argocd
マニフェストファイルの適用
AKSクラスターにArgo CDをインストールします。
-fオプションで指定しているマニフェストファイルには、Argo CDのインストールに必要なリソースが定義されています。
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.12.4/manifests/install.yaml
Argo CD API サーバーへのアクセス
今回はLoadBalancerサービスタイプを使います。
※ローカル環境で構築の場合は、ポートフォワーディングが分かりやすいと思います。
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
パスワードの取得
初期パスワードを取得します。
Argo CDの管理画面にログインする際に使用します。
$ argocd admin initial-password -n argocd
ログイン
argocd-serverのEXTERNAL-IPを確認します。
$ kubectl get svc -n argocd
Argo CDにログインします。確認したEXTERNAL-IPをlogin
の後に指定します。
--insecure
オプションで証明書の検証をスキップします。
$ argocd login {IPアドレスまたはホスト名} --insecure
ブラウザからもアクセスしてみます。
ログイン情報を入力し管理画面に入ります。
3. Gitリポジトリからアプリケーション作成
リポジトリの用意
サンプルリポジトリををforkします。
https://github.com/argoproj/argocd-example-apps.git
アプリを作成
現在のネームスペースをargocd に設定します。
$ kubectl config set-context --current --namespace=argocd
サンプルのguestbookアプリケーションを作成します。
$ argocd app create guestbook --repo https://github.com/{fork先の指定に合わせる}/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
ブラウザの管理画面に戻ると、現時点ではステータスが以下のようになっています。
guestbookを選択すると以下の画面が開きます。
SYNCを選択します。
そのままSYNCHRONIZEを選択します。
以下のようにSyncが完了します。
先程のステータスも変わっていますね。
リソースの確認
リソースが作成されたことを確認します。
$ kubectl -n default get deploy,svc,rs,pod NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/guestbook-ui 1/1 1 1 6m14s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/guestbook-ui ClusterIP 10.0.255.229 <none> 80/TCP 6m15s service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 37m NAME DESIRED CURRENT READY AGE replicaset.apps/guestbook-ui-56c646849b 1 1 1 6m15s NAME READY STATUS RESTARTS AGE pod/guestbook-ui-56c646849b-v4b8h 1/1 Running 0 6m15s
4. マニフェストの変更と反映
Syncの自動化
--sync-policy automated
の設定により、自動的に変更を検知することもできます。
$ argocd app set guestbook --sync-policy automated
マニフェスト編集
argocd-example-apps/guestbookにあるguestbook-ui-deployment.yamlを編集します。
replicas
の値を1から2へ変更してみます。編集が終わったらcommitします。
apiVersion: apps/v1 kind: Deployment metadata: name: guestbook-ui spec: replicas: 2 # ここを変更 revisionHistoryLimit: 3 selector: (略)
変更が検出され、Podが2つになったことを確認できます。
CLIで確認してみます。
$ kubectl get po -n default NAME READY STATUS RESTARTS AGE guestbook-ui-56c646849b-mgnxm 1/1 Running 0 11m guestbook-ui-56c646849b-v4b8h 1/1 Running 0 25m
2つのPodがRunningステータスで動いていますね!
5. 片付け
- Argo CD APIサーバーへのアクセスで、ポートフォワーディングを使用している場合は停止する
- 必要に応じAKS環境を削除する
まとめ
何がうれしかったのか整理してみます。
- インフラをコードとして管理することで、一貫性と再現性を確保できた
- 手動操作を減らし、自動化されたプロセスでデプロイメントを行うため、エラーのリスクが低減した
- Gitリポジトリの履歴から、インフラの変更履歴を簡単に追跡したり、ロールバックができる
GitOpsでKubernetesの運用を効率化することができました。
AKSとの連携もスムーズに行えました。
Argo CDはGUIが備わっているのも視覚的でいいですね。たこさん(?)も可愛いですね。
実際の環境では、変更が反映される前に承認プロセスを挟むなど、環境にあわせて制御があるとよさそうです。 今後もGitOpsについて深堀りしていきたいと思います。
その他参考
Azure Kubernetes Service向けGitOps learn.microsoft.com
ACS事業部のご紹介
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。