K8sGPT+Ollama:免費的 Kubernetes 自動化診斷方案
周末檢查博客草稿,發現了這篇。記得當時是與 Kubernetes 自動化診斷工具:k8sgpt-operator 的方案,由于之前試過 Ollama[1],感覺使用起來也更加友好,而且 Ollama 同樣提供了 對 OpenAI API 的支持[2],索性改成用 Ollama 吧。
介紹 k8sgpt-operator 的文章發布后,有小伙伴反饋 OpenAI 的使用門檻,這個問題確實比較棘手,但也不是不能解決。不過本文并不是介紹如何解決這種問題的,而是介紹 OpenAI 的替代方案: Ollama。
對 k8sgpt 和 k8sgpt-operator 就不做過多介紹了,有興趣的可以看回 上一篇。
1. 安裝 Ollama
Ollama 是一個開源的大模型工具,使用它可以在本地或云端輕松的安裝和運行 多種流量的大模型[3]。它的操作非常友好,只需簡單的命令就能運行。在 macOS 上可以通過 homebrew 一鍵安裝:
brew install ollama
當前最新的版本是 0.1.44。
ollama -v
Warning: could not connect to a running Ollama instance
Warning: client version is 0.1.44
在 Linux 上也可以通過官方的腳本一鍵安裝。
curl -sSL https://ollama.com/install.sh | sh
啟動 Ollama,通過環境變量將 Ollama 的監聽地址設置為 0.0.0.0,便于后面從容器或者 K8s 集群訪問。
OLLAMA_HOST=0.0.0.0 ollama start
...
time=2024-06-16T07:54:57.329+08:00 level=INFO source=routes.go:1057 msg="Listening on 127.0.0.1:11434 (version 0.1.44)"
time=2024-06-16T07:54:57.329+08:00 level=INFO source=payload.go:30 msg="extracting embedded files" dir=/var/folders/9p/2tp6g0896715zst_bfkynff00000gn/T/ollama1722873865/runners
time=2024-06-16T07:54:57.346+08:00 level=INFO source=payload.go:44 msg="Dynamic LLM libraries [metal]"
time=2024-06-16T07:54:57.385+08:00 level=INFO source=types.go:71 msg="inference compute" id=0 library=metal compute="" driver=0.0 name="" total="21.3 GiB" available="21.3 GiB"
2. 下載并運行大模型
Llama3 流行的大模型之一,由 Meta 在 4 月開源。Llama3 有兩個版本:8B 和 70B。
我是在 macOS 上運行,所以選擇 8B 的版本。8B 的版本大小 4.7 GB,網速快的話 3-4 分鐘就可以完成下載。
ollama run llama3
我是 m1 pro + 32g 內存,啟動 12s 多。
time=2024-06-17T09:30:25.070+08:00 level=INFO source=server.go:572 msg="llama runner started in 12.58 seconds"
執行一次 query 的時間在 14s 左右。
curl http://localhost:11434/api/generate -d '{
"model": "llama3",
"prompt": "Why is the sky blue?",
"stream": false
}'
....
"total_duration":14064009500,"load_duration":1605750,"prompt_eval_duration":166998000,"eval_count":419,"eval_duration":13894579000}
3. 配置 K8sGPT CLI 后端
如果你想測試 k8sgpt-operator,可以跳過這一步。
我們將使用 Ollama REST API 作為 k8sgpt 的后端,作為推理的 provider,這里后端類型選擇 localai。因為 LocalAI[4] 與 Ollama 同樣兼容 OpenAI API,真正的 provider 還是 Ollama 運行的 Llama。
k8sgpt auth add --backend localai --model llama3 --baseurl http://localhost:11434/v1
同時將其設置成默認的 provider。
k8sgpt auth default --provider localai
Default provider set to localai
測試:
我們在 k8s 上創建一個 pod,使用鏡像 image-not-exit。
kubectl get po k8sgpt-test
NAME READY STATUS RESTARTS AGE
k8sgpt-test 0/1 ErrImagePull 0 6s
使用 k8sgpt 對錯誤進行分析。
k8sgpt analyze --explain --filter=Pod --=default --output=json
{
"provider": "localai",
"errors": null,
"status": "ProblemDetected",
"problems": 1,
"results": [
{
"kind": "Pod",
"name": "default/k8sgpt-test",
"error": [
{
"Text": "Back-off pulling image \"image-not-exist\"",
"KubernetesDoc": "",
"Sensitive": []
}
],
"details": "Error: Back-off pulling image \"image-not-exist\"\n\nSolution: \n1. Check if the image exists on Docker Hub or your local registry.\n2. If not, create the image using a Dockerfile and build it.\n3. If the image exists, check the spelling and try again.\n4. Verify the image repository URL in your Kubernetes configuration file (e.g., deployment.yaml).",
"parentObject": ""
}
]
}
4. 部署并配置 k8sgpt-operator
k8sgpt-operator 可以在集群中開啟自動化的 k8sgpt。可以通過 Helm 來安裝
helm repo add k8sgpt https://charts.k8sgpt.ai/
helm repo update
helm install release k8sgpt/k8sgpt-operator -n k8sgpt --create-namespace
k8sgpt-operator 提供了兩個 CRD:K8sGPT 配置 k8sgpt;Result 輸出分析結果。
kubectl api-resources | grep -i gpt
k8sgpts core.k8sgpt.ai/v1alpha1 true K8sGPT
results core.k8sgpt.ai/v1alpha1 true Result
配置 K8sGPT,這里 baseUrl 要使用 Ollama 的 IP 地址。
kubectl apply -n k8sgpt -f - << EOF
apiVersion: core.k8sgpt.ai/v1alpha1
kind: K8sGPT
metadata:
name: k8sgpt-ollama
spec:
ai:
enabled: true
model: llama3
backend: localai
baseUrl: http://198.19.249.3:11434/v1
noCache: false
filters: ["Pod"]
repository: ghcr.io/k8sgpt-ai/k8sgpt
version: v0.3.8
EOF
創建 CR K8sGPT 之后,operator 會自動為其創建 Pod。檢查 CR Result 也可以看到同樣的結果。
kubectl get result -n k8sgpt -o jsnotallow='{.items[].spec}' | jq .
{
"backend": "localai",
"details": "Error: Kubernetes is unable to pull the image \"image-not-exist\" due to it not existing.\n\nSolution: \n1. Check if the image actually exists.\n2. If not, create the image or use an alternative one.\n3. If the image does exist, ensure that the Docker daemon and registry are properly configured.",
"error": [
{
"text": "Back-off pulling image \"image-not-exist\""
}
],
"kind": "Pod",
"name": "default/k8sgpt-test",
"parentObject": ""
}
參考資料
[1] Ollama: https://ollama.com
[2] 對 OpenAI API 的支持: https://github.com/ollama/ollama/blob/main/docs/openai.md
[3] 多種流量的大模型: https://ollama.com/library
[4] LocalAI: https://localai.io