通过设置两个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:9200
或http://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。