我正在努力在裸机实例上使用 MetalLB、Kubernetes、Istio 进行配置的最后一步,即通过 Istio VirtualService 路由将网页从服务返回到外部世界。我刚刚将实例更新为
- MetalLB(版本 0.7.3)
- Kubernetes(版本 1.12.2)
- Istio(版本 1.0.3)
我将从有效的方法开始。
所有补充服务都已部署,并且大部分都在工作:
- http://localhost:8001上的 Kubernetes 仪表板
- http://localhost:10010上的 Prometheus 仪表板(我在 9009 上还有其他内容)
- http://localhost:15000上的 Envoy 管理员
- http://localhost:3000上的 Grafana(Istio 仪表板)
- http://localhost:16686上的 Jaeger
我说的最多是因为自从升级到 Istio 1.0.3 后,我在 Jaeger 仪表板中丢失了来自 istio-ingressgateway 的遥测数据,我不知道如何将其恢复。我已经放弃了 pod 并重新创建,但没有用。
除此之外,MetalLB 和 K8S 似乎工作正常,并且负载均衡器配置正确(使用 ARP)。
kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 10.109.247.149 <none> 3000/TCP 9d
istio-citadel ClusterIP 10.110.129.92 <none> 8060/TCP,9093/TCP 28d
istio-egressgateway ClusterIP 10.99.39.29 <none> 80/TCP,443/TCP 28d
istio-galley ClusterIP 10.98.219.217 <none> 443/TCP,9093/TCP 28d
istio-ingressgateway LoadBalancer 10.108.175.231 192.168.1.191 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30805/TCP,8060:32514/TCP,853:30601/TCP,15030:31159/TCP,15031:31838/TCP 28d
istio-pilot ClusterIP 10.97.248.195 <none> 15010/TCP,15011/TCP,8080/TCP,9093/TCP 28d
istio-policy ClusterIP 10.98.133.209 <none> 9091/TCP,15004/TCP,9093/TCP 28d
istio-sidecar-injector ClusterIP 10.102.158.147 <none> 443/TCP 28d
istio-telemetry ClusterIP 10.103.141.244 <none> 9091/TCP,15004/TCP,9093/TCP,42422/TCP 28d
jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP,5778/TCP 27h
jaeger-collector ClusterIP 10.104.66.65 <none> 14267/TCP,14268/TCP,9411/TCP 27h
jaeger-query LoadBalancer 10.97.70.76 192.168.1.193 80:30516/TCP 27h
prometheus ClusterIP 10.105.176.245 <none> 9090/TCP 28d
zipkin ClusterIP None <none> 9411/TCP 27h
我可以使用以下方法公开我的部署:
kubectl expose deployment enrich-dev --type=LoadBalancer --name=enrich-expose
一切正常,我可以从外部负载平衡 IP 地址访问网页(此后我删除了暴露的服务)。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
enrich-expose LoadBalancer 10.108.43.157 192.168.1.192 31380:30170/TCP 73s
enrich-service ClusterIP 10.98.163.217 <none> 80/TCP 57m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 36d
如果我在默认命名空间中创建 K8S 服务(我尝试了多个)
apiVersion: v1
kind: Service
metadata:
name: enrich-service
labels:
run: enrich-service
spec:
ports:
- name: http
port: 80
protocol: TCP
selector:
app: enrich
接着是网关和路由(VirtualService),我得到的唯一响应是网格外的 404。您会在网关中看到我使用保留字网格,但我已经尝试过这两种方法并命名特定网关。我还为特定的 URI 和端口尝试了不同的匹配前缀,您可以在下面看到。
网关
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: enrich-dev-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
虚拟服务
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: enrich-virtualservice
spec:
hosts:
- "enrich-service.default"
gateways:
- mesh
http:
- match:
- port: 80
route:
- destination:
host: enrich-service.default
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: enrich-destination
spec:
host: enrich-service.default
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
subsets:
- name: v1
labels:
app: enrich
我已经仔细检查了它不是在播放 DNS,因为我可以通过busybox 或使用 K8S 仪表板进入入口网关的外壳
并做两个
nslookup enrich-service.default
和
curl -f http://enrich-service.default/
并且两者都成功运行,所以我知道 ingress-gateway pod 可以看到这些。Sidecar 在默认命名空间和 istio-system 命名空间中都设置为自动注入。
入口网关的日志显示 404:
[2018-11-01T03:07:54.351Z] "GET /metadataHTTP/1.1" 404 - 0 0 1 - "192.168.1.90" "curl/7.58.0" "6c1796be-0791-4a07-ac0a-5fb07bc3818c" "enrich-service.default" "-" - - 192.168.224.168:80 192.168.1.90:43500
[2018-11-01T03:26:39.339Z] "GET /HTTP/1.1" 404 - 0 0 1 - "192.168.1.90" "curl/7.58.0" "ed956af4-77b0-46e6-bd26-c153e29837d7" "enrich-service.default" "-" - - 192.168.224.168:80 192.168.1.90:53960
192.168.224.168:80 是网关的 IP 地址。192.168.1.90:53960 是我的外部客户端的 IP 地址。
任何建议,我已经尝试从多个角度进行几天了,我觉得我只是错过了一些简单的东西。建议的日志可能会看?