0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルでArgoCDを動かしてみよう

Last updated at Posted at 2025-01-03

はじめに

ちょっと勉強がてら、ローカル環境でargoCDを動かしてみます。
githubにクラスタ構成の変更差分をpushし、argoCDを使って実際にローカルのkubernetesクラスタに変更が反映されていることを確認します。
環境構築のためのメモ的な役割のため、中身のコードの解説などは少な目です。気になる方はぜひ調べてみてください!

argoCDを使うにはまずkubernetesクラスタを用意する必要があるらしいので、そこから始めて行こうと思います!

環境

  • OS
    • Ubuntu 24.04.1 (wsl)
  • メモリ
    • 15GB
  • argoCD
    • v2.13.1+af54ef8
  • Docker Desktop
    • 4.37.1 (178610)

本編

1.Kubernetesクラスタ作成

では、まず最初にKubernetesクラスタを作成します。
今回は、microk8sを使用してクラスタを構築します(microk8sを使う理由は特にないです)。

Docker Desktopの設定

まずはDocker Desktopの設定です。
といっても、右上の設定→Kubernetesから「Enable Kubernetes」をonにするだけです。
image.png

microk8sインストール

以下のコマンドでmicrok8sをインストールします。

sudo snap install microk8s --classic

もし、snapが入っていない場合は、以下のコマンドでsnapをインストールします。

sudo apt install snapd

kubectlインストール

以下コマンドを実行して、最新バージョンのkubectlをインストールします。

最新バージョンをダウンロード

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

ダウンロードしたものをインストール

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

上記コマンドを実行したディレクトリにkubectlというファイルが生成されますが、インストール後に削除しても動作に影響はなさそうです。

インストールが完了したら、以下コマンドで正しくインストールできているか確認しましょう。

microk8s status

実行結果(初期状態の出力とはちょっとことなるかもです。)

$ microk8s status
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    dashboard            # (core) The Kubernetes dashboard
    dns                  # (core) CoreDNS
    ha-cluster           # (core) Configure high availability on the current node
    helm                 # (core) Helm - the package manager for Kubernetes
    helm3                # (core) Helm 3 - the package manager for Kubernetes
    hostpath-storage     # (core) Storage class; allocates storage from host directory
    metrics-server       # (core) K8s Metrics Server for API access to service metrics
    storage              # (core) Alias to hostpath-storage add-on, deprecated
  disabled:
    cert-manager         # (core) Cloud native certificate management
    cis-hardening        # (core) Apply CIS K8s hardening
    community            # (core) The community addons repository
    gpu                  # (core) Alias to nvidia add-on
    host-access          # (core) Allow Pods connecting to Host services smoothly
    ingress              # (core) Ingress controller for external access
    kube-ovn             # (core) An advanced network fabric for Kubernetes
    mayastor             # (core) OpenEBS MayaStor
    metallb              # (core) Loadbalancer for your Kubernetes cluster
    minio                # (core) MinIO object storage
    nvidia               # (core) NVIDIA hardware (GPU and network) support
    observability        # (core) A lightweight observability stack for logs, traces and metrics
    prometheus           # (core) Prometheus operator for monitoring and logging
    rbac                 # (core) Role-Based Access Control for authorisation
    registry             # (core) Private image registry exposed on localhost:32000
    rook-ceph            # (core) Distributed Ceph storage using Rook
$

Kubernetes設定ファイルの作成

local-k8s.yamlというファイル名で、Kubernetesの諸々の設定を記述したファイルを作成します。

私はローカルで作成したイメージを使用したかったので、こちらのサイトを参考にローカルのkubernetesにイメージを入れました。
そうでない方は、Docker Hub上にあるイメージ名を指定すればよいかと思います。

あとは、Docker Hubに自分で作成したイメージを追加する方法もあるみたいですね。

apiVersion: v1
kind: Service
metadata:
  name: api-service
spec:
  ports:
  ## クラスタ外部からアクセスする際のポート
  - nodePort: 31000
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: api
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: server
  template:
    metadata:
      labels:
        app: server
    spec:
      containers:
        ## イメージ名を指定
      - image: 何かしらのイメージ(ex. nginx:latest)
        ## ローカルにイメージがある場合は、そこから取得
        imagePullPolicy: IfNotPresent
        name: server
        ## コンテナをrunning状態にするためのおまじない
        ## 通常であれば必要ないです
        command: ['tail', '-f', '/dev/null']
        ports:
        - containerPort: 8080
       ## volume周りは設定してなくても大丈夫です。
        volumeMounts:
          - mountPath: コンテナ側のパス
            name: server-volume
      volumes:
        - hostPath:
            path: ホスト側でマウントするパス
          name: server-volume

kubernetesクラスタ作成

