购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 实验的环境

2.1.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

2.1.2 命令说明

由于实验使用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系统宿主机上进行操作。

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集群的初始状态,再重新进行实验。 s2bsUxUZjpnXyu7QvQkWsuOnzS9lPpr0hgNen4pbLSKIMG0MZ/8uTldj8lmW6+0D

点击中间区域
呼出菜单
上一章
目录
下一章
×