《Istio入门与实战》 ——2.1.3 问题及解决方案
2.1.3 问题及解决方案
由于实验虚拟机集群资源与性能的问题,可能会出现实验结果和书中展示的结果有所不同的情况,本小节主要介绍实验中可能会遇到的问题及解决方法。
1. 路由不生效
在进行服务路由等功能验证时,很有可能会出现路由不生效的问题。当创建路由后,由于机器性能问题,导致服务路由信息传播速度慢,如果立即访问测试,就很有可能会出现与书中展示的结果不同的现象,此时可以稍等片刻,让服务路由信息传播完成,再进行访问测试。或者删除路由规则,再重新创建。当然,你也可以重启Pilot组件,这通常是最快的解决方法。另外,也可以通过如下介绍的方式深入地排查问题。
创建路由后,可以通过如下命令查看路由的分发情况:
$ istioctl proxy-status
PROXY CDS LDS
EDS RDS PILOT VERSION
dns-test.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
istio-egressgateway-7dc5cbbc56-fvjxm.istio-system SYNCED SYNCED SYNCED (100%) NOT SENT istio-pilot-64958c46fc-jsn48 1.0.2
istio-ingressgateway-7958d776b5-wwmx2.istio-system SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-go-v1-7cc5c6f574-m7xtn.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-go-v2-7656dcc478-dk2sz.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-js-v1-55756d577-4vxsh.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-js-v2-86bdfc86d9-9gpcj.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-lua-v1-5c9bcb7778-zkgdm.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-lua-v2-75cb5cdf8-hzns6.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-node-v1-d44b9bf7b-4glm7.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-node-v2-86545d9796-nml56.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-python-v1-79fc5849fd-p7cgn.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
service-python-v2-7b6864b96b-7w6jw.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-jsn48 1.0.2
当路由中的状态都为SYNCED,不存在Stale状态时,表明路由已经分发完成。此时再进行访问测试,一般情况下不会再出现问题。istio-egressgateway和istio-ingressgateway会有部分状态为NOT SENT,这是正常的,因为如果没有创建过Gateway,就不会发送RDS给istio-egressgateway和istio-ingressgateway,此时的状态就为NOT SENT。
此外,还可以通过查看Pod日志观察Envoy有无接收到最新的路由规则,可以通过如下方式查看日志:
$ INGRESS_GATEWAY_POD=$(kubectl get pod -n istio-system | grep istio-ingressgateway | awk '{print $1}')
$ kubectl logs -f $INGRESS_GATEWAY_POD -n istio-system
有时候也可能会出现使用istioctl proxy-status不能获取全部Pod的路由同步状态的情况,或者使用istioctl proxy-status获取到的状态都是正常状态,但路由仍然没有生效,此时可能是由于Pilot处于异常状态。可以使用如下的方式重启Pilot实例:
$ kubectl delete pod -n istio-system $(kubectl get pod -l app=pilot -n istio-system -o jsonpath='{.items[*].metadata.name}')
$ kubectl get pod -l app=pilot -n istio-system
NAME READY STATUS RESTARTS AGE
istio-pilot-5fb59666cb-7jnt6 2/2 Running 0 37s
$ kubectl logs -f -n istio-system $(kubectl get pod -l app=pilot -n istio-system -o jsonpath='{.items[*].metadata.name}') discovery
当然,你也可以参考本书第12章中关于路由不生效的排错步骤来进行问题排查。
2. 应用路由规则时出现超时错误
在实验中创建路由规则时,无法成功创建或更新,出现如下的超时错误信息:
Error from server (Timeout): error when applying patch:
...
for: "istio/route/virtual-service-go-canary.yaml": Timeout: request did not complete within requested timeout 30s
这一般是由于Istio中的Galley组件出现了问题,使用如下命令重启Galley组件即可解决:
$ kubectl delete pod -n istio-system $(kubectl get pod -l istio=galley -n istio-system -o jsonpath='{.items[*].metadata.name}')
$ kubectl get pod -l istio=galley -n istio-system
NAME READY STATUS RESTARTS AGE
istio-galley-545b6b8f5b-kkdgk 1/1 Running 0 9s
3. 自动注入失败
创建Pod时,提示如下的错误信息:
Error from server (InternalError): error when creating "kubernetes/dns-test.yaml": Internal error occurred: failed calling admission webhook "sidecar-injector.istio.io": Post https://istio-sidecar-injector.istio-system.svc:443/inject?timeout=30s: dial tcp 10.97.113.82:443: connect: connection refused
创建或扩容Deployment时,没有创建出对应数量的Pod,查看Deployment对应的ReplicaSet信息,可以看到如下所示的错误信息:
$ kubectl describe rs $(kubectl get rs -l app=service-go,version=v1 -o jsonpath='{.items[*].metadata.name}')
Name: service-go-v1-7cc5c6f574
Namespace: default
Selector: app=service-go,pod-template-hash=7cc5c6f574,version=v1
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreate 28s (x4 over 119s) replicaset-controller Error creating: Internal error occurred: failed calling admission webhook "sidecar-injector.istio.io": Post https://istio-sidecar-injector.istio-system.svc:443/inject?timeout=30s: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
Warning FailedCreate 17s replicaset-controller Error creating: Internal error occurred: failed calling admission webhook "sidecar-injector.istio.io": Post https://istio-sidecar-injector.istio-system.svc:443/inject?timeout=30s: unexpected EOF
Warning FailedCreate 12s (x5 over 17s) replicaset-controller Error creating: Internal error occurred: failed calling admission webhook "sidecar-injector.istio.io": Post https://istio-sidecar-injector.istio-system.svc:443/inject?timeout=30s: dial tcp 10.97.113.82:443: connect: connection refused
这一般是由于Istio中的Sidecar-injector组件出现了问题,使用如下命令重启Sidecar-injector组件即可解决:
$ kubectl delete pod -n istio-system $(kubectl get pod -l istio=sidecar-injector -n istio-system -o jsonpath='{.items[*].metadata.name}')
kubectl get pod -l istio=sidecar-injector -n istio-system
NAME READY STATUS RESTARTS AGE
istio-sidecar-injector-99b476b7b-sc8k5 1/1 Running 0 13s
有时也可能碰到其他异常问题,比如:拉取镜像失败,可能是由于Virtualbox的nat网络出了问题,这些问题一般都无法快速解决,甚至没有办法解决,不用浪费太多时间在这些异常问题上。可以尝试使用虚拟机的快照功能,直接恢复虚拟机环境到创建好Istio集群的初始状态,再重新进行实验。
- 点赞
- 收藏
- 关注作者
评论(0)