ようこそ、インフラストラクチャの深淵へ。
「デプロイ作業のたびに、誰かが手動で `kubectl apply` を叩き、その結果を祈るように見守る……」
もしあなたがそんな日々に少しでも疲れを感じているなら、今日この場所でその苦労を終わりにしましょう。
私はこれまで、数えきれないほどのシステム崩壊と、それを救うための自動化の歴史を見てきました。その結論として断言できるのは、Kubernetes(k8s)運用の完成形の一つは「GitOps」であり、その心臓となるのが「ArgoCD」であるということです。
この記事では、初心者の方でも迷わずに、しかし現場で即戦力として通用する「本質的なGitOps」の第一歩を伝授します。これをマスターすれば、あなたの運用は「作業」から「管理」へと劇的に進化しますよ。
—
1. なぜ「GitOps」なのか? 従来のCI/CDとの決定的な違い
まずは、なぜ私たちがGitOpsを熱烈に支持するのか、その理由をお話しします。
従来のCI/CD(Push型)
これまでのデプロイは、JenkinsやGitHub ActionsなどのCIツールが「外から」k8sクラスターに対して「これを反映しろ!」と命令を送り込むスタイルでした。
- 課題: クラスター側で誰かが手動で設定を変えても、CIツールはそれを検知できません。これが「構成のドリフト(乖離)」です。
GitOps(Pull型 / ArgoCDのスタイル)
GitOpsでは、Gitリポジトリが「正解(Single Source of Truth)」になります。ArgoCDはクラスター内部から常にGitを監視し、Gitの状態とクラスターの状態がズレていたら、自動的にクラスター側をGitに合わせます。
- メリット:
- 冪等性の担保: 何度実行しても、必ずGitに書かれた状態になる。
- 自己修復: 手動で壊された設定も、ArgoCDが即座に元に戻す。
- 透明性: 「今、何が動いているか」はGitのコミットログを見れば一目瞭然。
—
2. ArgoCDのインストール:クラスターに「意思」を持たせる
それでは、実際にArgoCDをインストールしてみましょう。ArgoCD自体もk8s上のアプリケーションとして動作します。
インストールコマンド
まずは専用のNamespaceを作成し、公式のマニフェストを適用します。
名前空間の作成
kubectl create namespace argocd
ArgoCDのインストール(非高可用性版:学習・開発向け)
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
UIへのアクセス
ArgoCDには強力なWeb UIが備わっています。これを見るだけで、k8sの複雑なリソース構造が視覚的に理解できるようになります。
サービスをローカルにポートフォワードしてブラウザで開く
kubectl port-forward svc/argocd-server -n argocd 8080:443
ブラウザで `https://localhost:8080` を開いてください。
- User: `admin`
- Password: 初期パスワードは以下のコマンドで取得します。
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=”{.data.password}” | base64 -d; echo
—
3. Gitリポジトリと同期する:最初の「Application」作成
ここからが本番です。Gitリポジトリにあるマニフェストを、ArgoCDに管理させてみましょう。
ArgoCDでは、何を・どこに・どうやって同期するかを定義する `Application` という独自リソースを使います。これもコード(YAML)で管理するのがプロの流儀です。
サンプルマニフェスト(`application.yaml`)
以下のファイルをローカルで作成し、`kubectl apply` してみてください。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook-app
namespace: argocd
spec:
project: default
source:
# 監視対象のGitリポジトリ(ArgoCD公式のサンプル)
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
path: guestbook # リポジトリ内のディレクトリパス
destination:
# デプロイ先のクラスターとNamespace
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
# 同期戦略の設定
automated:
prune: true # Gitから消えたらクラスターからも消す
selfHeal: true # 手動変更されたらGitの状態に強制的に戻す
このファイルを適用した瞬間、ArgoCDがGitを読み取り、必要なDeploymentやServiceを自動的に生成し始めます。
—
4. 現場で震えるほど役立つ:可視化とロールバックの極意
ArgoCDのUIを開くと、先ほど作成した `guestbook-app` が表示されているはずです。ここには、熟練のエンジニアをも唸らせる「現場の知見」が詰まっています。
① 依存関係の可視化
UI上のタイルをクリックすると、DeploymentがどのReplicaSetを作り、それがどのPodを起動しているかがツリー状に表示されます。
「Podが起動しない!」という時、それが設定ミス(ConfigMap)なのか、権限不足(ServiceAccount)なのかが、アイコンの色(緑=正常、黄=進行中、赤=異常)で直感的にわかります。
② 「Diff」で差分を検知する
Gitの内容を書き換えてプッシュしてみてください。ArgoCDは数秒以内に「OutOfSync(未同期)」を検知します。
UIの「App Diff」ボタンを押せば、「現在のクラスターの状態」と「Gitにあるべき姿」の差分が `diff` 形式で表示されます。 これこそが、不透明なデプロイ作業を「科学」に変える瞬間です。
③ 究極のロールバック
もしデプロイした内容にバグがあったら?
1. GitOpsの正攻法: `git revert` をしてプッシュする。ArgoCDがそれを検知して旧バージョンに戻します。
2. 緊急避難: UI上の「History and Rollback」から過去の同期ポイントを選んで戻すことも可能です(ただし、Gitと不整合が起きるため、あくまで一時的な処置と心得てください)。
—
最後に:あなたへ贈る言葉
おめでとうございます。これであなたは、単にコマンドを叩く作業者から、「システムの正解をGitで定義し、自動化された機構にその維持を任せる」という、SRE(Site Reliability Engineering)の入り口に立ちました。
GitOpsを導入すると、夜中に「誰が何を変えたんだ?」とパニックになることがなくなります。すべての変更はGitに刻まれ、ArgoCDが忠実にそれを守り続けるからです。
「これをマスターすれば、毎日の作業が劇的に楽になりますよ」
最初は難しく感じるかもしれませんが、まずは自分の手元で小さなアプリを同期させることから始めてみてください。その積み重ねが、止まらない、壊れない、そして人間に優しいインフラを作り上げる唯一の道なのです。
次は、HelmやKustomizeを組み合わせた、より高度な構成管理の世界でお会いしましょう。応援しています。