🐕

おうちk8sにArgoCD(+MetalLB)を導入し作業用PCから繋いでみる

2025/03/02に公開

1. はじめに

勉強のため、ラズパイで構築したおうちk8sにArgoCDを導入してGitOpsの環境を構成してみました。
同一LAN上の作業用のPCからargocd-serverのGUIにブラウザ接続するために、MetalLBを使用しました。

構成イメージ

1.1. MetalLBについて

PortForwardせずにArgoCDへのGUI接続を行うために、 type:LoadBalancerを利用する必要がありました。
パブリッククラウドのk8sでは各クラウドのロードバランサーサービスを使って簡単に設定することができますが、オンプレ環境ではそのままではLoadBalancerを利用できません。

MetalLBはこの問題を解決するための、インスタンス不要で疑似的なロードバランサー機能を提供してくれるOSSです。

https://metallb.io/

今回は最も簡単に利用できるL2モードで実装しました。

k8s環境

kubelet       v1.32.2
kubeadm       v1.32.2
kubectl       v1.32.2
containerd    v1.7.25
flannel       v0.3.1

2. 作業

2.1. MetalLBセットアップ

事前準備

kube-proxyの設定を変更するため、configmapを編集します。

$ kubectl edit configmap -n kube-system kube-proxy

以下のように変更して、保存します。
(私の環境では、mode""ipvs.strictARPfalseになっていたので、修正しました。)

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

インストール

HelmでMetalLBをインストールします。

$ cd ~; mkdir metallb; cd metallb

# Namespaceの作成
$ kubectl create ns metal-lb

# インストール
$ helm repo add metallb https://metallb.github.io/metallb
$ helm install metallb metallb/metallb -n metal-lb

IPアドレスの割り当て

続いて、MetalLBで割り当てられるIPアドレスを設定します。
今回は、LANのネットワーク(192.168.11.0/24)から払いだしたIPアドレスを記載したマニフェストを作成し、applyしました。

ipaddresspool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default
  namespace: metal-lb
spec:
  addresses:
  - 192.168.11.201-192.168.11.211 # 任意のIPアドレス
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metal-lb
spec:
  ipAddressPools:
  - default
$ kubectl apply -f ipaddresspool.yaml

これで、LoadBalancerをapplyした際に、設定した範囲内でExternalIPが割り当てられるようになりました。

2.2. ArgoCDセットアップ

インストール

Helmでインストールします。

# Namespaceの作成
$ kubectl create ns argocd

# インストール
$ helm repo add argo https://argoproj.github.io/argo-helm
$ helm install argocd argo/argo-cd -n argocd

サービスタイプを変更

argocd-serverサービスのタイプをLoadBalancerに変更します。

# サービスの更新
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

# ExternalIPの確認
$ kubectl get svc argocd-server -n argocd

NAME            TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
argocd-server   LoadBalancer   10.98.68.20   192.168.11.202   80:31965/TCP,443:32605/TCP   17m

上記の出力結果より、192.168.11.202 が割り当てられたことが確認できます。

ブラウザでのアクセス

次に、admin のパスワードを以下のコマンドで取得します。

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

パスワードが確認できたら、作業用PCから任意のブラウザで http://192.168.11.202/
にアクセスします!

argocd-login

ログイン画面が表示されました!
admin アカウントでログインできることも確認できました。

2.3. ArgoCDのGitHub連携

執筆中

3. まとめ

おうちk8sにArgoCDを導入し、同一LANから操作可能な環境を構成しました。
接続のためにはportforwardかingressという選択肢もありますが、前者は毎回設定しないといけない、後者はDNSや証明書の用意が必要で面倒なので、IPアドレスで入るのが一番楽だと思います。

Discussion