Istio安装及DEMO示例
Istio安装
本安装基于的环境是腾讯云服务器
下载
wget https://github.com/istio/istio/releases/download/1.9.8/istio-1.9.8-linux-amd64.tar.gz
解压
tar -zxf istio-1.9.8-linux-amd64.tar.gz
# 将 bin/ 中的 istioctl 可执行文件拷贝到 $PATH 包含的目录中。
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:
cp istioctl /usr/local/sbin
#验证是否生效
istioctl version
#将 istioctl 客户端路径增加到 path 环境变量中
$ vi /etc/profile
$ export PATH=/opt/istio/istio-1.9.8/bin:$PATH
$ source /etc/profile
安装
#以下不可用
helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.9.8/charts/
helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.6.0/charts/
helm install istio install/kubernetes/helm/istio --namespace istio-system --set tracing.enabled=true --set kiali.enabled=true --set grafana.enabled=true
#以上不可用
cd /usr/local/sbin
istioctl install
#查看pod
kubectl get pods -n istio-system
kubectl get svc -n istio-system
#安装默认demo
istioctl install --set profile=demo -y
#演示配置文件不适用于性能评估和生产。它旨在通过高级别的跟踪和访问日志来展示Istio功能。
#查看安装状态
kubectl -n istio-system get deploy
#确保已部署以下Kubernetes服务来验证安装,并确认它们都分配相应的CLUSTER-IP(除了jaeger-agent服务之外):
$ kubectl get svc -n istio-system
#如果您的集群在不支持外部负载均衡器(例如minikube)的环境中运行,则istio-ingressgateway的 EXTERNAL-IP将显示。 要访问网关,请使用服务的NodePort或使用端口转发。
#还要确保已部署相应的Kubernetes Pod的运行状态:
kubectl get pod -n istio-system
部署一个例子
BookInfo内容
Bookinfo示例分为四个单独的微服务:
productpage
这个微服务会调用details
和reviews
两个微服务,用来生成页面。details
. 这个微服务中包含了书籍的信息。reviews
. 这个微服务中包含了书籍相关的评论。它还会调用ratings
微服务。ratings
. 评级微服务,包含书评信息的书排名信息。
评论(reviews)
微服务共有3个版本:
- v1 版本不会调用 ratings 服务。
- v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
- v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
本示例的端到端架构如下所示:
安装部署
$pwd
v=/opt/istio/istio-1.9.8/samples
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
如果您在安装过程中禁用了自动Sidecar注入,通过手动sidecar注入,请在部署应用程序之前使用
istioctl kube-inject
命令修改bookinfo.yaml
文件。
$ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
该应用程序将启动。当每个pod准备就绪时,Istio sidecar也将随之部署。
kubectl get services
kubectl get pods
验证
验证到目前为止一切正常。通过检查响应中的页面标题,运行以下命令以查看应用程序是否正在集群中运行并返回HTML页面:
$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o ".* "
应用默认目标规则
在使用Istio控制Bookinfo版本路由之前,您需要在目标规则中定义可用的版本,称为子集(subsets)。
运行以下命令为Bookinfo服务创建默认目标规则:
-
如果未启用双向TLS,执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
Copy
-
如果启用了双向TLS,执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
Copy
等待几秒钟,以便规则应用到所有nodes。
也可以使用以下命令显示目标规则:
$ kubectl get destinationrules -o yaml
将应用程序开放至外部流量
将此应用程序与Istio网关相关联:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
确保配置没有问题
istioctl analyze
因为之前启用过nginx的pod,占用了端口,删除nginx。
#查看命名空间
kubectl get all -n default
#删除deployment(先删除deployment,删除后replicaset.apps 和 pod 自动就被删除了)
kubectl delete deployment.apps/nginx-deploy -n default
#删除 service
kubectl delete service/nginx-deploy -n default
为Istio注入启用命名空间
kubectl label namespace default istio-injection=enabled
#再次检测
istioctl analyze
重启pods。
kubectl delete pod details-v1-79f774bdb9-cs52q -n default
kubectl delete pod productpage-v1-6b746f74dc-8vwh8 -n default
kubectl delete pod ratings-v1-b6994bb9-46czf -n default
kubectl delete pod reviews-v1-545db77b95-r6j65 -n default
kubectl delete pod reviews-v2-7bf8c9648f-zx42m -n default
kubectl delete pod reviews-v3-84779c7bbc-dk6x7 -n default
#再次检测
istioctl analyze
确定入口IP和端口
请按照以下说明设置用于访问网关的 INGRESS_HOST
和 INGRESS_PORT
变量:
设置入口的端口:
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
确保已将端口成功分配给每个环境变量:
echo "$INGRESS_PORT"
echo "$SECURE_INGRESS_PORT"
设置入口IP:
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
如果设置了 EXTERNAL-IP
值,则您的环境具有可用于入口网关的外部负载平衡器。如果 EXTERNAL-IP
值为 <none>
(或永久为 <pending>
),则您的环境不会为入口网关提供外部负载平衡器。在这种情况下,您可以使用 node port
访问网关。
设置 GATEWAY_URL
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
确保已成功将IP地址和端口分配给环境变量:
echo "$GATEWAY_URL"
验证外部访问
通过使用浏览器查看Bookinfo产品页面,确认可以从外部访问Bookinfo应用程序。
运行以下命令以获取Bookinfo应用程序的外部地址。
$ echo "http://$GATEWAY_URL/productpage"
将前一个命令的输出粘贴到Web浏览器中,并确认已显示Bookinfo产品页面。
由于使用了腾讯云,所以10的ip是内网ip要访问的话,要换成对应的外网ip
http://119.45.235.106:31428/productpage
要注意,腾讯云服务器,要设置31428端口的安全组为开启
查看仪表盘
Istio与几种不同的遥测应用程序集成。 这些可以帮助您了解服务网格的结构,显示网格的拓扑以及分析网格的运行状况。
使用以下说明来部署Kiali仪表板以及Prometheus,Grafana和Jaeger。
安装Kiali和其他插件,然后等待它们被部署。
$ kubectl apply -f samples/addons
$ kubectl rollout status deployment/kiali -n istio-system
Waiting for deployment "kiali" rollout to finish: 0 of 1 updated replicas are available...
deployment "kiali" successfully rolled out
如果尝试安装插件时出现错误,请尝试再次运行该命令。再次运行命令时,可能会解决一些超时问题。
unable to recognize "samples/addons/kiali.yaml": no matches for kind "MonitoringDashboard" in version "monitoring.kiali.io/v1alpha1"
第一次执行一般会报这个错误。再执行一次。
访问Kiali仪表盘
istioctl dashboard kiali
http://localhost:20001/kiali
Failed to open browser; open http://localhost:20001/kiali in your browser.
注意:这里是localhost的服务,只能在k8s-master这个服务器上访问到,很不方便。该命令也会启动一个本地的Firefox去访问该URL。但是一般的Linux服务器图形化访问都不是很方便。所以请大家参考下一步对这个kiali的service做一定的修改,使其能够在我们任何浏览器里面能够访问到。
设置外网访问
kubectl get service kiali -n istio-system -o yaml > kiali-service.yaml
vi kiali-service.yaml
#增加nodeport端口
#修改ip类型为NodePort
#修改后刷新配置
kubectl apply -f kiali-service.yaml
#查看详情
kubectl describe service kiali -n istio-system
在页面访问,注意,要打开云服务器的端口限制。
http://118.195.234.203:32123/kiali
请求路由
理解流量管理概念文档。在尝试这个任务之前,你应该熟悉 destination rule(目标规则)
、virtual service(虚拟服务)
和 subset(子集)
等重要术语。
Istio [Bookinfo示例]()包含四个单独的微服务,每个微服务具有多个版本。微服务之一的三个不同版本 reviews(评论)
已部署并同时运行。 为了说明此问题的原因,请在浏览器中访问Bookinfo应用的 /productpage
,然后刷新几次。您会发现页面输出有时包含星级,有时则不包含。这是因为如果没有明确的默认服务版本可路由,Istio将以循环方式将请求路由到所有可用版本。
该例子的初始目标是应用规则,将所有流量路由到微服务的 v1(版本1)
。稍后,将基于HTTP请求标头的值规则来路由流量
应用虚拟服务(virtual service)
接下来,虚拟服务会将所有流量路由到微服务 v1
上。
如果你还没有应用 destination rule,请先应用 [默认目标规则]()。
-
执行以下命令以应用虚拟服务:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
请等待几秒钟以使虚拟服务生效。
-
使用以下命令显示定义的路由规则:
$ kubectl get virtualservices -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
...
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
...
spec:
gateways:
- bookinfo-gateway
- mesh
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
...
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
...
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
可以使用以下命令显示相应的子集(subset)定义:
$ kubectl get destinationrules -o yaml
现在,已将Istio配置为路由到 Bookinfo
微服务的 v1
版本了。
验证新的路由配置
你可以再次刷新 /productpage
来测试新配置是否生效。
注意,无论刷新多少次,页面的评论部分均不会显示星评。所有流量路由到版本
reviews:v1
,该版本没有星级评分功能。
现在,您已成功完成此任务的第一部分:将流量路由到其中一个版本了。
根据用户身份进行路由(Route based on user identity)
接下来,更改路由配置,将来自特定用户的所有流量路由到特定服务版本上。本例中,将来自名为Jason的用户的所有流量都将被路由到 reviews:v2
。
请注意,Istio对用户身份没有任何特殊的、内置的理解。这个例子是通过productpage服务为所有向评论服务发出的HTTP请求添加一个自定义的终端用户头来实现的。
请记住,
reviews:v2
是星级评定功能的版本。
-
运行以下命令以启用基于用户的路由规则:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
-
确认规则已创建:
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
...
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1 - 在
/productpage
上,以用户jason
的身份登录。
刷新浏览器。你看到了什么?每条评论旁边都会出现星级评价。 - 以另一个用户的身份登录(选择任何你想要的名字)。
刷新浏览器。现在星星不见了。这是因为除了Jason
之外,所有用户的流量都被路由到review:v1
。
这样,就已经成功地配置了Istio,使其能够根据 用户身份
进行流量路由。
了解发生了什么
在此示例中,您使用 Istio 将 100% 的流量发送到每个 Bookinfo 服务的 v1 版本。然后,您设置了一个规则,以根据 productpage 服务添加到请求中的自定义终端用户头,有选择地将流量发送到带有评论功能的 v2 版本。
请注意,Kubernetes服务,如本任务中使用的Bookinfo服务,必须遵守某些限制,以利用Istio的L7路由功能。详情请参考《Pods和服务的要求》。
在流量转移示例中,您将遵循您在这里学到的相同的基本模式来配置路由规则,实现逐步的将流量从服务的一个版本发送到另一个版本。
清理
-
删除应用虚拟服务。
kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
- 如果你不打算体验后面的功能,请参考[Bookinfo清理]()删除应用程序。
评论测试
从后台回复