一、开始使用Isito和Kubernetes
原文地址:Get Started with Istio and Kubernetes
参考文章:Bookinfo 应用
原文使用的是minikube搭建的测试环境,若在自己的主机上使用,可以使用:
[rancher搭建k8s环境]()
[ansible搭建k8s环境]()
在这个场景中,您将学习如何将istio服务网格部署到kubernetes。istio是一个开放平台,它提供了连接、管理和保护微服务的统一方式。istio支持管理微服务之间的流量、访问策略和聚合数据,所有这些都不需要更改微服务代码。
该场景使用示例bookinfo应用程序。该应用程序不依赖于istio,并演示了如何在不进行修改的情况下在istio基础上构建任何应用程序。
启动Kubernetes集群
首先,启动kubernetes集群。这将启动一个具有一个主节点和一个节点的两节点kubernetes集群。(ps:无论是使用原文环境,还是自建k8s环境,首先要有一个k8s集群,用于实践)
launch.sh
健康检查
一旦启动,就可以使用kubectl cluster info获取集群的状态。
kubectl cluster-info
部署istio
istio分两部分安装。第一部分涉及将用于部署和管理istio支持的服务的CLI工具。第二部分将kubernetes集群配置为支持istio。
安装CLI工具
以下命令将安装istio 1.0.0版本。
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.0.0 sh -
成功运行后,将bin文件夹添加到路径中。
export PATH="$PATH:/root/istio-1.0.0/bin"
cd /root/istio-1.0.0
或者将istio二进制文件放入执行目录
cp /root/istio-1.0.0/bin/istioctl /usr/local/bin/
配置istio CRD
istio通过自定义资源定义(CRD)扩展了Kubernetes。通过应用crds.yaml部署扩展。
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system
使用默认的交互TLS身份验证安装istio
要在默认情况下安装istio并强制相互TLS身份验证,请使用yaml istio-demo-auth.yaml:
kubectl apply -f install/kubernetes/istio-demo-auth.yaml
这将部署Pilot、Mixer、入口控制器和出口控制器,以及istio CA(证书颁发机构)。这些将在下一步中解释。
检查状态
所有服务都部署为pods。
kubectl get pods -n istio-system
等待它们全部运行或完成。一旦他们跑完,Isito就被正确部署了。
部署katacoda服务
要使示例bookinfo应用程序和仪表盘可供外部使用,特别是在katacoda上,请部署以下yaml
kubectl apply -f /root/katacoda.yaml
否则,BookInfo示例和其他仪表板将不可用。
istio架构
istio简介
上一步部署了istio、 pilot、mixer、ingress-controller和egress-controller,以及istio ca(证书颁发机构)。
-
[x] Pilot-负责在运行时配置Proxy和Envoy 。
-
[x] Proxy / Envoy -每个微服务的SideCar代理,用于处理集群中服务之间以及从服务到外部服务之间的进出流量。代理构成了一个安全的微服务网格,提供了一组丰富的功能,如发现、第7层路由、断路器、策略实施和遥测记录/报告功能。
-
[x] Mixer-在基础设施后端创建一个可移植层。在基础结构级别实施诸如ACL、速率限制、配额、身份验证、请求跟踪和遥测收集等策略。
-
[x] citadel/istio ca-通过TLS保护服务到服务的通信。提供一个密钥管理系统来自动生成密钥和证书、分发、旋转和撤销。
-
[x] 入口/出口-为入站和出站外部流量配置基于路径的路由。
- [x] 控制平面API-基础编排器,如Kubernetes或Hashicorp Nomad。
部署示例应用程序
为了展示istio,已经创建了BookInfo Web应用程序。此示例部署由四个单独的微服务组成的简单应用程序,这些微服务将用于演示istio服务网格的各种功能。
在部署将通过istio扩展的应用程序时,kubernetes yaml定义通过kube- inject扩展。这将配置服务代理SideCar(Envoy)、mixer、证书和init容器。
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
部署网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
检查状态
kubectl get pods
当pods启动时,您可能会看到在创建容器时发生的启动步骤。这将配置Envoy sidecar,以便在istio服务网格中处理应用程序的流量管理和身份验证。
一旦运行应用程序,就可以通过路径/productpage访问它。
我们先找到可以访问的地址,这里确定使用 Node Port 时的 ingress IP 和端口,用以下命令调出访问地址:
#确定host地址
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')
#确定http端口
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
#确定https端口
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
#确定gateway地址
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
#显示gateway地址
echo $GATEWAY_URL
#添加host值
192.168.123.134:31380
在需要访问浏览器的主机上设置hosts文件,添加一条host用于访问
# 打开hosts文件(这里用的是windows)
C:\Windows\System32\drivers\etc\hosts
192.168.123.134 environments.katacoda.com
访问对应的productpage地址:
environments.katacoda.com:31380/productpage
下一步将描述应用程序的体系结构。
应用默认目标规则
在使用istio控制BookInfo版本路由之前,需要在目标规则中定义可用的版本,称为子集。
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
BookInfo架构
部署的BookInfo示例应用程序由四个微服务组成:
- [x] ProductPage微服务是主页,使用详细信息填充,并查看微服务。
- [x] 详细信息微服务包含图书信息。
- [x] 点评微服务包含书评。它使用分级微服务作为星级。
-
[x] Ratings Microservice包含书评的书评。
-
[x] 部署包括Reviews微服务的三个版本,以展示不同的行为和路由:
- [x] 版本1不调用分级服务。
- [x] 版本2调用分级服务并将每个分级显示为1到5个黑星。
- [x] 版本v3调用分级服务,并将每个分级显示为1到5个红星。
服务使用DNS通过HTTP进行通信以进行服务发现。架构概述如下所示。
BookInfo架构
应用程序的源代码在GitHub上可用
控制路由
istio的主要特点之一是其交通管理。随着微服务体系结构的扩展,对服务到服务的通信控制提出了更高的要求。
基于用户的测试/请求路由
流量管理的一个方面是基于HTTP请求控制流量路由,例如用户代理字符串、IP地址或cookie。
下面的示例将向reviews:v2发送用户“jason”的所有流量,这意味着他们只能看到黑星。
cat samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
与部署kubernetes配置类似,可以使用istoctl应用路由规则。
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
访问产品页面并以用户jason的身份登录(密码jason)
金丝雀释放的交通塑造
分离流量以进行测试和展开更改的能力非常重要。这允许A/B变更测试或部署金丝雀版本。
下面的规则确保50%的流量用于评论:v1(无星级),或者评论:v3(红色星级)。
cat samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
退出用户jason,否则以上配置优先
注意:权重不是循环,多个请求可能会转到同一个服务。
新版本
考虑到上述方法,如果Canary发布成功,那么我们希望将100%的流量转移到Reviews:v3。
cat samples/bookinfo/networking/virtual-service-reviews-v3.yaml
这可以通过使用新的权重和规则更新路由来完成。
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml
列出所有路由
可以使用
istioctl get virtualservices and istioctl get virtualservices -o yaml
访问度量
通过对应用程序通信方式的深入了解,可以深入了解应用程序的工作方式和性能指标。
生成负载
要查看图表,首先需要有一些流量。执行下面的命令以向应用程序发送请求。
while true; do
curl -s environments.katacoda.com:31380/productpage > /dev/null
echo -n .;
sleep 0.2
done
访问仪表板
随着应用程序对流量的响应,图表将开始突出显示封面下发生的事情。
Gragana
第一个是istio Grafana仪表盘。仪表板返回当前正在处理的请求总数,以及每个调用的错误数和响应时间。
environments.katacoda.com:31390/dashboard/db/istio-mesh-dashboard
由于Isito正在管理整个服务到服务的通信,仪表盘将突出显示聚合的总数和单个服务级别的细分。
Jaeger
Jaeger为每个HTTP请求提供跟踪信息。它显示进行了哪些调用以及在每个请求中花费的时间。
https://2886795302-16686-elsy04.environments.katacoda.com/
单击范围以查看单个请求和所做HTTP调用的详细信息。这是识别问题和潜在性能瓶颈的极好方法。
Service Graph
随着系统的增长,很难可视化服务之间的依赖关系。服务图将绘制系统连接方式的依赖树。
https://2886795291-8088-elsy04.environments.katacoda.com/dotviz
在继续之前,用ctrl+c停止流量处理
使用可视化工具weave scope
虽然服务图显示了系统如何连接的高级概述,但是一个名为weave scope的工具为整个集群提供了一个强大的可视化和调试工具。
使用范围,可以看到每个pod中运行的进程以及哪些pod正在相互通信。这能让用户理解istio及其应用程序的行为。
部署作用域
启用命令
kubectl create -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml'
kubectl get pods -n weave
使作用域可访问
一旦部署,就向公众公开服务。
pod=$(kubectl get pod -n weave --selector=name=weave-scope-app -o jsonpath={.items..metadata.name})
kubectl expose pod $pod -n weave --external-ip="172.17.0.27" --port=4040 --target-port=4040
重要提示:scope是一个强大的工具,应该只向受信任的个人公开,而不是向外部公众公开。确保配置了正确的防火墙和×××。
https://2886795291-4040-elsy04.environments.katacoda.com/
生成负载
作用域通过将活动系统调用映射到应用程序的不同部分和基础结构来工作。创建负载以查看系统的各个部分现在如何通信。
while true; do
curl -s https://2886795291-80-elsy04.environments.katacoda.com/productpage > /dev/null
echo -n .;
sleep 0.2
done