《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.1.Elastic Stack 安装部署——3.4.1.8. ECK 安装(21) https://developer.aliyun.com/article/1231259
定义一个 Gateway 资源,定义集群外部流量访问集群中 Elasticsearch 服务的入口。集群外部的客户通过 istio.elasticsearch.com 域名和 9200 端口访问集群内部的 Elasticsearch 服务。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-elasticsearch-gateway namespace: istio-demo spec: selector: istio: ingressgateway servers: - port: number: 9200 name: http protocol: HTTP hosts: - "istio.elasticsearch.com" #客户端访问的域名
将 VirtualService 绑定到 Gateway 上,使用 Istio 规则来控制从集群外部通过 Gateway 进入的流量。将所有写操作的流量转发至 Ingest 节点,其他操作的流量转发至 Coordinating 节点。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: istio-elasticsearch-gateway-virtualservice namespace: istio-demo spec: hosts: - "istio.elasticsearch.com" #客户端访问的域名 gateways: - istio-elasticsearch-gateway #gateway 的名称 http: - match: #写入操作的请求分发至 ingest 节点 - uri: regex: .*_doc.* #正则表达式匹配 url,例如创建文档 my-index-istio/doc/1 - uri: prefix: /_bulk #匹配 url 前缀,bulk 批量提交 route: - destination: host: istio-elasticsearch-es-ingest #kubernetes 集群中真正存在的 service - route: - destination: #其余操作的请求分发至 coordinating 节点 host: istio-elasticsearch-es-coordinating
使用以下命令应用 Istio 转发规则:
kubectl apply -f gateway.yaml kubectl apply -f virtualservice.yaml
访问验证
由于在 Gateway 中定义的域名没有 DNS 服务器能解析到 SLB 的公网地址,我们需要在客户端添加 host 记录,在客户端编辑 /etc/hosts,添加以下记录:
121.41.8.133 istio.elasticsearch.com
客户端写入 1000 条数据:
for i in {1..1000};do curl -u elastic:L733hU98Y467IZMft4DzLq5m \ http://istio.elasticsearch.com:9200/my-index-istio/_doc\?pretty \ -X POST -H "Content-Type:application/json" \ -d '{"name":"tom","age":18}';done #返回结果 { "_index" : "my-index-istio", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 } ......
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.1.Elastic Stack 安装部署——3.4.1.8. ECK 安装(23) https://developer.aliyun.com/article/1231257