Istio介绍

时间:Feb. 26, 2019 分类:

目录:

Istio是什么

服务网格Service Mesh

微服务是从原有的技术角度进行拆分组件,升级为独立运行的服务,但是也同样带来了很多的问题

kubernetes为代表地的容器云服务提供了部署,调度,伸缩,监控,日志等问题,但是微服务之间的额问题依然没有解决,之后随着kubernetes成为业界标准,Service Mesh顺势登场

Spring Cloud作为第一代的ServiceMesh的标杆,为微服务治理定义了一系列的标准,但是其也有很多的缺点,例如需要学习和熟悉多种组件,组件内部依赖java实现,自身没有实现调度和资源等先关支持

Istio介绍

Istio得益于2016年c++开发的Enovy代理软件,17年5月Istio诞生

以Envoy为数据平面,通过Sidecar的方式让Envoy与业务容器一起运行,并劫持通信,接收控制平面进行的统一管理,在此基础上提供了连接,控制,观察,安全等特性

特性

  • 连接 对网格内服务之间调用所产生的流量进行管理,对微服务的部署、测试和升级等操作提供保障
  • 安全 对网格内服务之间的调用提供认证,加密和鉴权支持,在不侵入代码的情况下加固现有服务,提供安全性
  • 策略 在控制面定制策略,并在服务中实施
  • 对服务之间的调用进行跟踪和测量,并获取服务的状态信息

核心组件及功能

Istio分为控制面和数据面

  • 数据面的Sidecar通过注入的方式和业务容器共处于一个Pod,用于劫持业务应用容器的流量,并接受控制面组件的控制,并向控制面输出日志,跟踪和监控数据
  • 控制面是Istio的核心,负责管理Istio的所有功能

Pilot

负责功能

  • 从kubernetes或其他平台的注册中心获取服务信息,完成服务发现过程
  • 读取Istio的各项控制配置,在进行转换的时候将其发送给数据面试试

Mixer

工作流程

  • 用户将Mixer配置发送到了kubernetes中
  • Mixer通过对kubernetes资源的监听,获取配置的变化
  • 网格中服务在每次调用之前会向Mixer发送预检请求,查看调用是否允许执行,在每次调用之后发送报告信息,向Mixer汇报在调用过程中产生的监控跟踪数据

Ciatdel

用于证书管理

Sidecar

istio用istio-init初始化容器中的iptables对Pod的流量劫持

在加入Sidecar之前通信方式是源容器→目的容器

而在加入Sidecar之后通信方式是源容器→Sidecar→Sidecar→目的容器

实现方式

Istio在安装过程进行CRD的初始化,提供networking.istio.ioconfig.istio.ioauthentication.istio.io

networking.istio.io

流量访问控制的流程为GatewayVirtualServicetcp/tls/http RouteDestinationWeightSubeset:Port

Gateway

不论是网格内部的服务互访还是通过Ingress进入网格的流量,首先经过的都是Gateway

对于网络边缘是通过Istio的Ingress Gateway Controller进入,而网格内部的服务互访使用的是虚拟的mesh访问机型

Pilot会根据Gateway和主机名进行检索,如果存在对应的VirtualService,则交由VirtualService处理;如果是Mesh Gateway且不存在对应主机名的VirtualService,而会尝试调用kubernetes Service,如果不存在则报404

VirtualService

Virtual相关对象

  • Host主机名称,在kubernetes集群可以是主机
  • Gateway流量来源网关,默认是mesh
  • 路由对象,对于符合前边的条件的流量进行正确的处理

tcp/tls/http Route

DestinationWeight

DestinationWeight定义了到各个服务的流量权重

Destination

包含Subeset和Port,通过Selector用于标记一个子集

config.istio.io

Mixer的数据处理流程

RuleMatchActionInstanceTemplateHandlerAdapter

Rule

Rule对象是Mixer对象的入口,包含一个match成员和一个逻辑表达式,只有符合表达式的数据才会被交给Action处理

Action

将符合入口标准的数据,在什么方式加工后,交给那个适配器机型处理

包含的一个是Instance对象,使用Template对接收到数据进行处理,还有一个是Handler对象,代表适配器实例,用于接受处理后的数据

