Istio 中负责流量管理的核心组件是:
- 控制平面的 Pilot:负责管理 Service Mesh 中的所有 Envoy 实例,制定服 务的规范模型,分配路由规则。
- 数据平面的 Envoy:负责路由、负载均衡和上报遥测信息。
检查下当前 Service Mesh(注入到pod中的envoy 代理)
$ istioctl proxy-status
NAME CDS LDS EDS RDS PILOT VERSION
details-v1-6fc55d65c9-glms5.istio-test SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
istio-egressgateway-557dcf8d8-7v48g.istio-system SYNCED SYNCED SYNCED NOT SENT istiod-774777b79-b6qg5 1.5.2
istio-ingressgateway-6489d9556d-dnx6m.istio-system SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
nginx-649b6985f8-nwfxv.default SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
nginx-649b6985f8-q4v78.default SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
nginx-649b6985f8-x87tm.default SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
productpage-v1-7f44c4d57c-8g2qw.istio-test SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
prometheus-dfd976959-w9jkl.istio-system SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
ratings-v1-6f855c5fff-ztvh7.istio-test SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
reviews-v1-54b8794ddf-llk45.istio-test SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
reviews-v2-c4d6568f9-jx8pn.istio-test SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
reviews-v3-7f66977689-qnnvw.istio-test SYNCED SYNCED SYNCED SYNCED istiod-774777b79-b6qg5 1.5.2
Istio 创建的所有的 Kubernetes CRD(自定义资源类型)根据 API 的域名看到所有的 CRD 分为四类:
config:配置分发与遥测
$ kubectl get customresourcedefinition|grep istio.io|grep config
adapters.config.istio.io 2020-05-06T06:14:27Z
attributemanifests.config.istio.io 2020-05-06T06:14:27Z
clusterrbacconfigs.rbac.istio.io 2020-05-06T06:14:27Z
handlers.config.istio.io 2020-05-06T06:14:27Z
httpapispecbindings.config.istio.io 2020-05-06T06:14:27Z
httpapispecs.config.istio.io 2020-05-06T06:14:28Z
instances.config.istio.io 2020-05-06T06:14:28Z
quotaspecbindings.config.istio.io 2020-05-06T06:14:29Z
quotaspecs.config.istio.io 2020-05-06T06:14:29Z
rbacconfigs.rbac.istio.io 2020-05-06T06:14:29Z
rules.config.istio.io 2020-05-06T06:14:29Z
templates.config.istio.io 2020-05-06T06:14:29Z
authentication:策略管控
$ kubectl get customresourcedefinition|grep istio.io|grep authentication
meshpolicies.authentication.istio.io 2020-05-06T06:14:28Z
peerauthentications.security.istio.io 2020-05-06T06:14:28Z
policies.authentication.istio.io 2020-05-06T06:14:28Z
requestauthentications.security.istio.io 2020-05-06T06:14:29Z
rbac:基于角色的访问控制
$ kubectl get customresourcedefinition|grep istio.io|grep rbac
clusterrbacconfigs.rbac.istio.io 2020-05-06T06:14:27Z
rbacconfigs.rbac.istio.io 2020-05-06T06:14:29Z
servicerolebindings.rbac.istio.io 2020-05-06T06:14:29Z
serviceroles.rbac.istio.io 2020-05-06T06:14:29Z
networking:流量管理
$ kubectl get customresourcedefinition|grep istio.io|grep networking
destinationrules.networking.istio.io 2020-05-06T06:14:27Z
envoyfilters.networking.istio.io 2020-05-06T06:14:27Z
gateways.networking.istio.io 2020-05-06T06:14:27Z
serviceentries.networking.istio.io 2020-05-06T06:14:29Z
sidecars.networking.istio.io 2020-05-06T06:14:29Z
virtualservices.networking.istio.io 2020-05-06T06:14:30Z
查看 pod 中 Envoy sidecar 的启动配置信息
istioctl proxy-config bootstrap nginx-649b6985f8-nwfxv -o json -n default
1.确定isito ingress gateway service 的IP和端口,若自身环境未使用外部负载均衡器,需要通过 node port 访问
$ kubectl get svc istio-ingressgateway -n istio-system
$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
2.增加gateway定义。
- gateway定义中的selector会将该gateway设置与相应的ingressgateway pod(类似ingress pod)绑定。
- gateway定义中的servers的port会在相应的ingressgateway pod中生成port相应的代理listener实例。
监听端口80默认已经创建并且ingressgateway pod已默认暴露。ingressgateway pod对应的服务也需要注册相应的端口(80默认已注册)。(若是非默认的监听端口需要配置打开)。
- gateway定义中的hosts表示listener会向哪些特定的虚拟主机转发流量。
3.增加virtualservice定义。
- virtualservice定义中的hosts与gateway中的hosts相对应,表示virtualservice可以注册到gateway的监听中,这个host会更新到ingressgateway pod路由表的虚拟主机条目中。
- virtualservice定义中的gateways表示该规则就只会应用到声明的Gateway之中。
(保留字mesh用来指代网格中的所有Sidecar。当这一字段被省略时,就会使用缺省值mesh)
- virtualservice定义中的http定义了路由规则,路由规则会写入到相应gateway pod的路由表中。