在MacOS主机的Multipass+MicroK8S环境部署KNative服务失败求助
在MacOS主机的Multipass(采用hyperkit虚拟化方案)中部署MicroK8S+KNative,已启用DNS插件、使用metallb作为Ingress控制器,尝试创建KNative服务时出现以下错误:
ubuntu@uncommon-javelin:~/sandbox/sessions/serverless_k8s/yaml$ kn service create nginx --image nginx --port 80 Error: Internal error occurred: failed calling webhook "webhook.serving.knative.dev": failed to call webhook: Post "https://webhook.knative-serving.svc:443/defaulting?timeout=10s": dial tcp 10.152.183.167:443: connect: connection refused Run 'kn --help' for usage
ping报错中的IP地址10.152.183.167超时,推测该IP存在访问限制或未正确绑定服务,以下是相关配置文件:
相关配置文件
ingress-service.yaml
apiVersion: v1 kind: Service metadata: name: ingress namespace: ingress spec: selector: name: nginx-ingress-microk8s type: LoadBalancer ports: - name: http protocol: TCP port: 80 targetPort: 80 - name: https protocol: TCP port: 443 targetPort: 443
metallb测试服务(test-service.yaml)
apiVersion: v1 kind: Service metadata: name: test-service annotations: metallb.univers.tf/address-pool: custom-addresspool spec: selector: name: nginx type: LoadBalancer ports: - protocol: TCP port: 80 targetPort: 80
metallb地址池(address-pool.yaml)
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: custom-addresspool namespace: metallb-system spec: addresses: - 192.168.1.1-192.168.1.100
排查步骤
检查KNative Serving组件状态
运行命令查看knative-serving命名空间下的Pod是否正常启动:kubectl get pods -n knative-serving如果webhook相关Pod处于Pending、CrashLoopBackOff状态,优先修复Pod异常(比如镜像拉取失败、资源配额不足)。
验证Webhook Service的合法性
检查webhook服务是否存在:kubectl get svc webhook -n knative-serving确认输出的ClusterIP是否为报错中的
10.152.183.167,如果服务不存在,需重新部署KNative Serving组件。测试集群内部DNS解析
确认CoreDNS组件正常运行:kubectl get pods -n kube-system -l k8s-app=kube-dns在临时Pod中测试webhook服务的DNS解析:
kubectl run -it --rm --image=busybox:1.28 dns-test -- nslookup webhook.knative-serving.svc.cluster.local如果解析失败,检查MicroK8S的DNS插件状态:
microk8s status,未启用则执行microk8s enable dns。排查Metallb配置与网络冲突
- 确认Metallb控制器Pod正常运行:
kubectl get pods -n metallb-system - 检查地址池是否被正确识别:
kubectl describe ipaddresspools.metallb.io custom-addresspool -n metallb-system - 注意:Multipass的hyperkit默认采用NAT网络,
192.168.1.1-192.168.1.100可能与主机局域网IP段冲突,建议改为Multipass虚拟机所在子网(可通过microk8s kubectl get nodes -o wide查看节点IP)。
- 确认Metallb控制器Pod正常运行:
确认Ingress控制器适配KNative要求
KNative需要Ingress控制器支持HTTP/2,检查nginx-ingress的配置:kubectl get configmap nginx-config -n ingress -o yaml若
data字段中无http2: "true",添加后重启nginx-ingress Pod:kubectl rollout restart deployment nginx-ingress-microk8s -n ingress验证集群内部网络连通性
在临时Pod中测试对webhook IP的连通性:kubectl run -it --rm --image=busybox:1.28 net-test -- ping 10.152.183.167如果不通,检查MicroK8S默认CNI(calico)的状态:
kubectl get pods -n kube-system -l k8s-app=calico-node
内容的提问来源于stack exchange,提问作者CGideon

