APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Kubernetes ServiceでのGitOps活用(Argo CDで試してみる)

本記事は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のインストール

公式ページの手順を参考に進めていきます。

argo-cd.readthedocs.io


ネームスペース作成
ネームスペースを作成することで、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などのクラウドネイティブ技術を活用した内製化のご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 小原 丈明
Azureをメインにインフラ系のご支援を担当しています。