无法在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 来说是不够的。
您有几种解决方案,视情况而定:
按照 Amityo 的建议创建服务。如果 kibana 和 elasticsearch 运行在同一个命名空间中,这就足够了。
如果 kibana 和 elasticsearch 运行ning 在不同的命名空间中,您需要使用完整的 DNS 名称来提供服务:elasticsearch.my-namespace.svc.cluster.local
如果你 运行 elasticsearch 和 kibana 在同一个 pod 中。那么localhost:9200就可以查询了
针对你目前的情况。当 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
我尝试在 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 来说是不够的。
您有几种解决方案,视情况而定:
按照 Amityo 的建议创建服务。如果 kibana 和 elasticsearch 运行在同一个命名空间中,这就足够了。
如果 kibana 和 elasticsearch 运行ning 在不同的命名空间中,您需要使用完整的 DNS 名称来提供服务:elasticsearch.my-namespace.svc.cluster.local
如果你 运行 elasticsearch 和 kibana 在同一个 pod 中。那么localhost:9200就可以查询了
针对你目前的情况。当 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