无法在kubernetes单模式上连接elasticsearch和kibana

Can't connect elasticsearch and kibana on kubernetes single mode

我尝试在 kubernetes 上 运行 elasticsearch 和 kibana。我运行:

kubectl run elasticsearch --image=elasticsearch:6.6.1 --env="discovery.type=single-node" --port=9200 --port=9300
kubectl run kibana --image=kibana:6.6.1 --port=5601

然后我运行$kubectl proxy,

http://localhost:$IP_FROM_KUBECTL_PROXY(usually 8081)/api/v1/namespaces/default/pods/$POD_NAME/proxy/

当我进入 elasticsearch pod 时,一切看起来都很好,但是当我进入 kibana 时,该应用程序无法运行(我看到 "Kibana server is not ready yet" 无限)。

kibana的日志如下:

{"type":"log","@timestamp":"2019-03-02T10:38:47Z","tags":["warning","elasticsearch","admin"],"pid":1,"message":"No living connections"}
{"type":"log","@timestamp":"2019-03-02T10:38:49Z","tags":["warning","elasticsearch","admin"],"pid":1,"message":"Unable to revive connection: http://elasticsearch:9200/"}

这是 kibana pod 上的 kibana.yml:

来自 kibana 的默认 Kibana 配置-docker。

server.name: kibana
server.host: "0"
elasticsearch.url: http://elasticsearch:9200
xpack.monitoring.ui.container.elasticsearch.enabled: true

我是 Kubernetes 的新手,我不明白为什么他们不能互相交谈。

在 kubernetes pods 中与服务通信。您将需要定义一个服务来选择您的广告连播(使用选择器)。

例如:

kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
spec:
  selector:
    app: elasticsearch
  ports:
  - protocol: TCP
    port: 9200
    targetPort: 9200

阅读有关服务的更多信息here and about labels here

我们通常将 pods 定义为 yml 文件并在其中添加标签,但是如果您想使用 kubectl run 您可以使用 -l

添加标签
  -l, --labels='': Comma separated labels to apply to the pod(s). Will override previous values.

这个 Kibana 日志条目向您解释了问题所在:

{"type":"log","@timestamp":"2019-03-02T10:38:49Z","tags":["warning","elasticsearch","admin"],"pid":1,"message":"Unable to revive connection: http://elasticsearch:9200/"}

问题:为 pod elasticsearch 命名对于 kubernetes 来说是不够的。

您有几种解决方案,视情况而定:

  1. 按照 Amityo 的建议创建服务。如果 kibana 和 elasticsearch 运行在同一个命名空间中,这就足够了。

  2. 如果 kibana 和 elasticsearch 运行ning 在不同的命名空间中,您需要使用完整的 DNS 名称来提供服务:elasticsearch.my-namespace.svc.cluster.local

  3. 如果你 运行 elasticsearch 和 kibana 在同一个 pod 中。那么localhost:9200就可以查询了

  4. 针对你目前的情况。当 elasticsearch 为 运行ning 时,您可以将 pod DNS 名称用作 ELASTICSEARCH_URL:1-2-3-4.default.pod.cluster.local 当 1-2-3-4 是用点替换的 pod 的 IP 地址时按破折号。

您可以在使用以下 YAML 为 elasticsearch 创建 Pod 定义时定义主机名:

apiVersion: v1
kind: Pod
metadata:
  name: elasticsearch
  labels:
    name: elasticsearch-single
spec:
  hostname: elasticsearch
  subdomain: for-kibana
  containers:
  - image: elasticsearch:6.6.1
    name: elasticsearch

然后您将能够使用 ELASTICSEARCH_URL pod DNS 名称:elasticsearch.for-kibana.default.svc.cluster.local 服务。

您可以在 kubernetes 文档上找到所有信息 here

请注意: 根据官方文档,Env 变量 ELASTICSEARCH_URL 在较新的 elasticsearch 版本中已弃用,更多详细信息 see here