k3s で内部向けArgo CD を簡単にデプロイする
目次
目的
- Argo CDをすぐに構築するためのk8sが欲しい
- 管理したいKubernetesとArgo CDを分離
- Argo CDをGitで管理
などの目的を達成したい
k3s とは
k3sはIoTやエッジコンピューティング等向けの軽量なKubernetesで、
単一バイナリでKubernetes環境を構築できるほか、Helm, Traefikなど組み込まれているのですごく便利
Argo CD とは
Argo CDはKubernetes用のGitOpsのCDツール
KubernetesのManifestをGithubで管理することが多いが、簡単なUIでデプロイを管理出来るので便利
ちなみに作成元のArgo にはArgo WorkflowsやArgo Rolloutsなどもありこれらも便利
環境
- Ubuntu 20.04.4
- k3s v1.23.6+k3s1
- Argo CD v2.2.0
k3s install
まずサイトに従ってk3sをインストールする
$ curl -sfL https://get.k3s.io | sh -
# Check for Ready node, takes maybe 30 seconds
$ k3s kubectl get node
インストールが完了すると、k3s.serviceが起動しているので、systemctl
コマンド等で確認できる
起動しているk3sのkubeconfigは/etc/rancher/k3s/k3s.yaml
にあるので、
kubectl のためにkubeconfigのデフォルト~/.kube/config
ファイルに書き出す
$ sudo cat /etc/rancher/k3s/k3s.yaml > ~/.kube/config
kubeconfigが正常に取れていることを確認する
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ubuntu Ready control-plane,master 13d v1.23.6+k3s1
これでk3s は操作できる状態になった
Argo CD install
k3s はHelm がプリインストールされているが、個人的にkustomizeが好きなのでkustomizeを使う
kubectl にkustomize サブコマンドがあるのでインストールは不要
$ mkdir -p argocd/installs
以下のyamlをargocd/installs/kustomization.yaml
に作成する
namespace: argocd
bases:
- github.com/argoproj/argo-cd/manifests/cluster-install?ref=v2.2.0
resources:
- overlays/namespace.yaml
- overlays/application.yaml
- overlays/argocd-repo.yaml
- overlays/argocd-cluster.yaml
patchesStrategicMerge:
- overlays/argocd-secret.yaml
patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: argocd-server
patch: |-
- op: add
path: /spec/template/spec/containers/0/command/-
value: --insecure
各設定についてはDeclarative Setupを参考に設定する
また今回はArgo CD でArgo CDを管理 するため、application.yamlで自身のrepoURLを指定する
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/mitsuyoshi4/manifest
targetRevision: HEAD
path: argocd/installs
syncPolicy:
automated:
prune: true
selfHeal: true
destination:
server: https://kubernetes.default.svc
namespace: argocd
github.com/mitsuyoshi4/manifest
はprivate repoなので、argocd-repo.yaml
を修正する
passwordはここでは簡単なGithubのPersonal Access Tokenを使用して設定している
apiVersion: v1
kind: Secret
metadata:
name: private-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
type: git
url: https://github.com/mitsuyoshi4/manifest
password: xxxxxxx
argocd-cluster.yaml
はArgo CD で管理するKubernetesの情報を入れるが、用途によって設定するためここでは割愛
argocd-secret.yaml
も管理者のパスワードを変更するために入れているためここでは割愛 (参考: パスワード変更)
patchesJson6902
の設定はIngressで使用するので後述する
これらをGitで管理するようにして、以下のコマンドを実行しk3sにapplyする
$ kubectl kustomize argocd/installs/ | kubectl apply -f -
正常にできたか確認する
$ kubectl get ns
NAME STATUS AGE
... Active 13d
argocd Active 13d
$ kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-redis-84558bbb99-nm8xl 1/1 Running 0 13d
argocd-dex-server-5777956cbd-5snxc 1/1 Running 0 13d
argocd-repo-server-77b8c7f985-flp7t 1/1 Running 0 13d
argocd-application-controller-0 1/1 Running 0 13d
argocd-server-7678b86778-6mxwm 1/1 Running 0 2d1h
別PCからArgo CDをみたい
注意として、今回は内部向けArgo CDなので、内部ネットワークのみアクセス可能な想定としているため
外部ネットワークにつながっている場合は別途認証が必要になる
k3sにはデフォルトでTraefikがプリインストールされているため、TraefikのIngress Configurationを参考に設定する
また、argocd/installs/kustomization.yaml
のpatchesJson6902
で--insecure
フラグを追加しているのは、Argo CDをTLSなしで接続する際に正常に接続できないため入れている
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: argocd-server
namespace: argocd
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: PathPrefix(`/`)
priority: 10
services:
- name: argocd-server
port: 80
- kind: Rule
match: PathPrefix(`/`) && Headers(`Content-Type`, `application/grpc`)
priority: 11
services:
- name: argocd-server
port: 80
scheme: h2c
tls:
certResolver: default
options:
name: ""
上記のyamlファイルをapply しブラウザで<k3sのIP>に接続するとArgo CDのログイン画面がでるはず
$ kubectl apply -f ingress.yml
その他の設定について
このArgo CDを設定する目的として、管理したいKubernetesとArgo CDを分離したい、Argo CDをGitで管理したいなどあるので、そのあたりの設定を追加する
argocd-cluster.yaml
で管理したいKubernetesの情報を追加する
apiVersion: v1
kind: Secret
type: Opaque
metadata:
labels:
argocd.argoproj.io/secret-type: cluster
name: xxx-xxx-xxx
namespace: argocd
stringData:
name: kubernetes-admin@cluster.local
server: https://<管理したいk8sのIP>:6443
config: |
{
"tlsClientConfig": {
"insecure": false,
"caData": "<k8sのcertificate-authority-data>"
"certData": "<k8sのcertificate-authority-data>"
"keyData": "<k8sのclient-key-data>"
}
}
Argo CDで管理する他のApplicationを読み込むためのディレクトリを作り、application.yaml
に追加する
$ mkdir -p argocd/applications
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd-apps
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/mitsuyoshi4/manifest
targetRevision: HEAD
path: argocd/applications
directory:
recurse: true
jsonnet: {}
syncPolicy:
automated:
prune: true
selfHeal: true
destination:
server: https://kubernetes.default.svc
namespace: argocd
ここでapplicationsディレクトリ配下に好きなApplicationを追加するとArgo CDで管理できる
ここでは参考としてSealedSecretsのApplicationのyamlを書く
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sealed-secrets
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/mitsuyoshi4/manifest
targetRevision: HEAD
path: sealed-secrets
syncPolicy:
automated:
prune: true
selfHeal: true
destination:
server: https://<管理したいk8sのIP>:6443
Argo CDはkustomizeでもHelmでも対応しているので、上記のpathのファイルの形式をどちらかに合わせれば管理できる
例の指定したpathはsealed-secrets/kustomization.yml
を含み、以下の設定だけでも動く
bases:
- https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.17.5/controller.yaml
上記のようにApplicationを追加してgit push するとArgo CDが動いて<管理したいk8s>にSelaedSecrets をApplyしてくれるはず
clustersに入るk8sの情報をそのまま入れるのはあまり良くない(Gitでkubeconfigを管理するのと同じなので)と思うので、SealedSecretsとかで暗号化したほうがいいと思う
まとめ
内部向けArgo CDとすればk8s自体を管理するのは面倒なため、軽量なk3sで構築したほうがいいと思う
もしk3sが壊れてもArgo CDはGitで管理されているので、再度k3sを作り直して argocd/installsをapplyするだけで治るので手間も少なく便利だと思う