Istio安装及流量测试

Istio部署(本次安装以1.0.0为例)

下载istio
#macOS 或者 Linux 系统,使用如下命令自动下载和解压最新的发行版
curl -L https://git.io/getLatestIstio | sh -

或者到如下页面,根据操作系统下载对应发行版

Istio release

1。解压安装文件,切换到文件所在目录。安装文件目录下包含:

  • install/ 目录下是 Kubernetes 使用的 .yaml 安装文件
  • samples/ 目录下是示例程序
  • istioctl 客户端二进制文件在 bin 目录下。istioctl 文件用户手动注入 Envoy sidecar 代理、创建路由和策略等
  • istio.VERSION 配置文件

2。讲istioctl添加到PATH

cd istio-1.0.0
export PATH=$PWD/bin:$PATH
镜像准备

使用istio文档进行安装1.0.0时准备.yaml中的镜像。(根据实际情况进行拉取)

  1. istio/istio-citadel:1.0.0
  2. istio/mixer:1.0.0
  3. istio/sidecar_injector:1.0.0
  4. istio/proxy_init:1.0.0
  5. istio/proxyv2:1.0.0
  6. istio/pilot:1.0.0
  7. prom/statsd-exporter:v0.6.0
  8. istio-grafana:1.0.0
  9. hyperkube:1.0.0
  10. servicegraph:1.0.0
  11. jaegertracing/all-in-one:1.5
  12. prom/prometheus:v2.3.1
  13. istio/galley:1.0.0
安装
  • 四种安装方式

使用如下yaml文件进行安装istio表示不启用sidecar之间的双向TLS验证。对于现有应用程序的集群,使用 Istio sidecar 的服务需要能够与其他非 Istio Kubernetes 服务以及使用存活和就绪探针、headless 服务或 StatefulSets 的应用程序通信的应用程序选择此选项。

kubectl apply -f istio-1.0.0/install/kubernetes/istio-demo.yaml

如下安装表示强制在sidecar之间进行双向TLS身份验证。仅在保证新部署的工作负载安装了 Istio sidecar 的新建的 Kubernetes 集群上使用此选项。

kubectl apply -f istio-1.0.0/install/kubernetes/istio-demo-auth.yaml

使用Helm渲染出Kubernetes配置清单然后使用kubectl部署

使用 Helm 和 Tiller 管理 Istio 部署

查看安装(这里使用第一种安装,使用istio-demo.yaml安装)
  • 确保服务已经部署
kubectl apply -f install/kubernetes/istio.yaml
kubectl get svc -n istio-system

image

如果集群在不支持外部负载均衡器的环境中运行,istio-ingressgateway的 EXTERNAL-IP 将会显示为状态或者状态。需要将服务使用其他方式访问,如NodePort。

  • 确保被部署的容器已经启动并正常运行
kubectl get pods -n istio-system

image

  • grafana:可视化工具
  • istio-citadel(原istio-ca):健康检查
  • istio-cleanup-secrets:用于清理过去的 Istio 遗留下来的 CA 部署
  • istio-galley:提供配置管理服务
  • istio-pilot:接受系统管理员发出的指令或者规则,遥控所有Envoy的行为
  • istio-egressgateway:控制内部访问外部链接的代理
  • istio-ingressgateway:控制外部访问内部数据的策略
  • istio-policy:ISTIO的策略控制组件
  • istio-sidecar-injector:提供自动注入功能
  • istio-telemetry:ISTIO 实现遥测数据的组件
  • prometheus:替代heapster的一个监控数据收集工具
  • servicegraph:Istio网格中的服务生成一个图。在这个task中,你将安装Servicegraph 插件并使用基于web的界面来查看服务网格的服务图。
  • istio-tracing:服务轨迹跟踪,同时可以记录到业务的访问量等

部署Bookinfo应用测试

  • VirtualService 定义控制如何在Istio服务网格中路由服务请求的规则。
  • DestinationRule 配置VirtualService路由发生后要应用于请求的策略集。
  • ServiceEntry通常用于启用对Istio服务网格之外的服务的请求。
  • Gateway 为HTTP / TCP流量配置负载均衡器,最常见的是在网状网边缘运行,以启用应用程序的入口流量
  • 自动注入

