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するだけで治るので手間も少なく便利だと思う