Instance

用于进入数据选择一个模板,并在数据中抽取某些字段作为模板的参数,传输给模板处理

Adapter

Adapter是Istio定义的行为规范,需要一些必要的实例化数据

例如RedisQueue需要一个Redis地址

Template

用于对接收到的数据进行再加工,进入的数据都来源自Sidecar

Handler

对Adapter实例化

authentication.istio.io

一组API用于定义认证策略

包括Policy,MeshPolicy

rbac.istio.io

和kubernetes类似实现了一个rbac

初入istio

安装istio

$ wget https://github.com/istio/istio/releases/download/1.0.4/istio-1.0.4-linux.tar.gz
$ tar xf istio-1.0.4-linux.tar.gz 
$ cd istio-1.0.4/
$ cp bin/istioctl /usr/local/bin/
$ kubectl apply -f install/kubernetes/istio-demo.yaml
$ kubectl get pods -n istio-system -w
NAME                                     READY   STATUS      RESTARTS   AGE
grafana-78cf556b9c-mqvck                 1/1     Running     0          7m12s
istio-citadel-f476b6c45-xr4cm            1/1     Running     0          7m12s
istio-cleanup-secrets-vk5fr              0/1     Completed   0          7m13s
istio-egressgateway-978c876fb-6hhcd      1/1     Running     0          7m12s
istio-galley-7dd9c54cdd-6w5x5            1/1     Running     0          7m12s
istio-grafana-post-install-8gnrc         0/1     Completed   3          7m14s
istio-ingressgateway-6d6694648f-k4c2q    1/1     Running     0          7m12s
istio-pilot-6fbd5b7bdd-qtv6j             2/2     Running     0          7m12s
istio-policy-65b775cff6-xk2tx            2/2     Running     0          7m12s
istio-security-post-install-22kvq        0/1     Completed   3          7m13s
istio-sidecar-injector-b484dfcbb-8cxq8   1/1     Running     0          7m11s
istio-telemetry-676d6c7c49-9qn9t         2/2     Running     0          7m12s
istio-tracing-6b994895fd-4gb2t           1/1     Running     0          7m11s
prometheus-76b7745b64-h5nv4              1/1     Running     0          7m12s
servicegraph-59c69d7977-ddmjx            1/1     Running     1          7m12s

有些任务虽然是Completed状态,是因为任务完成了

创建不同版本的服务

apiVersion: v1
kind: Service
metadata:
  name: flaskapp
  labels:
    app: flaskapp
spec:
  selector:
    app: flaskapp
  ports:
    - name: http
      port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flaskapp-v1
spec:
  replicas: 1
  template: 
    metadata:
      labels:
        app: flaskapp
        version: v1
    spec:
      containers:
      - name: flaskapp
        image: dustise/flaskapp
        imagePullPolicy: IfNotPresent
        env:
        - name: version
          value: v1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flaskapp-v2
spec:
  replicas: 1 
  template: 
    metadata:
      labels:
        app: flaskapp
        version: v2
    spec:
      containers:
      - name: flaskapp
        image: dustise/flaskapp
        imagePullPolicy: IfNotPresent
        env:
        - name: version
          value: v2

镜像一致,通过不同的version进行区分,service只是用了一个Selector的app标签,可以负载到两个Deployment

根据istio的规范,service的端口命名规范要为http

$ istioctl kube-inject -f flaskapp.yml | kubectl apply -f -
service/flaskapp created
deployment.extensions/flaskapp-v1 created
deployment.extensions/flaskapp-v2 created

这个过程也可以通过istioctl kube-inject -f flaskapp.yml -o flaskapp.istoi.injected.yaml生成注入好的yaml文件,然后通过kubectl部署

创建client

apiVersion: v1
kind: Service
metadata:
  name: sleep
  labels:
    app: sleep
spec:
  selector:
    app: sleep
  ports:
    - name: ssh
      port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sleep
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sleep
        version: v1
    spec:
      containers:
      - name: sleep
        image: dustise/sleep
        imagePullPolicy: IfNotPresent

没有service的deployment是不会被istio发现并进行注入操作的

创建client

$ istioctl kube-inject -f sleep.yml | kubectl apply -f -
service/sleep created
deployment.extensions/sleep created

