Kubernetes上的Kibana-如何指向在不同pod上运行的ES容器



通过设置两个pod来学习Kubernetes,每个pod分别运行一个弹性搜索和一个kibana容器。

我的配置文件能够设置两个pod,并创建两个服务来访问主机的web浏览器上的这些应用程序。

问题是我不知道如何使Kibana容器与ES应用程序/pod通信。

早些时候,在学习Docker时,我制作了一个Docker compose应用程序配置,现在基本上也尝试使用Kubernetes(下面粘贴了Docker compose-config(来完成同样的操作。

偶然发现一个博客建议使用Deployment而不是Pod。再次不确定如何让Kibana与ES 对话

Kubernetes配置yaml:

apiVersion: v1
kind: Pod
metadata:
name: pod-elasticsearch
labels:
app: myapp
spec:
hostname: "es01-docker-local"
containers:
- name: myelasticsearch-container
image: myelasticsearch
imagePullPolicy: Never
volumeMounts:
- name: my-volume
mountPath: /home/newuser
volumes:
- name: my-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: myelasticsearch-service
spec:
type: NodePort
ports:
- targetPort: 9200
port: 9200
nodePort: 30015
selector:
app: myapp
---
apiVersion: v1
kind: Pod
metadata:
name: pod-kibana
labels:
app: myapp
spec:
containers:
- name: mykibana-container
image: mykibana
imagePullPolicy: Never
volumeMounts:
- name: my-volume
mountPath: /home/newuser
volumes:
- name: my-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: mykibana-service
spec:
type: NodePort
ports:
- targetPort: 5601
port: 5601
nodePort: 30016
selector:
app: myapp

下面是我试图在Kubernetes 上复制的docker compose,供参考

version: "2.2"
services:
elasticsearch:
image: myelasticsearch
container_name: myelasticsearch-container
restart: always
hostname: 'es01.docker.local'
ports:
- '9200:9200'
- '9300:9300'
volumes:
- myVolume:/home/newuser/
environment:
- discovery.type=single-node

kibana:
depends_on:
- elasticsearch
image: mykibana
container_name: mykibana-container
restart: always
ports:
- '5601:5601'
volumes:
- myVolume:/home/newuser/
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
volumes:
myVolume:
networks:
myNetwork:

ES吊舱描述:

% kubectl describe pod/pod-elasticsearch
Name:         pod-elasticsearch
Namespace:    default
Priority:     0
Node:         docker-desktop/192.168.65.3
Start Time:   Sun, 10 Jan 2021 23:06:18 -0800
Labels:       app=myapp
Annotations:  <none>
Status:       Running
IP:           10.x.0.yy
IPs:
IP:  10.x.0.yy

在kubernetes Pod/Deployment/DemonSet中。。。在同一个集群中可以毫无问题地相互通信,因为它有一个扁平的网络架构。这些资源直接相互调用的一种方式是通过每个资源的Kubernetes服务名称。例如,集群中的任何资源都可以直接通过您给它的服务名称mykibana-service.name-of-namespace来调用您的kibana应用程序。

因此,对于kibana pod与elasticsearch进行通信,它可以使用http://name-of-service-of-elasticsearch.name-of-namespace:9200命名空间。如果您不指定在哪里创建服务,则命名空间是默认的=>http://name-of-service-of-elasticsearch.default:9200http://name-of-service-of-elasticsearch:9200

您对必须创建何种类型的资源(pod、deployment、daemonset或statefulSet(提出的担忧对于这些资源之间的通信并不重要。

如果您在将docker compose转换为清单文件时遇到问题,您可以从Kompose开始,您可以在docker composite所在的位置执行kompose convert

此处为样本

---
apiVersion: apps/v1
kind: Deployment 
metadata:
labels:
app: elasticsearch
name: elasticsearch
namespace: default
spec:
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- image: myelasticsearch:yourtag #fix this 
name: elasticsearch
ports:
- containerPort: 9200
- containerPort: 9300
volumeMounts:
- mountPath: /home/newuser/
name: my-volume
volumes:
- name: my-volume
emptyDir: {}  # I wouldnt use emptydir
---
apiVersion: v1
kind: Service
metadata:
labels:
app: elasticsearch
name: elasticsearch
namespace: default
spec:
ports:
- port: 9200
name: "9200"
targetPort: 9200
- port: 9300
name: "9300"
targetPort: 9300
selector:
app: elasticsearch
type: ClusterIP #you dont need to make expose your service publicly 
#####################################
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: kibana
name: kibana
namespace: default
spec:
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- env:
- name: ELASTICSEARCH_URL
value: http://elasticsearch:9200/ #elasticsearch is the same name as service resrouce name  
- name: ELASTICSEARCH_HOSTS
value: http://elasticsearch:9200  
image: mykibana:yourtagname #fix this 
name: kibana

---
apiVersion: v1
kind: Service
metadata:
labels:
app: kibana
name: kibana
namespace: default
spec:
ports:
- port: 5601
protocol: TCP
targetPort: 5601
selector:
app: kibana
type: NodePort

你可以选择适合你的应用程序的内容,例如,在弹性搜索中,你可以使用StatefulSet、Deployment、elasticsearch,你也可以使用Deployment for Kibana,还可以更改卷的类型。此外,您在docker-compose中创建的mynetwork可以转换为网络策略,在该策略中,您可以隔离资源(例如,隔离的mynetworknamespace(,因为如果默认情况下在同一集群中创建这些资源,则这些资源不会被隔离。

希望我能帮助

如果你想以通常的方式在Kubernetes中部署Elasticsearch和Kibana,那么你必须考虑一些核心Elasticsearch集群配置,比如:

  • cluster.initial_master_nodes[7.0]在7.0中添加
  • network.host
  • 网络发布主机

此外,您还必须仔细设置network.host,以便即使在意外的pod重新启动后,network.host也保持不变。

在部署Kibana时,您需要提供Elasticsearch服务,如果Elasticsearch启用了SSL,还需要手动配置SSL证书。

因此,要在Kubernetes上安装Elastic Stack,您可能更喜欢Kubernetes上的弹性云(ECK(。Elastic提供的文档很容易理解。

Elastic Cloud on Kubernetes(ECK(使用Kubernete Operators使安装更容易,并自动负责核心集群配置。

ECK安装将创建一个名为">"的默认用户;弹性的">,您可以从机密中检索其密码。它还创建了可以在机密中找到的自签名证书。

对于部署Kibana,您只需提供";elasticsearchRef";在您的YAML文件中,它将自动配置Elasticsearch端点。您可以使用默认的"弹性的">用户登录Kibana。

最新更新