当前位置: 首页 > 知识库问答 >
问题:

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

权承
2023-03-14

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

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

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

我发现一个博客建议使用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

共有1个答案

秦禄
2023-03-14

在kubernetes pod/deployment/daemonset中...在同一集群中,由于其具有扁平的网络结构,因此可以很好地进行通信,其中一种方式是通过每个资源的Kubernetes服务来直接调用彼此。例如,集群中的任何资源都可以直接通过服务名称调用kibana-app,您将其赋予它mykibana-service.name-of-namespace。

因此,为了让kibana pod与elasticsearch通信,它可以使用http://name-of-service-of-elasticSearch.name-of-namespace:9200,如果您没有指定创建服务的位置,则namespace是默认的=>http://name-of-service-of-elasticSearch.default:9200http://name-of-service-of-elasticSearch:9200

对于这些资源之间的通信来说,您所关心的必须创建的资源类型(pod、部署、daemonset或statefulSet)并不重要。

如果在将docker-compose转换为清单html" target="_blank">文件时遇到问题,可以从Kompose开始,您可以执行Kompose convertdocker-compose在哪里。

此处示例

---
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
 类似资料:
  • 但不知何故,豆荚卡在“容器创建”的状态,当我运行docker图像时,我看不到nginx图像被拉出。通常nginx图像没有那么大,所以现在必须已经拉了(15分钟)。kubectl description pods给出了pod沙箱创建失败的错误,kubernetes将重新创建它。 我搜索了关于这个问题的所有内容,并尝试了stackoverflow上的解决方案(重新启动以重新启动集群,搜索描述豆荚,新的

  • 可以使用普罗米修斯跟踪容器的内存和cpu资源。但我们可以跟踪容器的I/O吗?有度量单位吗?

  • 我有一个后端nodeJS应用程序运行在kubernetes集群。现在我想运行两个cron作业计划每个月。cron作业在一个JS文件中。如何使用库伯内特斯创建一个作业,在每个月运行该服务的pod中运行这些JS文件? 此链接提供了对其工作原理的基本理解,但我对如何为特定服务和特定Pod运行它有点困惑 https://kubernetes.io/docs/concepts/workloads/contr

  • 我的一个微服务正在Kubernetes上运行。我想指定到K8s负载均衡器当一个吊舱是繁忙的,因为行为,我得到目前是不确定的。 一个例子: 我有8个豆荚运行,每个豆荚一次可以处理1个请求。每个请求占用分配给pod的CPU核心的70%到100%。但是当我向我的应用程序发送8个请求时,Kubernetes不会将这些请求分派到8个吊舱,而是尝试只使用一个。由于我(通过threadpool)阻止每个应用程序

  • 我在3台裸机Centos7服务器上设置了一个Kubernetes集群,其中有一个主服务器和两个从服务器。为此,我使用了kubeadm,遵循以下指南:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/并将Weave Net用于pod网络。 为了进行测试,我设置了2个带有服务的default-http-backend

  • 我已经在节点(node1)上的pod(pod1)上部署了一个Spring Boot应用程序。我还在不同节点(node2)上的另一个pod(pod2)上部署了JMeter。我试图从POD2执行自动负载测试。为了执行负载测试,我要求为每个测试用例重新启动pod1。如何从POD2重新启动pod1?