验证服务

$ kubectl exec  -it sleep-7988c4669c-5qgfb -c sleep bash
bash-4.4# for i in {0..10}; do http --body http://flaskapp/env/version;done
v1

v2

v1

v2

v2

v2

v1

v1

v2

v2

v1

创建目标规则和默认路由

创建目标规则

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: flaskapp
spec:
  host: flaskapp
  subsets: 
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

通过flaskapp的标签将不同version的服务分成了两个subset

$ kubectl apply -f flaskapp-dr.yml 
destinationrule.networking.istio.io/flaskapp created

创建默认路由

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: flaskapp-default-v2
spec:
  hosts: 
  - flaskapp
  http:
  - route:
    - destination:
        host: flaskapp
        subset: v2

将流量转发到DestinationRule定义的v2 subset上。

$ kubectl apply -f flaskapp-vs.yml 
virtualservice.networking.istio.io/flaskapp-default-v2 created

验证路由

for i in {0..10}; do http --body http://flaskapp/env/version;done
v2

v2

v2

v2

v2

v2

v2

v2

v2

v2

v2

可以看到路由已经生效

通过helm方式部署Istio

$ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system -f install/kubernetes/helm/istio/values.yaml > my-istio.yaml
$ kubectl create ns istio-system
$ kubectl apply -f my-istio.yaml

在网格中部署应用

对工作负载的要求

目前支持Job,DaemonSet,ReplicaSet,Pod和Deployment

  1. 需要正确的命名服务名

Service对象中的Port部分必须以协议名为前缀,目前支持的有http,http2,mongo,redis和grpc,Istio会根据这些服务命名来提供对应的服务,不符合命名规范的端口会被当做TCP服务对待,其支持范围会大幅缩小

  1. 工作负载的Pod必须有关联的Service

为了满足服务发现的需要,官方建议为Pod模板加入两个标签,app和version,分别标注应用名称和版本,因为Istio很多默认策略都会引用这两个标签,如果没有会引发很多不必要的麻烦

使用自动注入

使用默认的values.yaml文件~/istio-1.0.4/install/kubernetes/helm/istio/values.yaml

默认的的情况下就启用了自动注入的功能,并且将autoInject设置为enabled,所以当为namespace添加label后,在namespace中创建的工作负载就会自动被注入

$ kubectl create ns auto
$ kubectl label namespaces auto istio-injection=enabled
$ kubectl create ns manually
$ kubectl apply -f sleep.yaml -n auto
$ kubectl apply -f sleep.yaml -n manually

然后检验一下是否进行了服务的注入

根据启动状态

$ kubectl get pod -n auto 
NAME                     READY   STATUS    RESTARTS   AGE
sleep-5466775485-rgwkr   2/2     Running   0          6m9s
$ kubectl get pod -n manually 
NAME                     READY   STATUS    RESTARTS   AGE
sleep-5466775485-tt7v6   1/1     Running   0          6m7s

可以看到auto的namespace的Pod有两个Container

或者根据更详细的信息看一下是否有服务注入

$ kubectl -n auto get pod sleep-5466775485-rgwkr -o yaml
$ kubectl -n manually get pod sleep-5466775485-tt7v6 -o yaml

auto命名空间中的Pod被注入了Sidecar,而manually命名空间没有进行注入

另外可以额外的配置自动注入的规则

$ kubectl describe configmaps istio-sidecar-injector -n istio-system

自动注入的评估顺序是

  1. Pod注解 sidecar.istio.io/inject: "true/false"
  2. NeverInjectSelector
  3. AlwaysInjectSelector
  4. 命名空间策略

示例NeverInjectSelector的配置文件

neverInjectorSelector:
  - matchExpressions:
    - {key: openshift.io/deploy-pod-for.name, operator}
  - matchExpressions:
    - {key: openshift.io/build.name, operator}

对于没有按照自动注入的Pod,可以打印Pod的sidecar日志信息

编辑istio-sidecar-injector的deployment

$ kubectl edit -n istio-system deployments istio-sidecar-injector

spec.template.spec.crontainer.args加上"--log_output_level=default:debug"参数

然后在查看istio-sidecar-injector的Pod日志即可

