如何在 Kubernetes 中为 Kibana 设置入口
How do I setup ingress for Kibana in Kubernetes
我刚刚使用 https://medium.com/@timfpark/efk-logging-on-kubernetes-on-azure-4c54402459c4
上的指南在我的 Kubernetes 集群上安装了一个 EFK 堆栈
我按照
上的指南通过代理访问它时可以正常工作
http://localhost:8001/api/v1/namespaces/kube-system/services/kibana-logging/proxy
但是,我希望它通过我现有的入口控制器工作,所以我使用下面的 yaml 创建了一个新的入口规则:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
generation: 2
labels:
app: kibana
name: kibana
namespace: kube-system
spec:
rules:
- host: kibana.dev.example1.com
http:
paths:
- backend:
serviceName: kibana-logging
servicePort: 5601
path: /
status:
loadBalancer:
ingress:
- {}
我的服务运行为:
apiVersion: v1
kind: Service
metadata:
labels:
addonmanager.kubernetes.io/mode: Reconcile
k8s-app: kibana-logging
kubernetes.io/cluster-service: "true"
kubernetes.io/name: Kibana
name: kibana-logging
namespace: kube-system
spec:
clusterIP: X.X.195.49
ports:
- port: 5601
protocol: TCP
targetPort: ui
selector:
k8s-app: kibana-logging
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
然而,当我尝试访问我的 URL 时:
http://kibana.dev.example1.com
我得到:{"statusCode":404,"error":"Not Found","message":"Not Found"}
如果我尝试访问:http://kibana.dev.example1.com/app/kibana#
我得到:"Kibana did not load properly. Check the server output for more information."
查看 Kibana pod 和 ingress pod 的日志并比较通过代理的成功请求和通过 ingress 的不成功请求之间的结果后,我可以看到...
命中/
"GET / HTTP/1.1" 200 197 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 491 0.003 [kube-system-kibana-logging-5601] X.X.22.204:5601 197 0.003 200 6101a7003003d34636d2012e53c23ca7
"GET /api/v1/namespaces/kube-system/services/kibana-logging/proxy/app/kibana HTTP/1.1" 404 85 "http://kibana.dev.example1.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 612 0.003 [kube-system-kibana-logging-5601] X.X.22.204:5601 85 0.003 404 5809ac2b33d3e23b200b13c9971d8520
命中 /app/kibana#
"GET /app HTTP/1.1" 404 85 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 470 0.003 [kube-system-kibana-logging-5601] X.X.22.204:5601 85 0.003 404 54a4abe0cae6d3d4298847a0db0786d6
"GET /app/kibana HTTP/1.1" 200 13301 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 477 0.041 [kube-system-kibana-logging-5601] X.X.22.204:5601 13272 0.040 200 6cb7e7698f5c72e0cd06b3408d8d4673
"GET /api/v1/namespaces/kube-system/services/kibana-logging/proxy/bundles/kibana.style.css?v=16627 HTTP/1.1" 404 85 "https://kibana.dev.example1.com/app/kibana" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 576 0.004 [kube-system-kibana-logging-5601] X.X.22.204:5601 85 0.004 404 0b825f03c36c2225ab082c2a0bab15f4
当通过代理访问时,大多数这些请求 return 302s 而不是 404s。 ingress 不能访问命名空间 kube-system 中的这些 URL 吗?
我是否遗漏了一些明显的东西 - 可能打错了 Kibana URL?我进行了大量谷歌搜索,但找不到任何类似的东西。
原来问题出在 kibana 配置上。
在 kibana 部署 yaml 中有一个名为 SERVER_BASEPATH
的环境变量,它被设置为指向 kibana 服务代理。这导致 URL 每次我尝试从外部访问端点时都被重写。
如果您注释掉这个变量及其值并重新部署 kibana,那么它应该只需点击入口地址即可工作。
原来需要设置以下环境变量才能通过入口公开 kibana:
在 kibana env 中添加以下内容 deployment.yaml:
- name: ELASTICSEARCH_HOSTS
value: "http://10.20.30.40:9200"
- name: SERVER_BASEPATH
value: "/kibana"
- name: SERVER_REWRITEBASEPATH
value: "true"
- name: SERVER_PUBLICBASEURL
value: "https://my.domain.com/kibana"
然后使用以下方法将其暴露在入口处:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
namespace: elastic
name: gateway-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: my.domain.com
http:
paths:
- path: /kibana
backend:
serviceName: kibana
servicePort: 5601
我刚刚使用 https://medium.com/@timfpark/efk-logging-on-kubernetes-on-azure-4c54402459c4
上的指南在我的 Kubernetes 集群上安装了一个 EFK 堆栈我按照
上的指南通过代理访问它时可以正常工作http://localhost:8001/api/v1/namespaces/kube-system/services/kibana-logging/proxy
但是,我希望它通过我现有的入口控制器工作,所以我使用下面的 yaml 创建了一个新的入口规则:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
generation: 2
labels:
app: kibana
name: kibana
namespace: kube-system
spec:
rules:
- host: kibana.dev.example1.com
http:
paths:
- backend:
serviceName: kibana-logging
servicePort: 5601
path: /
status:
loadBalancer:
ingress:
- {}
我的服务运行为:
apiVersion: v1
kind: Service
metadata:
labels:
addonmanager.kubernetes.io/mode: Reconcile
k8s-app: kibana-logging
kubernetes.io/cluster-service: "true"
kubernetes.io/name: Kibana
name: kibana-logging
namespace: kube-system
spec:
clusterIP: X.X.195.49
ports:
- port: 5601
protocol: TCP
targetPort: ui
selector:
k8s-app: kibana-logging
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
然而,当我尝试访问我的 URL 时:
http://kibana.dev.example1.com
我得到:{"statusCode":404,"error":"Not Found","message":"Not Found"}
如果我尝试访问:http://kibana.dev.example1.com/app/kibana#
我得到:"Kibana did not load properly. Check the server output for more information."
查看 Kibana pod 和 ingress pod 的日志并比较通过代理的成功请求和通过 ingress 的不成功请求之间的结果后,我可以看到...
命中/
"GET / HTTP/1.1" 200 197 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 491 0.003 [kube-system-kibana-logging-5601] X.X.22.204:5601 197 0.003 200 6101a7003003d34636d2012e53c23ca7
"GET /api/v1/namespaces/kube-system/services/kibana-logging/proxy/app/kibana HTTP/1.1" 404 85 "http://kibana.dev.example1.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 612 0.003 [kube-system-kibana-logging-5601] X.X.22.204:5601 85 0.003 404 5809ac2b33d3e23b200b13c9971d8520
命中 /app/kibana#
"GET /app HTTP/1.1" 404 85 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 470 0.003 [kube-system-kibana-logging-5601] X.X.22.204:5601 85 0.003 404 54a4abe0cae6d3d4298847a0db0786d6
"GET /app/kibana HTTP/1.1" 200 13301 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 477 0.041 [kube-system-kibana-logging-5601] X.X.22.204:5601 13272 0.040 200 6cb7e7698f5c72e0cd06b3408d8d4673
"GET /api/v1/namespaces/kube-system/services/kibana-logging/proxy/bundles/kibana.style.css?v=16627 HTTP/1.1" 404 85 "https://kibana.dev.example1.com/app/kibana" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15" 576 0.004 [kube-system-kibana-logging-5601] X.X.22.204:5601 85 0.004 404 0b825f03c36c2225ab082c2a0bab15f4
当通过代理访问时,大多数这些请求 return 302s 而不是 404s。 ingress 不能访问命名空间 kube-system 中的这些 URL 吗?
我是否遗漏了一些明显的东西 - 可能打错了 Kibana URL?我进行了大量谷歌搜索,但找不到任何类似的东西。
原来问题出在 kibana 配置上。
在 kibana 部署 yaml 中有一个名为 SERVER_BASEPATH
的环境变量,它被设置为指向 kibana 服务代理。这导致 URL 每次我尝试从外部访问端点时都被重写。
如果您注释掉这个变量及其值并重新部署 kibana,那么它应该只需点击入口地址即可工作。
原来需要设置以下环境变量才能通过入口公开 kibana:
在 kibana env 中添加以下内容 deployment.yaml:
- name: ELASTICSEARCH_HOSTS
value: "http://10.20.30.40:9200"
- name: SERVER_BASEPATH
value: "/kibana"
- name: SERVER_REWRITEBASEPATH
value: "true"
- name: SERVER_PUBLICBASEURL
value: "https://my.domain.com/kibana"
然后使用以下方法将其暴露在入口处:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
namespace: elastic
name: gateway-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: my.domain.com
http:
paths:
- path: /kibana
backend:
serviceName: kibana
servicePort: 5601