APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

K8sGPTでKubernetesリソースの最先端なトラシュー体験をしよう

はじめに

こんにちは、ACS事業部の谷合です。
Kubernetesリソースのトラブルシュートは難しいと感じたことはないでしょうか?
特にKubernetesビギナーの方であれば、最初何をどうすれいいか戸惑う方も多いかと思います。
そこでそんなトラブルシュートの際にAIの力を借りれるK8sGPTなるツールを見つけましたので、
ご紹介します。

github.com

K8sGPTはAI providerであるOpenAIと連携でき、Kubernetesリソースの分析をAIに任せることが
できるCLIツールです。なお、現在は以下のリソースのBuilt in analyzerが提供されています。
このリストにないリソースについては自前でanalyzerを書く必要があります。

Enabled by default
 podAnalyzer
 pvcAnalyzer
 rsAnalyzer
 serviceAnalyzer
 eventAnalyzer
 ingressAnalyzer
 statefulSetAnalyzer
Optional
 hpaAnalyzer
 pdbAnalyzer

上記のようにすべてのリソースとまではいきませんが、K8sGPTを使うことで、分析結果と
対処策をAIから提供してもらうことが可能となります。早速セットアップ方法をご紹介します。

セットアップ方法

まず、K8sGPTを以下リンクの手順でインストールください。
https://github.com/k8sgpt-ai/k8sgpt#installation

次に、k8sgpt generateコマンドを実行し、OpenAIとの連携に必要なシークレットキーを生成する
ページを開きます。
なお、以下コマンドを実行すると自動でブラウザが開きますが、ブラウザがない、
もしくはexec: "xdg-open": executable file not found in $PATHなどのエラーが発生し、 ブラウザが開かない場合は、コマンド結果にあるURLをブラウザにコピペすることでもキーを生成可能です。

$ k8sgpt generate
Please open: https://beta.openai.com/account/api-keys to generate a key for openai
Please copy the generated key and run `k8sgpt auth` to add it to your config file

ターミナルに戻り、以下コマンドを実行し、Enter openai Keyの行でシークレットキーを入力することでK8sGPTとOpenAIとの連携完了となります。

$ k8sgpt auth
Using openai as backend AI provider
Enter openai Key: ★←
New provider added
key added

K8sGPTを使ったトラブルシューティング

Serviceリソースのトラブルシューティング

まずは、k8sgpt analyseコマンドで、クラスタ全体のエラーを確認します。
ただ、今の状態では分析したエラーを出力しているのみです。
次の手順でOpenAIに問い合わせて、エラーに対するアドバイスを取得します。

$ k8sgpt analyse
0 default/nginx(nginx)
- Error: Service has no endpoints, expected label run=nginx

先ほどのコマンドに--explainオプションを付与して、OpenAIからのアドバイスを取得します。
対処としては、Podのラベルを書き換えるようにアドバイスされました。

$ k8sgpt analyse --explain
Service nfs-system/cluster.local-nfs-subdir-external-provisioner does not exist
 100% |██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| (1/1, 2 it/min)

0 default/nginx(nginx)
- Error: Service has no endpoints, expected label run=nginx
The error message is saying that there are no pods with the label "run=nginx" that the service is expecting to connect to.

The solution would be to ensure that the pod(s) running the nginx application have the correct label "run=nginx" applied to them so that the service can connect to them properly. This can be done by updating the deployment or statefulset YAML file to include the label or by applying the label directly to the pods using kubectl.

今回はPodのラベルの書き換えでなく、ServiceのSelectorを書き換えてみます。
Serviceの定義を確認してみると、run=nginxとなっているべきものが、run=nginxxxxとなっていました。

$ kubectl get svc nginx -oyaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2023-01-18T11:02:27Z"
  labels:
    run: nginx
  name: nginx
  namespace: default
  resourceVersion: "1479719"
  uid: 96ea0109-8d30-41a7-9a39-da59b48d09f1
spec:
:
  selector:
    run: nginxxxx ←★
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.168.9.1

そこで、以下のコマンドでパッチを当て、Selectorを書きかえます。

$ kubectl patch svc nginx -p '{"spec":{"selector":{"run":"nginx"}}}'
service/nginx patched

すると、以下のように問題の検出がされなくなりました。

$ k8sgpt analyse
Service nfs-system/cluster.local-nfs-subdir-external-provisioner does not exist

No problems detected

Podリソースのトラブルシューティング

今回は、リソース作成の段階から見てみます。
nginxのイメージタグを存在しないものにして、Deploymentリソースを作成します。

$ kubectl create deploy imagetagwrong --image=nginx:laitest
deployment.apps/imagetagwrong created

k8sgpt analyseコマンドで分析してみると、以下のようにImagePullBackOffが出た箇所を
特定してくれています。

$ kubectl get po
NAME                             READY   STATUS             RESTARTS   AGE
imagetagwrong-5d556758cc-ctn9v   0/1     ImagePullBackOff   0          16s
nginx                            1/1     Running            0          145m

$ k8sgpt analyse
0 default/imagetagwrong-5d556758cc-ctn9v(Deployment/imagetagwrong)
- Error: Back-off pulling image "nginx:laitest"

OpenAIにアドバイスを聞いてみましょう。
すると、イメージ名とタグが正しいか確認するようにとのアドバイスを貰えました。

$ k8sgpt analyse --explain
 100% |████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| (1/1, 3262 it/s)

0 default/imagetagwrong-5d556758cc-ctn9v(Deployment/imagetagwrong)
- Error: Back-off pulling image "nginx:laitest"
The Kubernetes system is unable to fetch the latest image of nginx which is required for the deployment.

