[英]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 服務器尚未准備好”)。
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:
server.name: kibana
server.host: "0"
elasticsearch.url: http://elasticsearch:9200
xpack.monitoring.ui.container.elasticsearch.enabled: true
我對 Kubernetes 很陌生,我不明白為什么他們不能互相交談。
此 Kibana 日志條目向您解釋了問題所在:
{"type":"log","@timestamp":"2019-03-02T10:38:49Z","tags":["warning","elasticsearch","admin"],"pid":1, "message":"無法恢復連接:http://elasticsearch:9200/"}
問題:對 Kubernetes 來說,命名你的 pod elasticsearch 是不夠的。
根據情況,您有幾種解決方案來修復它:
按照Amityo 的建議創建服務。 如果 kibana 和 elasticsearch 在同一個命名空間中運行,這就足夠了。
如果 kibana 和 elasticsearch 在不同的命名空間中運行,您需要使用完整的 DNS 名稱來提供服務:elasticsearch.my-namespace.svc.cluster.local
如果您在同一個 pod 中運行 elasticsearch 和 kibana。 然后 localhost:9200 就足以能夠查詢了。
對於你現在的情況。 當elasticsearch 運行時,您可以使用 ELASTICSEARCH_URL pod DNS 名稱: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 doc 上找到的所有信息
請注意:根據官方文檔,Env 變量 ELASTICSEARCH_URL 在較新的 elasticsearch 版本中已棄用,更多詳細信息請參見此處
在 kubernetes 中,pod 與服務通信。 您將需要定義一個服務來選擇您的 pod(使用選擇器)。
例如:
kind: Service
apiVersion: v1
metadata:
name: elasticsearch
spec:
selector:
app: elasticsearch
ports:
- protocol: TCP
port: 9200
targetPort: 9200
我們通常將 pod 定義為 yml 文件並在那里添加標簽,但是如果您想使用kubectl run
您可以使用-l
添加標簽
-l, --labels='': Comma separated labels to apply to the pod(s). Will override previous values.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.