では、作成したyamlファイルを元にクラスタを作成します。
以下のコマンドを実行してください。クラスタの作成場所のnamespaceを指定しない場合は、defaultというnamespaceに作成されます。
ローカルで試してみる、くらいであればこれでよいですが、本番で運営する場合は、別のnamespaceを指定するのが良いでしょう。

kubectl apply -f local-k8s.yaml

実行が完了したら、以下のコマンドでpodが作成されていることを確認します。

kubectl get po 
$ kubectl get po
NAME                  READY   STATUS    RESTARTS   AGE
api-69bd9b484-l99dz   1/1     Running   0          136m
api-69bd9b484-z2m5x   1/1     Running   0          136m
$

ここまで完了したら、先ほど作成したlocal-k8s.yamlファイルをgithub上にあげましょう。

2.argoCD

お次はargoCDの構築です。
基本的には、こちらの公式を参考にすればいけます。

argoCDのGUIにログイン

では、まずはargoCDをインストールする前に以下コマンドを実行します。kubernetes内のdnsを有効にする必要があるらしいですね。

microk8s enable dns && microk8s stop && microk8s start

次に以下コマンドを実行して、argoCDに必要な諸々のpodを作成します。

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

以下コマンドで、argoCDのCLIをダウンロード
GUIで操作を行う場合はいらないかもですね。

brew install argocd

次に、argoCDサーバのタイプをロードバランサーにするため、以下コマンドを実行します。

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

外部からアクセスするためのポートフォーワーディングを行います。

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

これで、argoCDのwebUIにアクセスできるはずです。
localhost:8080
image.png

ユーザ名はadmin、パスワードは

argocd admin initial-password -n argocd

で出力されたものを使用すればログインできます。

argoCDアプリケーション作成

ここからは、argoCDのGUIでアプリケーションを作成します。

まずはgithubリポジトリの設定を行います。
Settings -> Repositoriesから+ CONNECT REPOをクリックし、必要事項を記入します。

image.png

Name 何でもよい
Project default
Repository URL 自分で作成したリポジトリを指定
SSH private key data リポジトリでSSH接続するのに必要なsshキーを使用

入力後、CONNECTボタンを押してステータスがSuccessfulになっていたら成功です。

次にいよいよアプリケーションの作成です。
左側のバーにあるApplicationsから+ NEW APPを押してアプリケーションを作成します。

image.png
argocd_set_application.png

Application Name 何でもよい
Project Name default
Sync Policy manual
Repository URL 先ほど作成したリポジトリが候補にあるはず
Path 最初に作成したlocal-k8s.yamlファイルがあるディレクトリ
Cluster URL https://kubernetes.default.svcを指定すると、ローカルのクラスタを指定できるっぽいです
Namespace default

これでアプリが作成できたら、SYNCボタンを押してgithub上のyamlファイルを元にpodを作成します。
こちらの処理には時間がかかるかもしれません。

argocd_sync_image.png

$ kubectl get po
NAME                   READY   STATUS    RESTARTS      AGE
api-696bff74fb-4zxwf   1/1     Running   2 (20m ago)   18h
api-696bff74fb-wd2fx   1/1     Running   2 (20m ago)   18h
$

githubにマニフェストの変更をPushして、ローカルクラスタに反映

最後に、githubリポジトリにpodの作成数を変更した修正をpushして、argoCDからローカルのクラスタへ変更を反映します。
今回は、作成されるpodの数を4つに変更してみます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
- replicas: 2
+ replicas: 4
  selector:
    matchLabels:
      app: server
  template:
    metadata:
      labels:
        app: server
    spec:

上記のような修正をpushし、argoCDのwebUIからSYNCHRONIZEボタンで修正をローカルクラスタに反映します。
image.png
argocd_sync.png

修正前

$ kubectl get po
NAME                   READY   STATUS    RESTARTS      AGE
api-696bff74fb-4zxwf   1/1     Running   2 (64m ago)   19h
api-696bff74fb-wd2fx   1/1     Running   2 (64m ago)   19h
$

修正後

$ kubectl get po
NAME                  READY   STATUS    RESTARTS   AGE
api-69bd9b484-9zkwz   1/1     Running   0          35s
api-69bd9b484-d5xvj   1/1     Running   0          33s
api-69bd9b484-nwzq5   1/1     Running   0          35s
api-69bd9b484-vp88d   1/1     Running   0          33s
$

これで、githubのマニフェストを元にローカルクラスタに修正を反映することができました!

参考サイト

今後

今回はGUIでargoCDのアプリケーションを作成しましたが、yamlファイルでも管理できるようなので、今度はそちらを使用したいですね。
また、volumeの設定回りがあまりよくわかっていないので、そこの勉強もしたいです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?