Solution: Check the image name and tag for correctness. If it is spelled correctly, check network connectivity to the image repository. If the image still cannot be fetched, manually pull the image to the node or check with the image repository to see if there are any issues with the image.

以下のように、タグを修正するパッチを当てることで、事象の解決ができます。

$ kubectl patch deployment imagetagwrong -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","image":"nginx:latest"}]}}}}'
deployment.apps/imagetagwrong patched

$ kubectl get po
NAME                             READY   STATUS    RESTARTS   AGE
imagetagwrong-5fbcbc96d8-xw4c4   1/1     Running   0          10s
nginx                            1/1     Running   0          159m

$ k8sgpt analyse
No problems detected

他機能

言語設定

K8sGPTは英語以外の言語にも対応しており、--explain付与時に、--language 'Japanese'
付与してあげることで、日本語で出力させることが可能です。
また、K8sGPTはデフォルトでキャッシュを嚙ませるので、うまく結果が返らない場合は、
--no-cacheも付与し、キャッシュを無視するようにしてください。

$ k8sgpt analyse --explain --language 'Japanese' --no-cache
Service nfs-system/cluster.local-nfs-subdir-external-provisioner does not exist
 100% |██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| (1/1, 19 it/hr)

0 default/imagetagwrong-5d556758cc-ctn9v(Deployment/imagetagwrong)
- Error: Back-off pulling image "nginx:laitest"
Kubernetesのエラーメッセージ「Back-off pulling image "nginx:latest"」を簡略化し、日本語で解決策を提供してください。

このエラーメッセージは、KubernetesがDockerイメージ「nginx:latest」をダウンロードできなかったことを示しています。解決策としては、以下のことが考えられます。

1. インターネット接続を確認して、Dockerリポジトリにアクセスできることを確認する。
2. イメージ名を正しく入力し、タイポがないか確認する。
3. ノードのストレージ容量を確認し、ダウンロードに必要な容量があることを確認する。

出力形式変更

json形式でも出力可能です。-ojsonを付与してください。

$ k8sgpt analyse --explain --language 'Japanese' --no-cache -ojson
Service nfs-system/cluster.local-nfs-subdir-external-provisioner does not exist
{
  "status": "ProblemDetected",
  "problems": 1,
  "results": [
    {
      "kind": "Pod",
      "name": "default/imagetagwrong-5d556758cc-n6dkh",
      "error": [
        "Back-off pulling image \"nginx:laitest\""
      ],
      "details": "Kubernetesのエラーメッセージ「Back-off pulling image \"nginx:latest\"」は、nginxイメージの最新バージョンの取得に失敗したことを示しています。\n\nこのエラーを解決するには、次の手順を行ってください:\n\n1. docker pullコマンドを使用して、ローカルマシンにnginxイメージをダウンロードします。\n\n2. Kubernetes YAMLファイルを編集して、nginxイメージのタグを最新バージョン(例えば1.19.2)に更新します。\n\n3. Kubernetesクラスタでkubectl applyコマンドを使用して、変更を適用します。\n\nこれで、Back-off pulling imageエラーは解決されます。",
      "parentObject": "Deployment/imagetagwrong"
    }
  ]
}

フィルタリング

結果をフィルタリングすることも可能です。デフォルトでは、HPAとPDB以外の
リソースでフィルタリングできますので、HPAとPDBもフィルタリング対象としたい
場合は、k8sgpt filters add [filter(s)]コマンドでフィルタに加えてください。

$ k8sgpt filters list
Active:
> PersistentVolumeClaim
> Service
> Ingress
> Pod
> ReplicaSet
Unused:
> HorizontalPodAutoScaler
> PodDisruptionBudget

その他

そのほかのオプションについては全部は紹介できませんが、helpを見ると以下の
ようなオプションが使えるようでした。

$ k8sgpt analyse --explain -h
This command will find problems within your Kubernetes cluster and
    provide you with a list of issues that need to be resolved

Usage:
  k8sgpt analyze [flags]

Aliases:
  analyze, analyse

Flags:
  -b, --backend string     Backend AI provider (default "openai")
  -e, --explain            Explain the problem to me
  -f, --filter strings     Filter for these analyzers (e.g. Pod, PersistentVolumeClaim, Service, ReplicaSet)
  -h, --help               help for analyze
  -l, --language string    Languages to use for AI (e.g. 'English', 'Spanish', 'French', 'German', 'Italian', 'Portuguese', 'Dutch', 'Russian', 'Chinese', 'Japanese', 'Korean') (default "english")
  -n, --namespace string   Namespace to analyze
  -c, --no-cache           Do not use cached data
  -o, --output string      Output format (text, json) (default "text")

Global Flags:
      --config string        config file (default is $HOME/.k8sgpt.yaml)
      --kubeconfig string    Path to a kubeconfig. Only required if out-of-cluster. (default "/home/taniaijunya/.kube/config")
      --kubecontext string   Kubernetes context to use. Only required if out-of-cluster.

今後の展望

今後は以下のようにマイルストーンが置かれています。
OpenAI以外のAI providerにも対応しそうですね。
また、カスタム可能な箇所も増えそうで楽しみです。

Upcoming major milestones
- Multiple AI backend support
- Custom AI/ML model backend support
- Custom analyzers

さいごに

いかがでしたでしょうか? クラスタそのもののトラブルシューティングはできませんが、
よく使うリソースの分析は網羅されていると思います。今後も機能追加されていくようなので
楽しみに待ちたいと思います。もし気になったら、是非使ってみてください!

ACS事業部のご紹介

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
www.ap-com.co.jp また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp

本記事の投稿者: 谷合純也
AKS/ACAをメインにインフラ系のご支援を担当しています。
junya0530さんの記事一覧 | Zenn