Istio介绍
目录:
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.io
,config.istio.io
和authentication.istio.io
networking.istio.io
流量访问控制的流程为Gateway
→VirtualService
→tcp/tls/http Route
→DestinationWeight
→Subeset: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的数据处理流程
Rule
→Match
→Action
→Instance
→Template
→Handler
→Adapter
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
- 需要正确的命名服务名
Service对象中的Port部分必须以协议名为前缀,目前支持的有http,http2,mongo,redis和grpc,Istio会根据这些服务命名来提供对应的服务,不符合命名规范的端口会被当做TCP服务对待,其支持范围会大幅缩小
- 工作负载的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
自动注入的评估顺序是
- Pod注解 sidecar.istio.io/inject: "true/false"
- NeverInjectSelector
- AlwaysInjectSelector
- 命名空间策略
示例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
目前还是有相关功能问题