tech.guitarrapc.cóm

Technical updates

Devtronを触ったメモ

Kubernetesはいわゆるコンテナオーケストレーターですが、素で使うことはほとんどなく様々なOSSやツールと組み合わせて運用されることが多いです。 私もHelmチャートを使って様々なコントローラーを導入しています。KEDAで水平スケールを管理し、ArgoCDを使ってGitOps運用したり、HeadlampやDatadogでモニタリングしたりです。

多くのツールとクラウドを組み合わせ、連携してようやく本格的なKubernetes運用ができます。これは、Kubernetesの難しさを象徴する一面と言えるでしょう。普段運用していると気づきにくいですが、ふと振り返ったり、誰かに説明したり、オンボーディングをサポートするときに本当に難しいと感じます。そもそもKubernetesを運用するには多くの知識1が必要です。この状況はKubernetesが登場して以来、複雑になる一方で、初心者がKubernetesを使い始めるのは常にハードル高い状態です。

そんなKubernetesの運用に必要な機能をオールインワンで提供するプラットフォームがいくつか登場しています。Devtronもその1つです。今回は、Devtronがどう解決しようとしているのか触ったメモです。

Devtronの目指すところ

Devtronの公式ページを見ると、DevtronはKubernetesのアプリケーションとインフラ管理を統合しAIアシスタントが運用を簡素化し、デリバリーを加速することを目的としています。

Devtron is purpose-built for production Kubernetes teams, unifying app and infrastructure management with an AI teammate that simplifies operations and speeds delivery.

引用: https://devtron.ai/

alt text

DevtronはKubernetesの上に様々な機能を提供しており、アプリケーションのデプロイから監視、セキュリティまで幅広くカバーしています。具体的には、複数のOSSを組み合わせています。代表的な機能は以下の通りです。

  • CI/CD統合 = ビルドをDevtronが制御、そのビルド結果をDevtronが制御するArgoCD/Fluxでデプロイ、デプロイ履歴やデプロイ問題をAIが検知、自動ロールバック
  • セキュリティ統合 = イメージやマニフェストのスキャン、シークレットがコードやコンフィグに露出していないかチェック、シップ前にライセンススキャン
  • Observability = PrometheusやGrafanaをDevtron UIに組み込んで監視を一か所から提供
  • コスト管理 = コストを環境単位でモニタリング、AIによるサイジングや異常検出

これらをDevtronから提供するだけでなくUIも一元化することで、Kubernetesの運用を簡素化しようとしています。

Devtronのインストール

DevtronはHelmチャートを使って導入します。AWS EKS上に導入する場合を例に説明します。前提条件は次の通りです。

  • EKSクラスターが作成済み(この記事ではEKS Automodeを使用)
  • kubectl、helmコマンドがインストール済み
  • クラスターへの接続が確立済み

まずはHelmリポジトリを追加します。

$ helm repo add devtron https://helm.devtron.ai
$ helm repo update

Devtronは内部で利用しているpostgresql podでストレージが必要です。EKS AutomodeならEBS CSIドライバーがデフォルトで組み込まれているので、スムーズに進められます。

$ cat << EOF > storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: auto-ebs-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
allowedTopologies:
  - matchLabelExpressions:
      - key: eks.amazonaws.com/compute-type
        values:
          - auto
provisioner: ebs.csi.eks.amazonaws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  encrypted: "true"
EOF

$ kubectl apply -f ./storageclass.yaml

準備ができたら、Devtronをインストールします。少し初期設定から変更したい点をvalues.yamlで定義します。cicdモジュールを入れます2。初期状態はDevtron ServiceをLoadBalancerとして作成するので、ClusterIPに変更してport-forwardでアクセスします。検証ではなくユーザー認証を利用して展開するなら、ingress.enabled: trueでALBを作成すると良いでしょう。

$ cat << EOF > devtron-values.yaml
gateway:
  storageClass: "auto-ebs-sc"
installer
  modules:
    - cicd
components:
  devtron:
    service:
      type: ClusterIP
EOF
$ helm upgrade --install devtron devtron/devtron-operator --version 0.22.98 -n devtroncd --create-namespace -f devtron-values.yaml

インストールすると徐々にPodが起動してきます。Podの依存関係や起動タイミングの問題でスムーズには起動しません。何度かPodステータスがErrorやCrashLoopBackOffになりますが、10-15分ほど待つと最終的に安定します。 cicdモジュールを入れた場合、以下のようなpodが起動します。