测试环境部署

apiVersion: v1
kind: Service
metadata:
  name: sleep
  labels:
    app: sleep
spec:
  selector:
    app: sleep
  ports:
    - name: ssh
      port: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sleep-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sleep
        version: v1
    spec:
      containers:
      - name: sleep
        image: dustise/sleep
        imagePullPolicy: IfNotPresent
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sleep-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sleep
        version: v2
    spec:
      containers:
      - name: sleep
        image: dustise/sleep
        imagePullPolicy: IfNotPresent

然后创建部署环境

$ kubectl label namespaces default istio-injection=enabled
namespace/default labeled
$ kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
flaskapp-v1-76b45bc665-t48d6              2/2     Running   0          74s
flaskapp-v2-787ddcbf8c-lgfgt              2/2     Running   0          74s
sleep-v1-5466775485-qcbhc                 2/2     Running   0          28s
sleep-v2-f6d86c68d-7dgqq                  2/2     Running   0          28s

常用功能

使用Istio Dashboard

更改Istio配置

$ helm template install/kubernetes/helm/istio --name istio --set grafana.enabled=true --namespace istio-system > default-grafana.yaml
$ kubectl apply -f default-grafana.yaml  | grep grafana
configmap/istio-grafana-custom-resources created
configmap/istio-grafana-configuration-dashboards created
configmap/istio-grafana created
serviceaccount/istio-grafana-post-install-account created
clusterrole.rbac.authorization.k8s.io/istio-grafana-post-install-istio-system unchanged
clusterrolebinding.rbac.authorization.k8s.io/istio-grafana-post-install-role-binding-istio-system unchanged
job.batch/istio-grafana-post-install created
service/grafana created
deployment.extensions/grafana created

访问grafana

$ kubectl -n istio-system port-forward --address 0.0.0.0 $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &
[1] 31067
Forwarding from 0.0.0.0:3000 -> 3000

没有数据是因为没有流量的产生

$ export SOURCE_POD=$(kubectl get pod -l app=sleep,version=v1 -o jsonpath={.items..metadata.name}) 
$ kubectl exec -it -c $SOURCE_POD bash
bash-4.4# for i in `seq 100`; do http --body http://flaskapp/fetch?url=http://flaskapp/env/version >> /dev/null; done

对于长期的使用可以修改value中grafana的相关配置

grafana:
  enabled: false
  replicaCount: 1
  image:
    repository: grafana/grafana
    tag: 5.2.3
  persist: false
  storageClassName: ""
  security:
    enabled: false
    adminUser: admin
    adminPassword: admin
  service:
    annotations: {}
    name: http
    type: ClusterIP
    externalPort: 3000
    internalPort: 3000

可以将服务类型转换为LocalBalance或者创建Ingress对象,也可以将enabled设置为true然后设置用户名和密码

grafana使用的数据源是Prometheus,所以对于集群有grafana的集群可以拷贝dashboard相关配置,然后倒入其他grafana

Prometheus

和grafana同理的对外方式

$ kubectl -n istio-system port-forward --address 0.0.0.0 $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090 &

配置保存在Prometheus的ConfigMap,可以对其进行定制和迁移,也可以配置Alert Manager组件

jaeger

jaeger使用

jaeger是一个分布式跟踪的开源软件,提供原生的OpenTracing支持,向下兼容ZipKin,同时支持多种后端存储

