本文基于istio官方文档。
试验环境是一个3节点的k8s集群,k8s版本是1.21。
1.下载istio到istio的发布页面,此时版本为1.10.2,下载并解压缩:
wget
进入解压缩后的安装包目录:
├──bin该目录下包含客户端二进制文件istioctl├──LICENSE├──manifests├──├──├──samples该目录下包含示例的应用程序└──tools
将istioctl添加到系统PATH环境变量:
exportPATH=$PWD/bin:$PATH
添加成功后可以直接使用istioctl打印一下版本信息:
istioctlversionnorunningIstiopodsin"istio-system"1.10.2安装istio
istio为我们内置了一组安装配置的profile(configprofiles)。这些profile配置提供了对istio控制平面和istio数据平面sidecar的定制内容。这些profile有default,demo,minimal,remote,empty,preview。生产环境部署istio时建议使用defaultprofile,而演示和评估istio建议部署demoprofile,关于profile的更多内容可以查看官方文档。
本节的目的是快速部署和评估istio,因此选择demoprofile,它包含了一组专为测试准备的功能集合。
istioctlinstall--setprofile=demo-y✔Istiocoreinstalled✔Istiodinstalled✔Ingressgatewaysinstalled✔Egressgatewaysinstalled✔
安装完成后,查看一下namespaceistio-system下的Pod和Service:
kubectlgetpod-nistio-systemNAMEREADYSTATUSRESTARTSAGEistio-egressgateway-7d4f75956-kfpk61/1Running07m11sistio-ingressgateway-5d57955454-945lq1/1Running07m11sistiod-6f6c6bbbbd-4286r1/1Running012mkubectlgetsvc-nistio-systemNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)/TCP,443/:31723/TCP,80:30709/TCP,443:31482/TCP,31400:32432/TCP,15443:31499//TCP,15012/TCP,443/TCP,15014/TCP13m
可以看出部署了istiod,istio-ingressgateway,istio-egressgateway。部署成功后再次使用istioctl查看版本,显示下面的信息:
istioctlversionclientversion:1.10.2controlplaneversion:1.10.2dataplaneversion:1.10.2(2proxies)
因为后边要部署的示例应用是部署在defaultnamespace中的,下面给defaultnamespace添加istio-injection=enabled标签,指示后续在此namespace部署应用时,自动注入envoysidecar(边车)代理。
kubectllabelnamespacedefaultistio-injection=enabled3.部署示例应用
下面部署bookinfo示例应用,bookinfo这个应用是一个在线书店的演示系统,由4个单独的微服务组成,可用于演示各种istio的特性。关于bookinfo应用的更多内容可查看官方文档。
kubectlapply-fsamples/bookinfo/platform/kube//detailscreatedserviceaccount//details-v1createdservice/ratingscreatedserviceaccount//ratings-v1createdservice/reviewscreatedserviceaccount////reviews-v3createdservice/productpagecreatedserviceaccount//productpage-v1created
确认defaultnamespace下bookinfo下的每个pod都正常启动:
kubectlgetpodNAMEREADYSTATUSRESTARTSAGEdetails-v1-79f774bdb9-5g8zh2/2Running08mproductpage-v1-6b746f74dc-kldg72/2Running08mratings-v1-b6994bb9-htn5x2/2Running08mreviews-v1-545db77b95-g7nw72/2Running08mreviews-v2-7bf8c9648f-wrcqq2/2Running08mreviews-v3-84779c7bbc-xgmlf2/2Running08mkubectlgetserviceNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)/////TCP8m
上面这些pod的容器数量都是2,Istio的边车代理容器istio-proxy也被自动注入随之启动。
运行下面的命令进行验证,确认访问productpage服务可以返回页面标题:
kubectlexec"$(kubectlgetpod-lapp=ratings-ojsonpath='{.items[0].}')"-cratings--curl-sproductpage:9080/productpage|grep-o"title.*/title"此时Bookinfo应用虽然已经部署,但还不能被外界访问。需要创建IngressGateway(Istio入站网关)在网格边缘把一个路径映射到路由。
将应用关联到istio网关:
kubectlapply-fsamples/bookinfo/networking///bookinfocreated4.从集群外部访问bookinfo应用
因为这里使用的k8s集群没有clouddriver和外部负载均衡器,Serviceistio-ingressgateway的ExternalIP是处于Ping状态的。
kubectlgetsvcistio-ingressgateway-nistio-systemNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S):31723/TCP,80:30709/TCP,443:31482/TCP,31400:32432/TCP,15443:31499/TCP15m
在这种情况下先使用istio-ingressgateway的NodePort从集群外部访问bookinfo应用,这里其http的NodePort是30709。浏览器打开http://NODE_IP:30709/productpage确保可以打开bookinfo的应用界面。
5.部署和查看Istio仪表板istio和几个遥测应用做了集成。遥测能帮你了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。下面部署Kiali仪表板、以及Prometheus、Grafana、Jaeger等插件。
kubectlapply-fsamples/addons/kubectlrolloutstatusdeployment/kiali-nistio-systemWaitingfordeployment"kiali"rollouttofinish:0of1updatedreplicasareavailabledeployment"kiali"successfullyrolledout
等待kiali部署完成后,使用命令启动istiodashboardkiali的监听,打开地址即可访问kiali。在左侧的导航菜单,选择Graph,然后在Namespace下拉列表中,选择default。Kiali仪表板展示了网格的概览、以及Bookinfo示例应用的各个服务之间的关系。它还提供过滤器来可视化流量的流动。
参考