$ kubectl get po -A
NAME                                       READY   STATUS      RESTARTS        AGE
app-sync-job-vykie-hj7xv                   1/1     Running     0               4m56s
argocd-dex-server-56b6556c7f-r9xw2         1/1     Running     0               4m57s
dashboard-784b5bbcfb-b8k7d                 1/1     Running     0               4m57s
devtron-584d7b6797-nn6kd                   1/1     Running     2 (118s ago)    2m
devtron-nats-0                             3/3     Running     0               4m56s
devtron-nats-test-request-reply            0/1     Completed   0               4m57s
Git-sensor-0                               1/1     Running     4 (2m29s ago)   4m56s
inception-7b69fb787c-2qj8z                 1/1     Running     0               4m57s
kubelink-f8d5bf985-579gj                   1/1     Running     2 (118s ago)    2m
kubewatch-5c6fd4d4b5-8rlt4                 1/1     Running     4 (2m2s ago)    4m57s
lens-55cdc47f9b-7lmqz                      1/1     Running     4 (2m41s ago)   4m57s
postgresql-migrate-casbin-0b0tv-wldnl      0/1     Completed   0               4m56s
postgresql-migrate-devtron-qqdbt-28hh4     0/1     Completed   2               4m56s
postgresql-migrate-gitsensor-g52lv-pk6gs   0/1     Completed   3               4m56s
postgresql-migrate-lens-rmqgj-skppn        0/1     Completed   3               4m56s
postgresql-postgresql-0                    2/2     Running     0               4m56s

Devtron権限管理

Devtronを触り始めるにあたり、port-forwardによるアクセスではOIDC認証ができないことを前回の記事で紹介しました。このため、port-forwardでアクセスした場合、デフォルトのadminユーザーで操作することになります。いったん操作を試すならこれでも大丈夫です。adminユーザーの初期パスワードは、以下のコマンドで取得できます。3

kubectl -n devtroncd get secret devtron-secret -o jsonpath='{.data.ADMIN_PASSWORD}' | base64 -d

alt text

ちなみにOIDC認証含むSSOを利用する場合、権限を定義してグループやユーザーに紐づけることで操作対象を制約できます。

alt text

DevtronのUI

サイドバーから様々な機能にアクセスできます。

alt text

Applicationがメイン操作です。アプリケーションを定義して、そこにビルド、デプロイを行います。Devtronで定義したアプリケーション以外に、helmで導入したコントローラーはHelm Appsとして表示されたり、ArgoCDで管理しているアプリケーションはArgoCD Appsとして表示されます。

alt text

Resource Browserは、いわゆる簡易Kubernetesダッシュボードです。Kubernetesに展開されているリソースを確認したり、YAML操作できます。

Chart Storeは、Helmチャートを選択してインストールことができます。Artifact Hubが初期状態で登録されているので、そこからチャートを選択してインストールできます。

alt text

Global Configurationは、Devtron全体の設定を調整します。例えば、クラスター登録、チャートリポジトリ登録、Gitリポジトリの登録や、イメージ/OCIレジストリの登録、ユーザーや認証回りの設定です。クラスターを追加してマルチクラスターができるのはいいですね。

alt text

alt text

Devtron Stack Managerは、Devtronが内部で利用するコンポーネントの選択です。ArgoCDやTrivyなど、Devtronが利用するOSSコンポーネントを選択してインストールできます。

alt text

alt text

Devtron Stack Managerでコンポーネントを追加

導入したら手始めに操作するのが、Devtron Stack Managerです。たとえばMonitoring (Grafana)を選択するとGrafana一式がインストールされます。

alt text

他にもArgoCDやTrivyなど、様々なコンポーネントを追加できます。例えばargocdを追加すると次のようなpodが起動します。

$ kubectl get po -A
NAMESPACE   NAME                                       READY   STATUS      RESTARTS      AGE
argo        workflow-controller-7fbdc9c877-4l8h4       1/1     Running     0             17m
devtroncd   argocd-application-controller-0            1/1     Running     0             9m10s
devtroncd   argocd-dex-server-56b6556c7f-r9xw2         1/1     Running     0             17m
devtroncd   argocd-Redis-86b6b9888b-5lmwg              1/1     Running     0             9m10s
devtroncd   argocd-repo-server-78fcb8745b-9mwvk        1/1     Running     0             9m10s
devtroncd   argocd-server-8474776d6-ssrlq              1/1     Running     0             9m10s
devtroncd   dashboard-784b5bbcfb-b8k7d                 1/1     Running     0             17m
devtroncd   devtron-9f55ffd8f-4nkc9                    1/1     Running     0             9m4s
devtroncd   devtron-nats-0                             3/3     Running     0             17m
devtroncd   devtron-nats-test-request-reply            0/1     Completed   0             17m
devtroncd   Git-sensor-0                               1/1     Running     4 (14m ago)   17m
devtroncd   inception-7b69fb787c-2qj8z                 1/1     Running     0             17m
devtroncd   kubelink-545b8f465c-hw46g                  1/1     Running     0             9m4s
devtroncd   kubewatch-5c6fd4d4b5-8rlt4                 1/1     Running     4 (14m ago)   17m
devtroncd   lens-55cdc47f9b-7lmqz                      1/1     Running     4 (14m ago)   17m
devtroncd   postgresql-migrate-casbin-3ef7n-d56rd      0/1     Completed   0             9m10s
devtroncd   postgresql-migrate-devtron-wcxwp-dhpsb     0/1     Completed   0             9m10s
devtroncd   postgresql-migrate-gitsensor-wgxiq-8cxsf   0/1     Completed   0             9m10s
devtroncd   postgresql-migrate-lens-cdgiz-vk452        0/1     Completed   0             9m10s
devtroncd   postgresql-postgresql-0                    2/2     Running     0             17m

