文章目录
- 引言
- 实践体验
- 总结
引言
在现代应用程序开发中,Kubernetes(简称K8s)已经成为了容器编排的标准。Minikube作为一个轻量级的本地Kubernetes集群环境,为开发和测试提供了极大的便利。今天,我将分享如何在MacBook上使用k8sGPT扫描Minikube集群,以确保我们的Kubernetes集群设置和应用程序的最佳实践。
$ minikube start --nodes 2 -p multinode-demo
😄 Darwin 14.5 (arm64) 上的 [multinode-demo] minikube v1.33.1
✨ 自动选择 docker 驱动。其他选项:parallels, ssh
📌 使用具有 root 权限的 Docker Desktop 驱动程序
👍 Starting "multinode-demo" primary control-plane node in "multinode-demo" cluster
🚜 Pulling base image v0.0.44 ...
> gcr.io/k8s-minikube/kicbase...: 435.76 MiB / 435.76 MiB 100.00% 6.65 Mi
🔥 Creating docker container (CPUs=2, Memory=7792MB) ...
🌐 找到的网络选项:
▪ HTTP_PROXY=192.168.21.101:7890
❗ You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP (192.168.49.2).
📘 Please see https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/ for more details
▪ HTTPS_PROXY=192.168.21.101:7890
🐳 正在 Docker 26.1.1 中准备 Kubernetes v1.30.0…
▪ env HTTP_PROXY=192.168.21.101:7890
▪ env HTTPS_PROXY=192.168.21.101:7890
▪ 正在生成证书和密钥...
▪ 正在启动控制平面...
▪ 配置 RBAC 规则 ...
🔗 配置 CNI (Container Networking Interface) ...
🔎 正在验证 Kubernetes 组件...
▪ 正在使用镜像 gcr.io/k8s-minikube/storage-provisioner:v5
🌟 启用插件: default-storageclass, storage-provisioner
👍 Starting "multinode-demo-m02" worker node in "multinode-demo" cluster
🚜 Pulling base image v0.0.44 ...
🔥 Creating docker container (CPUs=2, Memory=7792MB) ...
🌐 找到的网络选项:
▪ NO_PROXY=192.168.49.2
▪ HTTP_PROXY=192.168.21.101:7890
❗ You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP (192.168.49.3).
📘 Please see https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/ for more details
▪ HTTPS_PROXY=192.168.21.101:7890
🐳 正在 Docker 26.1.1 中准备 Kubernetes v1.30.0…
▪ env HTTP_PROXY=192.168.21.101:7890
▪ env HTTPS_PROXY=192.168.21.101:7890
▪ env NO_PROXY=192.168.49.2
🔎 正在验证 Kubernetes 组件...
🏄 完成!kubectl 现在已配置,默认使用"multinode-demo"集群和"default"命名空间
$ kubectl get node
NAME STATUS ROLES AGE VERSION
multinode-demo Ready control-plane 2m3s v1.30.0
multinode-demo-m02 Ready <none> 103s v1.30.0
$ minikube status -p multinode-demo
multinode-demo
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
multinode-demo-m02
type: Worker
host: Running
kubelet: Running
$ minikube addons list
|-----------------------------|--------------------------------|
| ADDON NAME | MAINTAINER |
|-----------------------------|--------------------------------|
| ambassador | 3rd party (Ambassador) |
| auto-pause | minikube |
| cloud-spanner | Google |
| csi-hostpath-driver | Kubernetes |
| dashboard | Kubernetes |
| default-storageclass | Kubernetes |
| efk | 3rd party (Elastic) |
| freshpod | Google |
| gcp-auth | Google |
| gvisor | minikube |
| headlamp | 3rd party (kinvolk.io) |
| helm-tiller | 3rd party (Helm) |
| inaccel | 3rd party (InAccel |
| | [info@inaccel.com]) |
| ingress | Kubernetes |
| ingress-dns | minikube |
| inspektor-gadget | 3rd party |
| | (inspektor-gadget.io) |
| istio | 3rd party (Istio) |
| istio-provisioner | 3rd party (Istio) |
| kong | 3rd party (Kong HQ) |
| kubeflow | 3rd party |
| kubevirt | 3rd party (KubeVirt) |
| logviewer | 3rd party (unknown) |
| metallb | 3rd party (MetalLB) |
| metrics-server | Kubernetes |
| nvidia-device-plugin | 3rd party (NVIDIA) |
| nvidia-driver-installer | 3rd party (Nvidia) |
| nvidia-gpu-device-plugin | 3rd party (Nvidia) |
| olm | 3rd party (Operator Framework) |
| pod-security-policy | 3rd party (unknown) |
| portainer | 3rd party (Portainer.io) |
| registry | minikube |
| registry-aliases | 3rd party (unknown) |
| registry-creds | 3rd party (UPMC Enterprises) |
| storage-provisioner | minikube |
| storage-provisioner-gluster | 3rd party (Gluster) |
| storage-provisioner-rancher | 3rd party (Rancher) |
| volumesnapshots | Kubernetes |
| yakd | 3rd party (marcnuri.com) |
|-----------------------------|--------------------------------|
$ kubectl create deployment hello-minikube1 --image=kicbase/echo-server:1.0
deployment.apps/hello-minikube1 created
$ kubectl expose deployment hello-minikube1 --type=LoadBalancer --port=8080
service/hello-minikube1 exposed
$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default hello-minikube1-67bf99b564-jstcc 0/1 ContainerCreating 0 12s
kube-system coredns-7db6d8ff4d-85s2n 1/1 Running 2 (3m16s ago) 3m43s
kube-system etcd-multinode-demo 1/1 Running 0 3m57s
kube-system kindnet-wtzgz 1/1 Running 0 3m44s
kube-system kindnet-zwhtz 1/1 Running 0 3m39s
kube-system kube-apiserver-multinode-demo 1/1 Running 0 3m57s
kube-system kube-controller-manager-multinode-demo 1/1 Running 0 3m57s
kube-system kube-proxy-8t4fd 1/1 Running 0 3m39s
kube-system kube-proxy-dxhnv 1/1 Running 0 3m44s
kube-system kube-scheduler-multinode-demo 1/1 Running 0 3m57s
kube-system storage-provisioner 1/1 Running 1 (3m32s ago) 3m55s
$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default hello-minikube1-67bf99b564-jstcc 0/1 ContainerCreating 0 16s
kube-system coredns-7db6d8ff4d-85s2n 1/1 Running 2 (3m20s ago) 3m47s
kube-system etcd-multinode-demo 1/1 Running 0 4m1s
kube-system kindnet-wtzgz 1/1 Running 0 3m48s
kube-system kindnet-zwhtz 1/1 Running 0 3m43s
kube-system kube-apiserver-multinode-demo 1/1 Running 0 4m1s
kube-system kube-controller-manager-multinode-demo 1/1 Running 0 4m1s
kube-system kube-proxy-8t4fd 1/1 Running 0 3m43s
kube-system kube-proxy-dxhnv 1/1 Running 0 3m48s
kube-system kube-scheduler-multinode-demo 1/1 Running 0 4m1s
kube-system storage-provisioner 1/1 Running 1 (3m36s ago) 3m59s
$ brew install k8sgpt
==> Downloading https://formulae.brew.sh/api/formula.jws.json
############################################################################################################################################################################################################################################## 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
############################################################################################################################################################################################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/k8sgpt/manifests/0.3.40
############################################################################################################################################################################################################################################## 100.0%
==> Fetching k8sgpt
==> Downloading https://ghcr.io/v2/homebrew/core/k8sgpt/blobs/sha256:e22d500e85a13ae94bce5be3471eb9c2fc10b343fc335adb9fd6c39a9adfc9bd
############################################################################################################################################################################################################################################## 100.0%
==> Pouring k8sgpt--0.3.40.arm64_sonoma.bottle.tar.gz
🍺 /opt/homebrew/Cellar/k8sgpt/0.3.40: 7 files, 89.3MB
==> Running `brew cleanup k8sgpt`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
$ k8sgpt generate
Opening: https://beta.openai.com/account/api-keys to generate a key for openai
Please copy the generated key and run `k8sgpt auth add` to add it to your config file
$ k8sgpt auth add
Warning: backend input is empty, will use the default value: openai
Warning: model input is empty, will use the default value: gpt-3.5-turbo
Enter openai Key: openai added to the AI backend provider list
$ k8sgpt analyze --explain
AI Provider: openai
No problems detected
$ k8sgpt analyze --explain --with-doc
AI Provider: openai
No problems detected
$ k8sgpt analyze --explain --filter=Pod --namespace=default
AI Provider: openai
No problems detected
$ k8sgpt analyze --explain --filter=Service --output=json
{
"provider": "openai",
"errors": null,
"status": "OK",
"problems": 0,
"results": null
}
$ k8sgpt analyze --explain --filter=Service --output=json --anonymize
{
"provider": "openai",
"errors": null,
"status": "OK",
"problems": 0,
"results": null
}
$ k8sgpt filters list
Active:
> PersistentVolumeClaim
> Ingress
> Deployment
> ReplicaSet
> Service
> StatefulSet
> CronJob
> Node
> ValidatingWebhookConfiguration
> MutatingWebhookConfiguration
> Pod
Unused:
> Log
> GatewayClass
> Gateway
> HTTPRoute
> HorizontalPodAutoScaler
> PodDisruptionBudget
> NetworkPolicy
$ k8sgpt filters add Log
Warning: by enabling logs, you will be sending potentially sensitive data to the AI backend.
Filter Log added
$ k8sgpt filters list
Active:
> Service
> Node
> StatefulSet
> CronJob
> Log
> Ingress
> MutatingWebhookConfiguration
> ValidatingWebhookConfiguration
> Pod
> Deployment
> ReplicaSet
> PersistentVolumeClaim
Unused:
> HorizontalPodAutoScaler
> PodDisruptionBudget
> NetworkPolicy
> GatewayClass
> Gateway
> HTTPRoute
$ k8sgpt auth list
Default:
> openai
Active:
> openai
Unused:
> localai
> ollama
> azureopenai
> cohere
> amazonbedrock
> amazonsagemaker
> google
> noopai
> huggingface
> googlevertexai
> oci
> watsonxai
$ minikube stop -p multinode-demo
✋ 正在停止节点 "multinode-demo-m02" ...
🛑 正在通过 SSH 关闭“multinode-demo-m02”…
✋ 正在停止节点 "multinode-demo" ...
🛑 正在通过 SSH 关闭“multinode-demo”…
🛑 2 个节点已停止。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a65b1bbc03 gcr.io/k8s-minikube/kicbase:v0.0.44 "/usr/local/bin/entr…" 45 minutes ago Exited (130) 48 seconds ago multinode-demo-m02
0f2e98799a5a gcr.io/k8s-minikube/kicbase:v0.0.44 "/usr/local/bin/entr…" 45 minutes ago Exited (130) 37 seconds ago multinode-demo
b3c3c3c6fec6 ghcr.io/open-webui/open-webui:main "bash start.sh" 3 months ago Exited (0) 13 days ago open-webui
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.
- 258.
- 259.
- 260.
- 261.
- 262.
- 263.
- 264.
实践体验
在我的实践中,k8sGPT帮助我发现了一些常见的配置问题,如资源限制未设置、未使用最新的镜像版本等。这些问题可能看起来微不足道,但在生产环境中可能会导致性能下降或安全隐患。
此外,k8sGPT还建议了很多优化措施,例如使用ConfigMap和Secret来管理配置数据,避免将敏感信息直接硬编码到Pod中。通过这些建议,我的Minikube集群变得更加健壮和高效。
总结
通过在MacBook上使用k8sGPT扫描Minikube集群,我们可以快速发现和解决Kubernetes集群中的潜在问题。Minikube提供了一个方便的本地开发环境,而k8sGPT则为集群的健康和优化提供了强有力的支持。希望这篇文章能帮助你在使用Kubernetes时更加得心应手。如果你还没有尝试过k8sGPT,强烈推荐你在你的开发环境中试试它。
参考: