kind + Kustomization + Argo CDのローカル環境を作成する

はじめに

kubernetesを使用するにあたって色々なツールを学ぶ必要があると思っています

今回はCD toolとして名前の挙がるArgo CDを触ってみようと思います

対象

  • kubernetesを触ってみたいが何をしていいのかわからない人
  • Argo CDを初めて触る人

目標

前提

  • dockerをPCにインストールしている
  • kind, kustomizeをローカルで使用できる

前準備

kindでclusterを作成する

$ kind create cluster --name argocd
Creating cluster "argocd" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-argocd"
You can now use your cluster with:

kubectl cluster-info --context kind-argocd

Have a nice day! 👋

contextを確認する

alias k=kubectlとしてエイリアスを付けています

$ k config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
*         kind-argocd      kind-argocd      kind-argocd

ディレクトリを作成する

今回は以下のようにディレクトリを作成します

 $ tree
.
└── manifests
    ├── apps
    └── argocd
        ├── base
        └── overlays
            ├── development
            │   └── apps
            ├── production
            └── staging

トップのディレクトリからmanifestsを作成したのは、以下のようにIaCで定義したリソースも同一リポジトリで管理できるように考慮したためです

.
├── cdk
├── manifests
└── terraform

ちなみに今回は使用しませんがmanifests/appsは各マイクロサービスのリソースを定義する場所を想定しています

.
└── manifests
    └── apps
        └── hoge-api
            └── deployment.yaml

Argo CDをインストール

Getting Startedではコマンドを入力するようにしていますが、今回はyamlの定義を書いてapplyします

namespaceの追加

manifests/argocd/base/namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: argocd
spec: {}
status: {}

kustomization yamlの追加

manifests/argocd/base/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
- ./namespace.yaml
patchesStrategicMerge:

manifests/argocd/overlays/development/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
- ../../base/namespace.yaml
- github.com/argoproj/argo-cd/manifests/cluster-install?ref=v2.0.5
patchesStrategicMerge:

ディレクトリ確認

現在のディレクトリとファイルは以下のようになっているはずです

.
└── manifests
    ├── apps
    └── argocd
        ├── base
        │   ├── kustomization.yaml
        │   └── namespace.yaml
        └── overlays
            ├── development
            │   ├── apps
            │   └── kustomization.yaml
            ├── production
            └── staging

applyを実行してArgo CDをインストールする

$ kustomize build manifests/argocd/overlays/development/ | k apply -f -

リソースの確認

$ k get all -n argocd

Argo CDにログインする

ブラウザでアクセスする

port forwardingでブラウザからアクセスできるようにします

k port-forward svc/argocd-server -n argocd 8080:443

ブラウザから http://localhost:8080 にアクセスしてみましょう

パスワードを取得する

 $ k -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

以下の情報でログインする

Username: admin
Password: <先ほど取得したパスワード>

f:id:kntks:20210818170139p:plain

guest bookのAppを作成する

Creating Apps Via UIでもAppを作成することができますが、ここもyamlで定義を書いてapplyしようと思います

yamlの定義

ここからyamlの定義を取ってきます

しかし、namespaceがguestbookになっているので、今回はnamespaceをdefaultに変更します

manifests/argocd/overlays/development/apps/guestbook.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    server: https://kubernetes.default.svc
    namespace: default  # ←ここを変更する

yamlをapplyする

$ k apply -f manifests/argocd/overlays/development/apps/guestbook.yaml

f:id:kntks:20210820151750p:plain

syncボタンを押すとSync OKになります

f:id:kntks:20210820151949p:plain

リソースの確認

$ k get all
NAME                                READY   STATUS    RESTARTS   AGE
pod/guestbook-ui-85985d774c-sblqh   1/1     Running   0          4m59s

NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/guestbook-ui   ClusterIP   10.96.24.143   <none>        80/TCP    5m
service/kubernetes     ClusterIP   10.96.0.1      <none>        443/TCP   2d2h

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/guestbook-ui   1/1     1            1           4m59s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/guestbook-ui-85985d774c   1         1         1       4m59s

ブラウザでguest bookを表示する

$ k get svc
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
guestbook-ui   ClusterIP   10.96.24.143   <none>        80/TCP    9m58s

$ k port-forward svc/guestbook-ui 8000:80

http://localhost:8000 にアクセスするとguestbookが表示されます

f:id:kntks:20210820152902p:plain

最後に

今回使用したファイルはここにあります

参考

Amazon EKSでのArgoCDを使ったGitOps CD – PSYENCE:MEDIA

Declarative Setup - Argo CD - Declarative GitOps CD for Kubernetes