$ helm template install/kubernetes/helm/istio --name istio --set grafana.enabled=true,tracing.enabled=true  --namespace istio-system > default-tracing.yaml
$ kubectl apply -f default-tracing.yaml
$ kubectl -n istio-system port-forward --address 0.0.0.0 $(kubectl -n istio-system get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &
$ kubectl exec -it -c sleep $SOURCE_POD bash
bash-4.4# for i in `seq 100`; do http --body http://flaskapp/fetch?url=http://flaskapp/env/version >> /dev/null; done

选择sleep进行Find Traces

点进去会有更详细的介绍

跟踪参数的传递

$ kubectl apply -f samples/httpbin/httpbin.yaml 
service/httpbin created
deployment.extensions/httpbin created
$ kubectl exec -it -c sleep $SOURCE_POD bash
bash-4.4# for i in `seq 100`; do http --body http://flaskapp/fetch?url=http://httpbin:8000/get >> /dev/null; done

这是一个sleep→flaskapp→httpbin的链路,但是观察到的是一个sleep→flaskapp的链路和flaskapp→httpbin的链路

这是因为Opentracing所依赖的Header没有添加

x-request-id
x-b3-traceid
x-b3-spanid
x-b3-sampled
x-b3-flags
x-ot-span-context

可以在sleep上通过debug模式查看

bash-4.4# http --debug --body http://flaskapp/fetch?url=http://httpbin:8000/get
{
    "args": {},
    "headers": {
        "Accept-Encoding": "identity",
        "Content-Length": "0",
        "Host": "httpbin:8000",
        "User-Agent": "Python-urllib/3.6",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "99bb59583c1499e6",
        "X-B3-Traceid": "99bb59583c1499e6",
        "X-Request-Id": "2bf47b99-3e6b-4a82-a227-deab484c8c2b"
    },
    "origin": "127.0.0.1",
    "url": "http://httpbin:8000/get"
}

使用flaskapp的另一个路由fetch_with_header

...
TRACE_HEADERS = [
'x-request-id',
'x-b3-traceid',
'x-b3-spanid',
'x-b3-sampled',
'x-b3-flags',
'x-ot-span-context'
]
...
@app.route('/fetch_with_trace')                              
def fetch_with_trace():                                      
    url = request.args.get('url', '')                        
    request_headers = dict(request.headers)                  
    new_header = {}                                          
    for key in request_headers.keys():     
        if key.lower() in TRACE_HEADERS:   
            new_header[key] = request_headers[key]

    req = Request(url, headers = new_header)      
    return urlopen(req).read()                

进行请求

bash-4.4# for i in `seq 100`; do http --body http://flaskapp/fetch_with_trace?url=http://httpbin:8000/get >> /dev/null; done

可以在jaeger上看到这次请求

获取HEADER

bash-4.4# http --body http://flaskapp/fetch_with_header?url=http://httpbin:8000/get
{"Content-Length": "0", "Host": "flaskapp", "User-Agent": "HTTPie/0.9.9", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "X-Forwarded-Proto": "http", "X-Request-Id": "4a8729c2-d0c9-4ff4-bbb3-e327f2e9c1c9", "X-Envoy-Decorator-Operation": "flaskapp.default.svc.cluster.local:80/*", "X-B3-Traceid": "fc9caf42d7ed2962", "X-B3-Spanid": "fc9caf42d7ed2962", "X-B3-Sampled": "0", "X-Istio-Attributes": "CjsKE2Rlc3RpbmF0aW9uLnNlcnZpY2USJBIiZmxhc2thcHAuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbAo+Cgpzb3VyY2UudWlkEjASLmt1YmVybmV0ZXM6Ly9zbGVlcC12MS01NDY2Nzc1NDg1LXFjYmhjLmRlZmF1bHQKPgoXZGVzdGluYXRpb24uc2VydmljZS51aWQSIxIhaXN0aW86Ly9kZWZhdWx0L3NlcnZpY2VzL2ZsYXNrYXBwCkAKGGRlc3RpbmF0aW9uLnNlcnZpY2UuaG9zdBIkEiJmbGFza2FwcC5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsCioKHWRlc3RpbmF0aW9uLnNlcnZpY2UubmFtZXNwYWNlEgkSB2RlZmF1bHQKJgoYZGVzdGluYXRpb24uc2VydmljZS5uYW1lEgoSCGZsYXNrYXBw"}
b'{\n  "args": {}, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Content-Length": "0", \n    "Host": "httpbin:8000", \n    "User-Agent": "Python-urllib/3.6", \n    "X-B3-Parentspanid": "fc9caf42d7ed2962", \n    "X-B3-Sampled": "0", \n    "X-B3-Spanid": "3ae8f1507c71d477", \n    "X-B3-Traceid": "fc9caf42d7ed2962", \n    "X-Request-Id": "4a8729c2-d0c9-4ff4-bbb3-e327f2e9c1c9"\n  }, \n  "origin": "127.0.0.1", \n  "url": "http://httpbin:8000/get"\n}\n'

返回结果格式化

{
    "Content-Length": "0",
    "Host": "flaskapp",
    "User-Agent": "HTTPie/0.9.9",
    "Accept-Encoding": "gzip, deflate",
    "Accept": "*/*",
    "X-Forwarded-Proto": "http",
    "X-Request-Id": "4a8729c2-d0c9-4ff4-bbb3-e327f2e9c1c9",
    "X-Envoy-Decorator-Operation": "flaskapp.default.svc.cluster.local:80/*",
    "X-B3-Traceid": "fc9caf42d7ed2962",
    "X-B3-Spanid": "fc9caf42d7ed2962",
    "X-B3-Sampled": "0",
    "X-Istio-Attributes": "CjsKE2Rlc3RpbmF0aW9uLnNlcnZpY2USJBIiZmxhc2thcHAuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbAo+Cgpzb3VyY2UudWlkEjASLmt1YmVybmV0ZXM6Ly9zbGVlcC12MS01NDY2Nzc1NDg1LXFjYmhjLmRlZmF1bHQKPgoXZGVzdGluYXRpb24uc2VydmljZS51aWQSIxIhaXN0aW86Ly9kZWZhdWx0L3NlcnZpY2VzL2ZsYXNrYXBwCkAKGGRlc3RpbmF0aW9uLnNlcnZpY2UuaG9zdBIkEiJmbGFza2FwcC5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsCioKHWRlc3RpbmF0aW9uLnNlcnZpY2UubmFtZXNwYWNlEgkSB2RlZmF1bHQKJgoYZGVzdGluYXRpb24uc2VydmljZS5uYW1lEgoSCGZsYXNrYXBw"
}

{
    "args": {},
    "headers": {
        "Accept-Encoding": "identity",
        "Content-Length": "0",
        "Host": "httpbin:8000",
        "User-Agent": "Python-urllib/3.6",
        "X-B3-Parentspanid": "fc9caf42d7ed2962",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "3ae8f1507c71d477",
        "X-B3-Traceid": "fc9caf42d7ed2962",
        "X-Request-Id": "4a8729c2-d0c9-4ff4-bbb3-e327f2e9c1c9"
    },
    "origin": "127.0.0.1",
    "url": "http://httpbin:8000/get"
}

第一组来自flaskapp,表示sleep请求flaskapp,第二组来自httpbin,表示flaskapp请求httpbin

  • 指定的Header在两段路径中都进行了出现
  • X-Request-Id和X-B3-Traceid是直接下发的,两个服务收到的都是一致的
  • httpbin的X-B3-Parentspanid等于flaskapp的X-B3-Spanid表明父子关系

服务开放

Jaeger配置中支持ingress,可以直接修改参数进行启动

Kiali

kiali是一个用于Istio的可视化软件,专门用于Istio系统,提供了监控可视化以及追踪等通用功能,还专门提供了Istio的配置验证,健康评估等高级功能。

原来的v0.9版本不能使用需要修改版本,并指定启动

kiali:
  enabled: true
  replicaCount: 1
  hub: docker.io/kiali
  tag: v0.11.0
  ingress:
    enabled: false
    ## Used to create an Ingress record.
    # hosts:
    #  - kiali.local
    annotations:
      # kubernetes.io/ingress.class: nginx
      # kubernetes.io/tls-acme: "true"
    tls:
      # Secrets must be manually created in the namespace.
      # - secretName: kiali-tls
      #   hosts:
      #     - kiali.local
  dashboard:
    username: admin
    # Default admin passphrase for kiali. Must be set during setup, and
    # changed by overriding the secret
    passphrase: admin

    # Override the automatically detected Grafana URL, usefull when Grafana service has no ExternalIPs
    # grafanaURL:

    # Override the automatically detected Jaeger URL, usefull when Jaeger service has no ExternalIPs
    # jaegerURL:

启动kiali

$ helm template install/kubernetes/helm/istio --name istio --set grafana.enabled=true,tracing.enabled=true  --namespace istio-system > default-kiali.yaml
$ kubectl apply -f default-kiali.yaml
$ kubectl -n istio-system port-forward --address 0.0.0.0 $(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}') 20001:20001

目前还是有相关功能问题