周末检查了我的博客草稿,发现了这篇。我记得大约一年前用中文发布的“Kubernetes 自动诊断工具:k8sgpt-operator”。我的拖延似乎已经到了一个临界点。最初,我计划使用 K8sGPT + LocalAI。试用了 Ollama 后,我发现它更方便。Ollama 同样支持 OpenAI API,因此我决定改用 Ollama。
发布介绍 k8sgpt 的文章后,一些读者提到使用 OpenAI 存在较高的门槛。这个问题确实有挑战性,但并不是无法克服的。然而,这篇文章并不是为了解决这个问题而写的,而是要介绍一个 OpenAI 的替代方案:Ollama。去年底,k8sgpt 加入了 CNCF 沙盒(https://landscape.cncf.io/?item=observability-and-analysis--observability--k8sgpt)。
Ollama 是一个开源的大模型工具,允许您轻松地在本地或云中安装并运行各种大型模型,例如。它非常易于使用,并且通过简单的命令即可运行。在 macOS 上,您可以使用 homebrew 只需一条命令即可完成安装:
运行此命令来安装ollama:
brew install ollama
最新版本是0.1.44。
ollama -v 警告:无法连接到正在运行的 Ollama 实例 警告:客户端版本是 0.1.44
在 Linux 上,你也可以用官方脚本安装它。
执行以下命令来安装ollama: curl -sSL https://ollama.com/install.sh | sh
启动 Ollama 后,通过环境变量设置将监听地址设置为 0.0.0.0
,以便从容器或 Kubernetes 集群中进行访问。
OLLAMA_HOST=0.0.0.0 启动 ollama
... time=2024-06-16T07:54:57.329+08:00 level=INFO source=routes.go:1057 msg="监听在 127.0.0.1:11434(版本 0.1.44)" time=2024-06-16T07:54:57.329+08:00 level=INFO source=payload.go:30 msg="正在提取嵌入文件" 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="动态 LLM 库:metal" time=2024-06-16T07:54:57.385+08:00 level=INFO source=types.go:71 msg="推断计算任务" id=0 library=metal compute="" driver=驱动版本:0.0 name="" total="21.3 GiB" available="可用:21.3 GiB"
Llama3是由Meta在4月开源的一个流行大型模型。Llama3有两个版本:8B和70B。
我在macOS上使用它,所以我选了8B版本。8B版本是4.7GB,在高速互联网下,下载只需要3到4分钟。
ollama run llama3
在我的M1 Pro上,拥有32GB内存,启动大概要12秒。
time=2024-06-17T09:30:25.070+08:00 level=INFO source=server.go:572 msg=llama runner 启动成功,耗时 12.58 秒
每个查询大约要花14秒。
curl http://localhost:11434/api/generate -d '{ "model": "llama3", "prompt": "天空为什么是蓝色的呢?", "stream": false }'
.... "total_duration":14064009500,"load_duration":1605750,"prompt_eval_duration":166998000,"eval_count":419,"eval_duration":13894579000}
如果你想测试 k8sgpt-operator,这步可以跳过。
我们将使用Ollama REST API作为k8sgpt的后端,提供推理服务。我们将后端类型选择为localai
,因为LocalAI与OpenAI API兼容,而实际的推理提供者仍然是运行Llama模型的Ollama。
运行以下命令来添加认证信息,使用本地AI模型:
k8sgpt auth add --backend localai --model llama3 --baseurl http://localhost:11434/v1
请确保你已经安装了k8sgpt工具。
将其设置为默认服务商。
k8sgpt 配置 默认 --默认提供者 localai 默认提供者已设置为 localai
试一试。
在 k8s 里用不存在的镜像 image-not-exist
创建一个 pod
kubectl get po k8sgpt-test NAME READY STATUS RESTARTS AGE k8sgpt-test 0/1 镜像拉取错误 0 6秒
名称\t就绪状态\t重启次数\t持续时间
用k8sgpt分析这个错误。
k8sgpt 分析 --解释 --筛选=Pod --命名空间=default --输出=json
{ "provider": "localai", "errors": null, "status": "状态:检测到问题", "problems": 1, "results": [ { "kind": "Pod", "name": "default/k8sgpt-test", "error": [ { "Text": "拉取 'image-not-exist' 镜像时出现回退", "KubernetesDoc": "", "Sensitive": [] } ], "details": "错误: 拉取 'image-not-exist' 镜像时出现回退\n\n解决方案: \n1. 检查 Docker Hub 或您的本地仓库中是否存在该镜像。\n2. 如果不存在,请创建并构建 Dockerfile。\n3. 如果镜像存在,请检查镜像的拼写并重试。\n4. 验证 Kubernetes 配置文件(例如 deployment.yaml 中的)镜像仓库 URL。", "parentObject": "" } ] }
k8sgpt-operator 可以自动化集群中的 k8sgpt。您可以使用 Helm 进行安装。
helm 仓库添加 k8sgpt https://charts.k8sgpt.ai/ # 添加 Helm 仓库 helm 仓库更新 # 更新 Helm 仓库 helm 安装发布 release k8sgpt/k8sgpt-operator -n k8sgpt --create-namespace # 安装名为 release 的发布,使用 k8sgpt 命名空间并创建命名空间 k8sgpt
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 结果
注:k8sgpts
和 results
是与 Kubernetes 和 GPT 模型相关的技术术语,分别代表 K8sGPT 实例和操作结果。
配置 K8sGPT
,将 Ollama 的 IP 地址设置为 baseUrl
。
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
创建 K8sGPT
CR 之后,控制器将自动为其创建一个 pod。检查 Result
CR 结果相同。
kubectl get result -n k8sgpt -o jsonpath='{.items[].spec}' | jq . { "backend": "localai", "details": "错误:Kubernetes 无法拉取图像“image-not-exist”,因为它不存在的原因。\n\n解决方法:\n1. 检查图像是否实际存在,\n2. 如果不存在,请创建该图像或使用替代的图像。\n3. 如果图像存在,请确保 Docker 守护程序和注册表配置正确。", "error": [ { "text": "回退拉取图像“image-not-exist”" } ], "kind": "Pod", "name": "default/k8sgpt-test", "parentObject": "" }