さらにtrivyを追加すると、次のようなpodが起動します。

$ k get po -A
NAMESPACE   NAME                                       READY   STATUS      RESTARTS      AGE
argo        workflow-controller-7fbdc9c877-4l8h4       1/1     Running     0             39m
devtroncd   argocd-application-controller-0            1/1     Running     0             31m
devtroncd   argocd-dex-server-56b6556c7f-r9xw2         1/1     Running     0             39m
devtroncd   argocd-Redis-86b6b9888b-5lmwg              1/1     Running     0             31m
devtroncd   argocd-repo-server-78fcb8745b-9mwvk        1/1     Running     0             31m
devtroncd   argocd-server-8474776d6-ssrlq              1/1     Running     0             31m
devtroncd   dashboard-784b5bbcfb-b8k7d                 1/1     Running     0             39m
devtroncd   devtron-7688fbc8d8-ck7qx                   1/1     Running     0             15m
devtroncd   devtron-nats-0                             3/3     Running     0             39m
devtroncd   devtron-nats-test-request-reply            0/1     Completed   0             39m
devtroncd   Git-sensor-0                               1/1     Running     4 (37m ago)   39m
devtroncd   image-scanner-6b5b5b976c-qgfvx             1/1     Running     0             15m
devtroncd   inception-7b69fb787c-2qj8z                 1/1     Running     0             39m
devtroncd   kubelink-668c7ccb7d-qhm6j                  1/1     Running     0             15m
devtroncd   kubewatch-5c6fd4d4b5-8rlt4                 1/1     Running     4 (36m ago)   39m
devtroncd   lens-55cdc47f9b-7lmqz                      1/1     Running     4 (37m ago)   39m
devtroncd   postgresql-migrate-casbin-sspac-zk9×8      0/1     Completed   0             15m
devtroncd   postgresql-migrate-devtron-idjwh-grfwr     0/1     Completed   0             15m
devtroncd   postgresql-migrate-gitsensor-glbv3-8qflx   0/1     Completed   0             15m
devtroncd   postgresql-migrate-lens-jwyyd-b4hzg        0/1     Completed   0             15m
devtroncd   postgresql-postgresql-0                    2/2     Running     0             39m

Devtronの難しさ

Devtronを触っていてなかなか難しいと感じる部分があります。まず、Devtronは3つのワークロードが考えられます。

  • CI/CDワークロード = Devtronが提供するCI/CD機能を使ってビルド、デプロイを行う
  • ArgoCD/Fluxワークロード = ArgoCDアプリケーションをデプロイしてDevtronから管理
  • Helmワークロード = HelmチャートをDevtronからインストールして管理

Devtronの理想的には、CI/CDからDevtron (つまりKubernetes)で行うワークロードに見えます。コンセプトの目指すところはめちゃめちゃ高いですが、現時点では難易度が高めです。

Devtron内部でCI/CDを組む

例えばEKSにおけるGitOpsは、CIでビルドしてコンテナイメージをECRに配置、これを参照するKubernetes定義をシングルソースとしてGitHubなどに配置、CDとしてArgoCD/FluxでKubernetesにデプロイ、というシナリオが一般的です。Devtronはこれをさらに一歩進めて、CIもDevtronで行うことを想定しています。つまりDevtronでGit Cloneしてコンテナビルド -> レジストリに登録 -> これをさらにArgoCDなどで展開というシナリオです。GitOpsだけじゃなくて、CI/CDがセットになるのが特徴と言えます。Dockerfileでのビルド以外にDockerファイルなしのシナリオもDevtronにありますが、それはJava/Go/Python/Nodeなどで.NETはありません。まぁそんなものです、知ってた。