如果安装了Istio-initializer-injector,可以将pod的namespace标记为istio-injection=enabled,使用kubectl create直接部署应用,Istio-Initializer 会向应用程序的 Pod 中自动注入 Envoy 容器.

kubectl label namespace <namespace> istio-injection=enabled
kubectl get namespace -L istio-injection #查看

kubectl create -n <namespace> -f <your-app-spec>.yaml
  • 手动注入

使用 istioctl kube-inject 命令在部署应用之前向应用程序的 Pod 中手动注入 Envoy 容器.

kubectl apply -f <(istioctl kube-inject -f <your-app-spec>.yaml)

#kubectl apply -f <(istioctl kube-inject -f istio-1.0.0/samples/bookinfo/platform/kube/bookinfo.yaml )

kubectl get pods -n default

由于本机原因,v1没有起来,但是v2和v3起来了就不影响测试。
image

kubectl get svc -n default

image

#curl   curl -o /dev/null -s -w "%{http_code}\n"   http://CLUSTER-IP:PORT(S)/productpage

curl   curl -o /dev/null -s -w "%{http_code}\n"   http://10.103.199.31:9080/productpage | grep font

v1什么都没有, v2为黑色,v3为红色
image

创建gateway
  • 通过NodePort暴露服务
kubectl apply -n default -f istio-1.0.0/samples/bookinfo/networking/bookinfo-gateway.yaml
kubectl get gateway -n default
#istioctl get gateway -n default
  • 获得ingress ports
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
#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}')
#kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}'
  • 获得ingress IP
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')
#kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}'

ingress IP:ingress ports 访问,例如输入http://192.168.233.101:31380/productpage

智能路由测试(以Bookinfo为例)

旨在将流量进行控制。比如:将所有流量都导向v1/v2/v3版本。(由于v1没起来,这里以v3为例)

  • 创建路由规则,将溜流量全部导向v3
kubectl create -f istio-1.0.0/samples/bookinfo/networking/virtual-service-reviews-v3.yaml

[root@k8-master-1 ~]# cat istio-1.0.0/samples/bookinfo/networking/virtual-service-reviews-v3.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v3

  • 查看规则
kubectl get virtualservices -o yaml
#istioctl get virtualservices -o yaml
  • 应用规则
kubectl create -n namespace -f istio-1.0.0/samples/bookinfo/networking/destination-rule-reviews.yaml

[root@k8-master-1 ~]# cat istio-1.0.0/samples/bookinfo/networking/destination-rule-reviews.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
  • 测试
    ingress IP:ingress ports 访问,例如输入http://192.168.233.101:31380/productpage。多次刷新只会显示v3的页面(即都为红星)。
流量切换

将流量从服务的一个版本切换到另一个版本,这和使用容器编排平台的部署功能来进行版本迁移完全不同,后者使用了实例扩缩来对流量进行切换

测试结果均已页面效果为准,当查看规则被更新之后,在页面多次刷新查看结果

  • 将流量全部导向v2版本
[root@k8-master-1 networking]# kubectl create -f virtual-service-reviews-v2.yaml 
virtualservice.networking.istio.io/reviews created

[root@k8-master-1 networking]# cat virtual-service-reviews-v2.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
#查看规则
[root@k8-master-1 networking]# kubectl get virtualservices.networking.istio.io reviews -o yaml
  • 将流量分开,v2和v3各占50%
[root@k8-master-1 networking]# kubectl apply -f virtual-service-reviews-v2-v3.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
virtualservice.networking.istio.io/reviews configured

[root@k8-master-1 networking]# cat virtual-service-reviews-v2-v3.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50
#验证规则是否更新
[root@k8-master-1 networking]# kubectl get virtualservices.networking.istio.io reviews -o yaml
  • 将流量全部导向v3(新版本)
[root@k8-master-1 networking]# kubectl apply -f virtual-service-reviews-v3.yaml 
virtualservice.networking.istio.io/reviews configured

[root@k8-master-1 networking]# cat virtual-service-reviews-v3.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v3
#验证规则是否更新
[root@k8-master-1 networking]# kubectl get virtualservices.networking.istio.io reviews -o yaml

猜你喜欢

转载自blog.csdn.net/qq_42747099/article/details/88941514