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