当社 TORICO では、Webアプリのサーババックエンドに Kubernetes を使っています。
Kubernetes を使うには覚えなければいけないことが多く、最初はハードルが高いと感じると思います。とくに kubectl コマンドだけを使っていると、内部の階層構造が見えにくく理解が難しく感じます。
GUIクライアントを活用することで、内部の理解がしやすくなり、習得が早まります。
Rancher
Web アプリとして動作する Kubernetes クライアントです。
Docker で起動できるので、当社では Kubernetes 上に Rancher を起動させ、各クラスタを操作するのが一般的です。
必要十分な機能があり、構築や操作もわかりやすいので初学におすすめです。
私も Rancher からの学びは多く、心の中では Rancher 先生と呼んでいます。
Helm チャートをブラウザで一覧して、クリックしていくだけでアプリを起動できるのは便利です。
Kubernetes 上で稼働させていると、たまにログが出てこなくなったりなどの不具合が発生することがありますが、再起動・アップグレードを行うことで改善する場合が多いです。
ただアップグレードの際に起動不能になり、何度か作り直したこともあります。
使う際は、作り直す時に焦らないよう手順書を残しておくと良いでしょう。
当社では、社内の Ubuntu サーバの中の microk8s で Rancher を起動しています。
使っている Kubernetes マニフェストを書いておきます。
Docker イメージのタグ (下記 v2.6-head の箇所)は適宜最新版に修正版に修正してください。
deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: devserver-rancher-deployment namespace: torico spec: replicas: 1 selector: matchLabels: app: devserver-rancher template: metadata: labels: app: devserver-rancher spec:
# serviceAccountName: devserver-rancher # (追記・後述) containers: - name: devserver-rancher image: rancher/rancher:v2.6-head imagePullPolicy: Always ports: - containerPort: 80 volumeMounts: - name: data-rancher mountPath: /var/lib/rancher volumes: - name: data-rancher hostPath: path: /data/rancher
service.yml
apiVersion: v1 kind: Service metadata: name: devserver-rancher-service namespace: torico spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 name: devserver-rancher-http selector: app: devserver-rancher
ingress.yml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: devserver-rancher-ingress namespace: torico spec: tls: - hosts: - devserver-rancher.torico-corp.com secretName: tls-certificate rules: - host: devserver-rancher.torico-corp.com http: paths: - path: / pathType: Prefix backend: service: name: devserver-rancher-service port: number: 80
追記: 上記のマニフェストだけでは Rancher のトップページで下記のようなエラーを見るかもしれません。
Failed to create local/local-fleet-local-owner management.cattle.io/v3, Kind=ClusterRoleTemplateBinding for cluster-create fleet-local/local: admission webhook "rancherauth.cattle.io" denied the request: user "system:serviceaccount:torico:default" (groups=["system:serviceaccounts" "system:serviceaccounts:torico" "system:authenticated"]) is attempting to grant RBAC permissions not currently held: {APIGroups:["*"], Resources:["*"], Verbs:["*"]} {APIGroups:["cluster.x-k8s.io"], Resources:["machines"], Verbs:["*"]} {APIGroups:["management.cattle.io"], Resources:["clusters"], Verbs:["own"]} {APIGroups:["provisioning.cattle.io"], Resources:["clusters"], Verbs:["*"]} {APIGroups:["rke-machine-config.cattle.io"], Resources:["*"], Verbs:["*"]} {APIGroups:["rke-machine.cattle.io"], Resources:["*"], Verbs:["*"]} {APIGroups:["rke.cattle.io"], Resources:["etcdsnapshots"], Verbs:["get" "list" "watch"]} {NonResourceURLs:["*"], Verbs:["*"]}
その場合はアカウントとロールを作ってください。
kind: ServiceAccount apiVersion: v1 metadata: name: devserver-rancher namespace: torico labels: app: devserver-rancher --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-admin rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"] - nonResourceURLs: ["*"] verbs: ["*"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: devserver-rancher-cluster-role-binding labels: app: devserver-rancher subjects: - kind: ServiceAccount name: devserver-rancher namespace: torico roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io
そして、 deployments の ServiceAccount をこのアカウントに設定してください。
apiVersion: apps/v1
kind: Deployment
...
spec:
...
template:
...
spec:
serviceAccountName: devserver-rancher # これ
containers:
...
OpenLens
https://github.com/MuhammedKalkan/OpenLens
Lens というオープンソースプロジェクトから派生した OpenLens という Kubernetes の GUI クライアントがあります。
PCにインストールして起動させるアプリで、 Electron で作られています。
使った感じは、例えば Cronjobから関係する Job や Pod に掘っていけなかったり、Deployments → Pod → コンテナ と掘っていった後に Pod に戻るUIが無いなど、Rancher と比べると使いにくい点があります。
ただ、「新しいクラスタにとりあえず繋いで調べる」点において非常に便利なので、EKS でクラスタを作った後に管理する時にはよく使います。
kubeconfig ファイルを PC 上で管理し、外部にコピーしたくない場合は良い選択です。
Lens の歴史
もともとは Lens というオープンソースプロジェクトがあり、2020年の3月にアプリがリリースされました。
Lens — A Year In Review. Just a year ago, in March 2020, we… | by Edward Ionel | k8slens | Medium
その後、2020年8月に Mirantis社が Lens プロジェクトを買収します。
Mirantis acquires popular Kubernetes IDE Lens | ZDNET
結果、Lens は Mirantis 社が提供するフリーミアムのプロジェクトとなりました。
2023年時点では、Free 版 と Pro 版がリリースされています。
Free 版は、業務利用をする場合は年商 $10M (14億円程度) 以下の企業に限られるため、当社では使えませんでした。
Pro版は機能は豊富なものの $19.90/月 です。
Lens がプロプライエタリとなり、フリーミアムの製品となったことに対抗する形で、 OpenLens プロジェクトが立ち上がります。
https://github.com/MuhammedKalkan/OpenLens
もとものオープンソースである Lens の最新リポジトリのビルド成果が公開され、インストールが容易になったのは良かったのですが、v6.3以降は主要機能である「ログ」と「シェル」のボタンが表示されない問題が発生します。
https://github.com/lensapp/lens/issues/6823
実際にコード上からボタンは削除されており、おそらく Mirantis 社のマネタイズのための変更だと考えられ、オープンソースプロジェクトの姿勢についての話題となり上記Issueは荒れます。
その後、 @alebcay さんが OpenLens に「ログ」と「シェル」のボタンを表示するエクステンションを公開され、それを導入することで OpenLens は実用的な Kubernetes クライアントアプリとして使えます。
https://github.com/alebcay/openlens-node-pod-menu
このエクステンションを入れない限り、OpenLensはおすすめできません。
インストール方法
brew install --cask openlens
インストール直後は、Shell と Log のボタンが表示されないため、エクステンションを導入します。
- アプリを起動する
- メニューバーの OpenLens → Extensions ( Shift + Command + E)
- URL入力欄に @alebcay/openlens-node-pod-menu を入力
- Install をクリック
インストール直後は Status が Enabled と Disabled で点滅するなどして変な挙動になるかもしれませんが、一度アプリを再起動させ、Extensions ページからプラグインを Enabledにすることで有効になります。
k9s
ターミナル上で動作する TUI アプリです。
https://github.com/derailed/k9s
複数クラスタの管理機能は無く、起動時の環境変数 KUBECONFIG でクラスタを切り替えます。また -n でネームスペースを指定することもできます。 kubectl と同じような使い勝手です。
例えば
$ KUBECONFIG=${HOME}/.kube/confg-devserver k9s -n torico
といったコマンドで起動します。
複数クラスタを管理している場合は選択して起動できるようなメニューのスクリプトを作ると使いやすいと思います。
キーバインドは Vim でおなじみの j, k で上下移動で、Enter で掘り下げ、Esc で上階に戻ります。
ステータスを簡易的に確認する、ログを見る、シェルを起動する、程度であれば手軽に実現できます。
全てをキーボードで操作するため、慣れるとUIの軽快さもありかなりの速度で操作できます。複数ある Pod の標準出力を見て回るような操作を爆速でできます。
インストール方法
brew install k9s
Devtron
Kubernetes クライアントの範囲を超えて、CI など広い開発体験を提供するアプリです。
( 同名で Electron 用のデバッガーアプリがあり、少し紛らわしいです)
Devtron がどんなものであるかは下記の記事に詳しく書いてあります。
Devtron: Open-Source Software Delivery Workflow for K8s
上記記事によると、Argo CD, コンテナスキャナ, メトリクスの可視化などがパッケージされたものが Devtron のようです。
Helm で Kubernetes にインストールできます。
インストール方法
https://docs.devtron.ai/install/install-devtron
上記の Helm チャートを Rancher 経由で microk8s にインストールしてみようとしましたが、私の環境では失敗しました。
そのため、Devtron はまだ試せていません。今後また再トライしてみたいと思います。