EKS的に難しいのが、DevtronからECRへのPushが必須なところです。DevtronのECRレジストリ登録UIを見ると、AWS認証はEC2 Instance ProfileかAccessKey/AccesSecretしか想定になさそうです。AWS EKSは最低限IRSA、可能ならIAM Pod Identityで認証をとるのが一般的です。特にEKS AutomodeはIMDSv2のホップ調整ができないため、EC2 Instance Profileから認証をとってくる設計は難しいです。EKSでDevtronを使うなら自前KarpenterなどのManaged Nodeである必要があります。

AWSを例に挙げましたが、認証系を各クラウド事情に沿ってアップデートしていくためにはDevtron開発者自身の理解が必要でしょう。AIの補助があっても開発リソースには負担となりそうですね。がんばってほしい。

ユーザー管理

DevtronのUser管理はSSOが前提になっています。これも運用上の難しさがあります。

前の記事で書いた通り、DexのOIDC認証をサブパスで隠すためグローバルな単一エンドポイントが必須です。この設計は、Devtronから自身が内包するDexへのアクセスにこのグローバル単一エンドポイントを使うため、エンドポイントのIP制限にDevtron Podが起動しているEC2のIP許可という制約が伴います。NAT GW配下ならNAT GWで良いのですが、そうじゃないなら次々と入れ替わるノードのIPを許可しないといけません。Devtronを触るなら、まずはこのあたりの設計を考える必要があります。これ、OIDC認証としては通常考えなくていい制約なので、DevtronのOIDC設計はちょっと好みではないです。

ダッシュボード

Kubernetesダッシュボードとしては貧弱と言わざるを得ません。 ここから情報を読み取ろうにも読み取れる情報少なすぎるので、今のダッシュボードだと運用的には微妙です。 AIインテグレート用のコマンドパネルはあるので、そういうところはよさそうなのと、Grafana連携もできるのでダッシュボード埋め込みとか来ると良さそうです。

使うリソースが多い

Pod一覧を見てもわかりますが、Devtronは多くのPodを起動します。運用するということは、これらのPodが安定して動作するために必要なリソースを確保しなくてはいけません。 特に小規模なクラスターでは、Devtron自体がリソースを消費しすぎてノードのコストがバカにならないでしょう。 Kubernetes運用してていつも悩むんですが、運用系のコントローラーってPodが増えやすいので、もう少しPod数自体押さえたいんですよね。1コントローラー1Podだとすごいんですが、なんだかんだで冗長化で2Podが最低限必要ですし。

内包するOSSの最新事情のキャッチアップ

利用者もですが、Devtron開発自体が内包するOSSの最新事情をキャッチアップし続けるのは大変そうです。 例えばArgoCDやFlux、Trivy、Prometheus、Grafanaなど、これらのOSSは頻繁にアップデートされます。Devtronがこれらの最新バージョンをサポートし続けるためには、Devtron自体も頻繁にアップデートされる必要があります。Devtronのリリースサイクルと内包するOSSのリリースサイクルをうまく調整するのは難しい課題です。

各OSSの最新機能を活用したいと考えても、Devtron的にはそれをいい感じに解釈して提供する必要があるでしょう。この辺りはバランスをとるのか、あるいはOSSを直接使うのかっていう感じになります。 でも各種OSSを直接使いだすならDevtronを使う意味が薄れるんですよね。

AIインテグレーションが遠い

ぱっと使い始めようとしてもAIインテグレーションはどこ。とすぐにはわからないです。UXの問題にも感じますが、AIインテグレーションでどのような体験を提供したいのかというチュートリアルがないので難しいですね。 AIをぱっと使いたいっていうとき、まずログインしたらAI画面が開けばいいのにまである。

headlampやkubectl AIとか使っていると割と直感的なこともあり、今後どうしていくのか気になります。

個人的な期待

CI/CDの内、CIを切り離してほしい感じがします。CIはGitHub Actionsなり自身でやるシナリオはやはり主体的で、そこがセットな体験になっているのは相当厳しい。ECR含めて準備も多く、ちょっと試してみるまでがまず遠いです。 やりたいのは、AIドリブンなCDや運用であって、CIやCDセットアップじゃないんですよね。

個人的に、運用していてほしいのは、AI +ArgoCD + KEDA + Headlamp + Grafana + Fluentbit + Security Scanっていう感じがあります。DevtronはCI外せばそこに近い感じもするので今後も注目していきたいです。

まとめ

Devtron面白いのですが、まだまだ難しいなと感じました。Kubernetes運用の複雑さを解決するために多くの機能を提供していますが、その分設定や運用も複雑になりがちです。 有料版を含めて、どこまでサポートされるのかも気になるところです。

参考


  1. コンテナの知識、それを運用するオーケストレーターの知識、クラウドと連携する方法、DNSやクラウドリースやセキュリティ、監視などなど。
  2. 入れないでやっても入れない理由なかったので入れましょう
  3. Helmインストール時にコマンドが表示されます。