同命名空间K8s部署ELK遇通信问题:Kibana无法连接Elasticsearch
解决Kibana无法连接同一命名空间下Elasticsearch的问题
看起来你的问题核心在于Elasticsearch容器默认只监听localhost,导致Kubernetes Service无法将流量转发到容器内部的9200端口,即使Service配置正确,Kibana也无法建立连接。下面是具体的排查和修复步骤:
1. 验证Elasticsearch容器的网络监听状态
首先确认Elasticsearch是否真的对外(容器内部的非localhost地址)开放9200端口:
- 进入Elasticsearch Pod:
kubectl exec -it elasticsearch-9d495b84f-j2297 -n observability -- /bin/bash - 在容器内执行以下命令测试:
# 测试本地访问是否正常 curl localhost:9200 # 测试绑定所有接口的访问是否正常 curl 0.0.0.0:9200
如果curl 0.0.0.0:9200失败,说明Elasticsearch只绑定了127.0.0.1,这会导致Kubernetes Service无法路由流量到容器。
2. 修改Elasticsearch Deployment配置
需要给Elasticsearch添加两个关键环境变量,让它监听所有接口并以单节点模式运行(因为你只部署了1个副本):
修改你的elasticsearch.yaml中Deployment的containers部分,添加env配置:
containers: - name: elasticsearch image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.7.1 ports: - containerPort: 9200 - containerPort: 9300 # 添加以下环境变量 env: - name: discovery.type value: single-node - name: network.host value: 0.0.0.0 resources: requests: memory: "3Gi" cpu: "1" limits: memory: "3Gi" cpu: "1"
discovery.type: single-node:禁用集群发现,避免单节点Elasticsearch因为找不到其他节点而启动失败。network.host: 0.0.0.0:让Elasticsearch监听容器的所有网络接口,这样Kubernetes Service才能正确转发流量。
3. 重新部署Elasticsearch
kubectl --context=19team-observability-admin-context -n observability apply -f elasticsearch.yaml
等待Elasticsearch Pod重启并进入Running状态。
4. 验证Kibana连接
可以在Kibana容器内直接测试Elasticsearch的连通性:
kubectl exec -it kibana-65bc7f9c4-s9cv4 -n observability -- curl http://elasticsearch:9200
如果返回类似以下的JSON结果,说明连接正常,Kibana会自动恢复连接:
{ "name" : "elasticsearch-9d495b84f-j2297", "cluster_name" : "docker-cluster", "cluster_uuid" : "xxxxxx", "version" : { "number" : "6.7.1", "build_flavor" : "oss", "build_type" : "docker", "build_hash" : "xxxxxx", "build_date" : "2019-04-02T15:59:27.961366Z", "build_snapshot" : false, "lucene_version" : "7.7.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
额外说明
你之前创建的elasticsearch-local ClusterIP Service其实是多余的——Kubernetes的NodePort Service本身就包含ClusterIP,同一命名空间下直接使用Service名称elasticsearch即可访问,不需要额外创建ClusterIP Service。
内容的提问来源于stack exchange,提问作者Philipp Bocharov
相关产品推荐
相关产品推荐

