k3s で内部向けArgo CD を簡単にデプロイする

@asya_aoi1049 on Wed Jun 29 2022
18.4 min

目次

目的

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

参考

k3s
Argo CD

日別に記事を見る