2.1 实验的环境 |
|
在没有特殊说明的情况下,本书的实验是在Windows 10系统下进行的,在MacOS和Linux系统下也可以进行实验,并无太大差别。
考虑到不是每位读者都有足够的云主机或者物理机,本实验使用3台虚拟机来进行实验。虚拟机管理软件使用开源的Virtualbox,为了方便进行重复的快速实验,我们会使用Vagrant配合Virtualbox来进行虚拟机的管理,包括创建、启动、关闭虚拟机以及虚拟机的快照保存恢复等操作。
本实验对硬件有一些基本要求,否则可能会出现实验无法成功的现象。对CPU并没有太多要求,由于我们实验时会创建3台虚拟机,每台虚拟机会分配至少2G内存,所以这就要求至少有6G的空闲内存,加上系统本身的内存占用,所以推荐在进行实验时,电脑至少有8G内存。一般的机械硬盘就能满足实验条件,当然如果使用SSD硬盘会更好一些。硬盘推荐至少保留30G以上可用空间,虚拟机并不会占用这么多存储空间,但是由于我们会保存多个快照来快速恢复实验环境,这些快照需要占用大量的存储空间,所以综合起来可能需要30G的存储空间。
关于Virtualbox和Vagrant的安装不再详细描述,具体安装细节可以参考官方文档或者通过搜索引擎获取安装文档。本书实验时所使用的Virtualbox和Vagrant软件安装包以及后面会使用的Vagrant box文件可以到如下地址下载:https://pan.baidu.com/s/1Q8s4mnhj2ROnUzW1ZTn44Q。
由于在Kubernetes上部署Istio更加方便,并且能体验到最全功能,所以本书的实验会依赖Kubernetes环境。后面的章节会详细介绍如何通过Kubeadm部署Kubernetes集群。
实验中还会涉及Git的基本使用,所以也需要提前在系统上安装好对应操作系统的Git软件。由于Windows系统下默认的命令行终端CMD并不好用,所以在Windows系统上我会使用Git Bash作为默认的命令行终端。Git Bash是Windows系统上安装好Git软件后就自带的。当然,你也可以根据自己的喜好选择终端软件。
实验时使用Xshell软件来应用SSH远程登录到实验环境的Linux虚拟机,免费家用版本提供在一个窗口中最多可以同时打开4个会话终端,已经能满足我们的实验需求。Xshell只提供了Windows系统版本的软件,安装时一直点击“下一步”按钮就可以完成安装,详细安装步骤请查阅相关文档。MacOS和Linux系统的用户可以直接使用系统自带的终端来应用SSH远程登录到实验环境的Linux虚拟机。
默认情况下使用Virtualbox启动虚拟机时,虚拟机目录会存放在用户的主目录,如果Windows下C盘剩余空间过小,可能会由于硬盘空间不够,导致创建虚拟机失败。如果有需要,可以在命令行终端设置虚拟机的存放目录,先创建D:\virtualbox目录。如果提示找不到VBoxManage命令,可能需要把Virtualbox的安装目录添加到系统的PATH环境变量中。使用如下命令设置:
$ VBoxManage setproperty machinefolder D:\virtualbox $ VBoxManage list systemproperties | grep machine Default machine folder: D:virtualbox
由于实验使用Vagrant和Virtualbox来管理虚拟机集群环境。使用Vagrant创建的虚拟机一般情况下登录用户名为vagrant,当部署kubernetes集群或者其他安装软件的操作时,由于需要root权限,我们有时会直接切换到root用户来执行接下来的操作。当以vagrant用户登录虚拟机环境的Linux主机后,使用sudo su - root命令可临时切换到root用户来执行接下来的操作,这也可以从执行命令的提示符中看出,当以vagrant用户操作时,命令会以$符号来开头;而当以root用户操作时,命令会以#符号来开头。如下所示:
$ whoami vagrant # whoami root
本书所有实验中的命令执行操作如果没有特殊说明,普通用户的操作均是以vagrant用户执行。
本书实验内容的大部分代码和使用的Kubernetes以及Istio的yaml文件,都在 https://github.com/mgxian/istio-lab 仓库中。可使用如下方式获取源码:
$ git clone https://github.com/mgxian/istio-lab
如果没有安装Git,需要提前安装Git,可使用如下命令安装:
$ sudo yum install -y git
本书后面的大部分实验在执行kubectl和istioctl命令时,使用到的命令都是以仓库的根目录作为当前工作目录的,也就是说,当执行这两个命令时会先进入istio-lab目录,然后再执行相应的命令。
第3章之后(不包含第3章)的大部分实验操作,在没有特殊说明的情况下,都是在使用Xshell登录到实验环境虚拟机中后进行的操作,安装Git和下载实验中使用的源代码只需要在一台虚拟机上进行即可,一般会选择第一台虚拟机。只有管理虚拟机相关的操作命令比如:启动、停止、暂停虚拟机,才需要在Windows系统宿主机上进行操作。
由于实验虚拟机集群资源与性能的问题,可能会出现实验结果和书中展示的结果有所不同的情况,本小节主要介绍实验中可能会遇到的问题及解决方法。
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集群的初始状态,再重新进行实验。