Istio安装及DEMO示例

Istio的安装以及基础使用
内容纲要


Istio安装及DEMO示例

Istio安装

本安装基于的环境是腾讯云服务器

image-20210921151048128

下载

  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功能。

image-20210917225131452

image-20210917225713526

 #查看安装状态
 kubectl -n istio-system get deploy
 
 
 #确保已部署以下Kubernetes服务来验证安装,并确认它们都分配相应的CLUSTER-IP(除了jaeger-agent服务之外):
 
 $ kubectl get svc -n istio-system
 

image-20210921145722796

 
 
 #如果您的集群在不支持外部负载均衡器(例如minikube)的环境中运行,则istio-ingressgateway的 EXTERNAL-IP将显示。 要访问网关,请使用服务的NodePort或使用端口转发。
 
 #还要确保已部署相应的Kubernetes Pod的运行状态:
 kubectl get pod -n istio-system

image-20210921145825744

部署一个例子

部署Bookinfo示例应用程序

BookInfo内容

Bookinfo示例分为四个单独的微服务:

  • productpage 这个微服务会调用detailsreviews 两个微服务,用来生成页面。
  • details. 这个微服务中包含了书籍的信息。
  • reviews. 这个微服务中包含了书籍相关的评论。它还会调用ratings 微服务。
  • ratings. 评级微服务,包含书评信息的书排名信息。

评论(reviews)微服务共有3个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

本示例的端到端架构如下所示:

screenshot

安装部署

 $pwd
 v=/opt/istio/istio-1.9.8/samples
 $ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

image-20210921150243802

如果您在安装过程中禁用了自动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

image-20210921150345389

 kubectl get pods

image-20210921150419146

验证

验证到目前为止一切正常。通过检查响应中的页面标题,运行以下命令以查看应用程序是否正在集群中运行并返回HTML页面:

 $ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o ".*"

image-20210921150953642

应用默认目标规则

在使用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

image-20210921151805622

确保配置没有问题

 istioctl analyze

image-20210921151938024

因为之前启用过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

image-20210921153722460

重启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

image-20210921154828935

确定入口IP和端口

请按照以下说明设置用于访问网关的 INGRESS_HOSTINGRESS_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"

image-20210921155629866

设置入口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"

image-20210921164427841

验证外部访问

通过使用浏览器查看Bookinfo产品页面,确认可以从外部访问Bookinfo应用程序。

运行以下命令以获取Bookinfo应用程序的外部地址。

 $ echo "http://$GATEWAY_URL/productpage"

将前一个命令的输出粘贴到Web浏览器中,并确认已显示Bookinfo产品页面。

由于使用了腾讯云,所以10的ip是内网ip要访问的话,要换成对应的外网ip

http://119.45.235.106:31428/productpage

要注意,腾讯云服务器,要设置31428端口的安全组为开启

查看仪表盘

Istio与几种不同的遥测应用程序集成。 这些可以帮助您了解服务网格的结构,显示网格的拓扑以及分析网格的运行状况。

使用以下说明来部署Kiali仪表板以及PrometheusGrafanaJaeger

安装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.
 

http://localhost:20001/kiali

注意:这里是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

image-20210921170620089

 #修改后刷新配置
 kubectl apply -f kiali-service.yaml
 #查看详情  
 kubectl describe service kiali -n istio-system

image-20210921172347203

在页面访问,注意,要打开云服务器的端口限制。

http://118.195.234.203:32123/kiali

image-20210921172930860

请求路由

理解流量管理概念文档。在尝试这个任务之前,你应该熟悉 destination rule(目标规则)virtual service(虚拟服务)subset(子集)等重要术语。

Istio [Bookinfo示例]()包含四个单独的微服务,每个微服务具有多个版本。微服务之一的三个不同版本 reviews(评论)已部署并同时运行。 为了说明此问题的原因,请在浏览器中访问Bookinfo应用的 /productpage,然后刷新几次。您会发现页面输出有时包含星级,有时则不包含。这是因为如果没有明确的默认服务版本可路由,Istio将以循环方式将请求路由到所有可用版本。

该例子的初始目标是应用规则,将所有流量路由到微服务的 v1(版本1)。稍后,将基于HTTP请求标头的值规则来路由流量

应用虚拟服务(virtual service)

接下来,虚拟服务会将所有流量路由到微服务 v1上。

如果你还没有应用 destination rule,请先应用 [默认目标规则]()。

  1. 执行以下命令以应用虚拟服务:

     $ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

    请等待几秒钟以使虚拟服务生效。

  2. 使用以下命令显示定义的路由规则:

     $ 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,该版本没有星级评分功能。

现在,您已成功完成此任务的第一部分:将流量路由到其中一个版本了。

image-20210921175222253

根据用户身份进行路由(Route based on user identity)

接下来,更改路由配置,将来自特定用户的所有流量路由到特定服务版本上。本例中,将来自名为Jason的用户的所有流量都将被路由到 reviews:v2

请注意,Istio对用户身份没有任何特殊的、内置的理解。这个例子是通过productpage服务为所有向评论服务发出的HTTP请求添加一个自定义的终端用户头来实现的。

请记住,reviews:v2是星级评定功能的版本。

  1. 运行以下命令以启用基于用户的路由规则:

     $ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
  2. 确认规则已创建:

     $ 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
  3. /productpage上,以用户jason的身份登录。
    刷新浏览器。你看到了什么?每条评论旁边都会出现星级评价。
  4. 以另一个用户的身份登录(选择任何你想要的名字)。
    刷新浏览器。现在星星不见了。这是因为除了Jason之外,所有用户的流量都被路由到review:v1

这样,就已经成功地配置了Istio,使其能够根据 用户身份进行流量路由。

image-20210921175540414

了解发生了什么

在此示例中,您使用 Istio 将 100% 的流量发送到每个 Bookinfo 服务的 v1 版本。然后,您设置了一个规则,以根据 productpage 服务添加到请求中的自定义终端用户头,有选择地将流量发送到带有评论功能的 v2 版本。

请注意,Kubernetes服务,如本任务中使用的Bookinfo服务,必须遵守某些限制,以利用Istio的L7路由功能。详情请参考《Pods和服务的要求》

流量转移示例中,您将遵循您在这里学到的相同的基本模式来配置路由规则,实现逐步的将流量从服务的一个版本发送到另一个版本。

清理

  1. 删除应用虚拟服务。

     kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
  2. 如果你不打算体验后面的功能,请参考[Bookinfo清理]()删除应用程序。
默认图片
大鹏
一个爱读书,不求甚解的码农。
文章: 11

2 评论

留下评论