Istio手册

  1. 什么是Istio

它是一个完全开源的服务网格,以透明的方式构建在现有的分布式应用中。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。Istio 多样化的特性使你能够成功且高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。

特性:
▪统一的方式去管理和监测你的微服务应用
▪管理流量
▪实施访问策略
▪收集数据等
简单来说,Istio 就是一个提供了服务治理能力的服务网格

  1. 为什么使用Istio

Service Mesh 也是一种服务治理技术,其核心能力是对流量进行控制。作为一个企业,如果你的微服务应用已经具有了非常完备的服务治理能力,那么你不一定非得引入Service Mesh。但是假设你的系统并不具有完善的治理功能,或者系统架构中的痛点正好可以被 Service Mesh所解决,那么使用 Service Mesh 就是你的最佳选择。
相对于基于公共库的服务治理产品,Service Mesh 最大的特性就是对应用透明。你可以将你的微服务应用无缝的接入网格,而无需修改业务逻辑。目前Istio 提供了以下重要的功能:

  • 为 HTTP、gRPC、WebSocket 和 TCP 流量自动负载均衡。
  • 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。
  • 提供完善的可观察性方面的能力,包括对所有网格控制下的流量进行自动化度量、日志记录和追踪。
  • 提供身份验证和授权策略,在集群中实现安全的服务间通信。
  1. Istio 的平台支持

Istio 独立于平台,被设计为可以在各种环境中运行,包括跨云、内部环境、Kubernetes 等等。目前 Istio 支持的平台有:
1.Kubernetes
2.Consul
3.GCP

  1. Istio安装配置及使用

一、k8s安装Istio

软件下载地址:https://github.com/istio/istio/releases

#下载解压

[root@vnfm-master-1 ***]# tar xf istio-1.10.1-linux-amd64.tar.gz
[root@vnfm-master-1 ***]# ls
demo  downloadIstioCandidate.sh  istio-1.12.1  istio-1.12.1-linux-amd64.tar.gz  mybook  mytest
[root@vnfm-master-1 ***]# cd istio-1.12.1/
[root@vnfm-master-1 istio-1.12.1]# ll
total 28
drwxr-x---.  2 root root    22 Dec  7 15:04 bin
-rw-r--r--.  1 root root 11348 Dec  7 15:04 LICENSE
drwxr-xr-x.  5 root root    52 Dec  7 15:04 manifests
-rw-r-----.  1 root root   827 Dec  7 15:04 manifest.yaml
-rw-r--r--.  1 root root  5866 Dec  7 15:04 README.md
drwxr-xr-x. 21 root root  4096 Dec  7 15:04 samples
drwxr-xr-x.  3 root root    57 Dec  7 15:04 tools
[root@vnfm-master-1 istio-1.12.1]# cp bin/istioctl /usr/bin/

#安装

[root@vnfm-master-1 istio]# istioctl install --set profile=demo -y
✔ Istio core installed                                                                                                 
✔ Istiod installed                                                                                                     
✔ Egress gateways installed                                                                                            
✔ Ingress gateways installed                                                                                           
✔ Installation complete                                                                                                Thank you for installing Istio 1.12.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/KjkrDnMPByq7akrYA

#验证istio是否部署成功

[root@vnfm-master-1 istio-1.12.1]# kubectl get pods -n istio-system
NAME                                    READY   STATUS    RESTARTS   AGE
istio-egressgateway-659cc7697b-42jdf    1/1     Running   0          18s
istio-ingressgateway-569f64cdf8-9xn7f   1/1     Running   0          18s
istiod-85c958cd6-j6p5n                  1/1     Running   0          22s

#卸载istio集群,暂时不执行

[root@vnfm-master-1 ~]# istioctl manifest generate --set profile=demo | kubectl delete -f -

二、Istio部署在线书店bookinfo

参照https://www.servicemesher.com/istio-handbook/practice/bookinfo.html

三、Istio实现灰度发布

3.1、什么是灰度发布
灰度发布也叫金丝雀部署 ,是指通过控制流量的比例,实现新老版本的逐步更替。比如对于服务A 有 version1、 version2 两个版本 , 当前两个版本同时部署,但是version1比例90% ,version2比例10% ,看运行效果,如果效果好逐步调整流量占比 80~20 ,70~30 ·····10~90 ,0,100 ,最终version1版本下线。
灰度发布的特点:
1)新老版本共存
2)可以实时根据反馈动态调整占比
3)理论上不存在服务完全宕机的情况。
4)适合于服务的平滑升级与动态更新。
3.2、使用istio进行金丝雀发布
1)创建deloyment

[root@vnfm-master-1 mytest]# cat tacker-app-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: appv1
  labels:
    app: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: v1
      apply: tacker-apply
  template:
    metadata:
      labels:
        app: v1
        apply: tacker-apply
    spec:
      containers:
      - name: appv1
        image: tomcat:jdk8-temurin
        securityContext:
          privileged: true
        ports:
        - containerPort: 8080

[root@vnfm-master-1 mytest]# kubectl apply -f tacker-app-deploy.yml
[root@vnfm-master-1 mytest]# cat tacker-app-deploy_v2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: appv2
  labels:
    app: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: v2
      apply: tacker-apply
  template:
    metadata:
      labels:
        app: v2
        apply: tacker-apply
    spec:
      containers:
      - name: appv2
        image: tomcat:jdk8-temurin
        securityContext:
          privileged: true
        ports:
        - containerPort: 8080

[root@vnfm-master-1 mytest]# kubectl apply -f tacker-app-deploy_v2.yml

2)创建service

[root@vnfm-master-1 mytest]# cat service.yml
apiVersion: v1
kind: Service
metadata:
  name: tacker-app
  labels:
    apply: tacker-apply
spec:
  ports:
  - port: 8080
    name: http
  selector:
apply: tacker-apply

[root@vnfm-master-1 mytest]# kubectl apply -f service.yml

3)创建gateway

[root@vnfm-master-1 mytest]# cat test-gateway.yml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: tacker-app-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
[root@vnfm-master-1 mytest]# kubectl apply -f test-gateway.yml

4)创建virtualservice

[root@vnfm-master-1 mytest]# cat virtual-service-test.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: tacker-app1
spec:
  hosts:
  - "*"
  gateways:
  - tacker-app-gateway
  http:
  - route:
    - destination:
        host: tacker-app
        subset: v1
      weight: 90
    - destination:
        host: tacker-app
        subset: v2
      weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tacker-app
spec:
  host: tacker-app
  subsets:
  - name: v1
    labels:
      app: v1
  - name: v2
    labels:
      app: v2
[root@vnfm-master-1 mytest]# kubectl apply -f virtual-service-test.yaml

3.2、验证
命令验证:

$ 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}')
$ export INGRESS_HOST=127.0.0.1
[root@vnfm-master-1 mytest]#  for i in `seq 1 100`; do curl http://$INGRESS_HOST:$INGRESS_PORT/;done > 1.txt