在k8s上部署ES集群

一、k8s集群架构:

IP角色
192.168.1.3master1
192.168.1.4master2
192.168.1.5master3
192.168.1.6node1
192.168.1.7node2

二、部署ES集群

1、配置storageclass,用于动态创建pvc,并自动绑定pv

[root@master1 tmp]# cat sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer 

执行一下:

kubectl apply -f sc.yaml

2、创建名称空间

kubectl create ns elasticsearch

3、创建PV

[root@master1 elk]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-storage-pv-1
  namespace: elasticsearch
  labels:
    name: local-storage-pv-1
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/es
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - master1
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-storage-pv-2
  namespace: elasticsearch
  labels:
    name: local-storage-pv-2
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/es
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - master2
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-storage-pv-3
  namespace: elasticsearch
  labels:
    name: local-storage-pv-3
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/es
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - master3
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-storage-pv-4
  namespace: elasticsearch
  labels:
    name: local-storage-pv-4
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/es
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node1
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-storage-pv-5
  namespace: elasticsearch
  labels:
    name: local-storage-pv-5
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/es
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node2

一共是5个PV,每个都通过nodeSelectorTerms跟k8s节点绑定。
执行一下:

kubectl apply -f pv.yaml

3、创建StatefulSet,ES属于数据库类型的应用,此类应用适合StatefulSet类型

[root@master1 elk]# cat sts.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es7-cluster
  namespace: elasticsearch
spec:
  serviceName: elasticsearch7
  replicas: 5
  selector:
    matchLabels:
      app: elasticsearch7
  template:
    metadata:
      labels:
        app: elasticsearch7
    spec:
      containers:
      - name: elasticsearch7
        image: elasticsearch:7.16.2
        resources:
            limits:
              cpu: 1000m
            requests:
              cpu: 100m
        ports:
        - containerPort: 9200
          name: rest
          protocol: TCP
        - containerPort: 9300
          name: inter-node
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        env:
          - name: cluster.name
            value: k8s-logs
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: discovery.zen.minimum_master_nodes
            value: "2"
          - name: discovery.seed_hosts
            value: "es7-cluster-0.elasticsearch7,es7-cluster-1.elasticsearch7,es7-cluster-2.elasticsearch7"
          - name: cluster.initial_master_nodes
            value: "es7-cluster-0,es7-cluster-1,es7-cluster-2"
          - name: ES_JAVA_OPTS
            value: "-Xms1g -Xmx1g"
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-vm-max-map
        image: busybox
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: busybox
        command: ["sh", "-c", "ulimit -n 65536"]
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "local-storage"
      resources:
        requests:
          storage: 1Gi

该ES集群通过volumeClaimTemplates来关联storageClass,并自动绑定相应的PV。
执行一下:

kubectl apply -f sts.yaml

4、创建NodePort类型的Service来蒋ES集群暴漏出去

[root@master1 elk]# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch7
  namespace: elasticsearch
spec:
  selector:
    app: elasticsearch7
  type: NodePort
  ports:
  - port: 9200
    nodePort: 30002
    targetPort: 9200

执行一下:

kubectl apply -f svc.yaml

以上就创建完了,我们来看一下上面创建的资源状态:
(1)storageclass

[root@master1 elk]# kubectl get sc
NAME            PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-storage   kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  21h

(2)PV

[root@master1 elk]# kubectl get pv
NAME                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                              STORAGECLASS    REASON   AGE
local-storage-pv-1   1Gi        RWO            Retain           Bound    elasticsearch/data-es7-cluster-1   local-storage            21h
local-storage-pv-2   1Gi        RWO            Retain           Bound    elasticsearch/data-es7-cluster-2   local-storage            21h
local-storage-pv-3   1Gi        RWO            Retain           Bound    elasticsearch/data-es7-cluster-0   local-storage            21h
local-storage-pv-4   1Gi        RWO            Retain           Bound    elasticsearch/data-es7-cluster-4   local-storage            19m
local-storage-pv-5   1Gi        RWO            Retain           Bound    elasticsearch/data-es7-cluster-3   local-storage            19m

[root@master1 tmp]# kubectl get pvc -n elasticsearch
NAME                 STATUS   VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS    AGE
data-es7-cluster-0   Bound    local-storage-pv-3   1Gi        RWO            local-storage   21h
data-es7-cluster-1   Bound    local-storage-pv-1   1Gi        RWO            local-storage   21h
data-es7-cluster-2   Bound    local-storage-pv-2   1Gi        RWO            local-storage   21h
data-es7-cluster-3   Bound    local-storage-pv-5   1Gi        RWO            local-storage   20m
data-es7-cluster-4   Bound    local-storage-pv-4   1Gi        RWO            local-storage   19m

(3)StatefulSet

[root@master1 elk]# kubectl get statefulset -n elasticsearch
NAME          READY   AGE
es7-cluster   5/5     21h
[root@master1 tmp]# kubectl get pod -n elasticsearch
NAME            READY   STATUS    RESTARTS   AGE
es7-cluster-0   1/1     Running   1          21h
es7-cluster-1   1/1     Running   1          21h
es7-cluster-2   1/1     Running   1          21h
es7-cluster-3   1/1     Running   0          19m
es7-cluster-4   1/1     Running   0          18m

(4)Service

[root@master1 tmp]# kubectl get svc -n elasticsearch
NAME             TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
elasticsearch7   NodePort   10.97.196.176   <none>        9200:30002/TCP   21h

(5)通过restful接口查看ES集群状态

[root@master1 elk]# curl 192.168.1.3:30002/_cat/nodes?v
ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
10.244.136.5             60          39   1    0.19    0.31     0.36 cdfhilmrstw -      es7-cluster-0
10.244.104.1             45          41   1    0.98    0.44     0.25 cdfhilmrstw -      es7-cluster-3
10.244.180.5             40          40   1    0.28    0.32     0.32 cdfhilmrstw -      es7-cluster-2
10.244.166.141           63          41   1    0.06    0.14     0.14 cdfhilmrstw -      es7-cluster-4
10.244.137.68            44          41   1    0.29    0.45     0.59 cdfhilmrstw *      es7-cluster-1

通过网页访问也是正常的:
在这里插入图片描述
5、部署kibana
kibana我们使用Deployment类型来部署,而它的Service我们使用NodePort,完整的代码如下:

[root@master1 elk]# cat kibana.yaml 
apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: elasticsearch
  labels:
    app: kibana
spec:
  ports:
  - port: 5601
    targetPort: 5601
    nodePort: 30001
  type: NodePort
  selector:
    app: kibana
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: elasticsearch
  labels:
    app: kibana
spec:
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      nodeSelector:
        node: node2
      containers:
      - name: kibana
        image: kibana:7.16.2
        resources:
          limits:
            cpu: 1000m
          requests:
            cpu: 1000m
        env:
        - name: ELASTICSEARCH_HOSTS
          value: http://elasticsearch7:9200
        - name: SERVER_PUBLICBASEURL
          value: "0.0.0.0:5601"
        - name: I18N.LOCALE
          value: zh-CN
        ports: 
        - containerPort: 5601

上面的Deployment部分,我们通过nodeSelector指定调度到了node2节点,前提是给node2节点加了个node=node2这样一个标签。
执行一下:

[root@master1 elk]# kubectl apply -f kibana.yaml 

再查看一下状态:

[root@master1 elk]# kubectl get all -n elasticsearch
NAME                          READY   STATUS    RESTARTS   AGE
pod/es7-cluster-0             1/1     Running   0          47m
pod/es7-cluster-1             1/1     Running   0          46m
pod/es7-cluster-2             1/1     Running   0          46m
pod/es7-cluster-3             1/1     Running   0          43m
pod/es7-cluster-4             1/1     Running   0          42m
pod/kibana-768595479f-mhw9q   1/1     Running   0          13m

NAME                     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/elasticsearch7   NodePort   10.108.115.19   <none>        9200:30002/TCP   47m
service/kibana           NodePort   10.111.66.207   <none>        5601:30001/TCP   13m

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/kibana   1/1     1            1           13m

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/kibana-768595479f   1         1         1       13m

NAME                           READY   AGE
statefulset.apps/es7-cluster   5/5     47m

看到kibana的Service和Pod都在运行中了,通过页面验证一下kibana能不能访问:
在这里插入图片描述

### 回答1: Kubernetesk8s)是一个流行的容器编排平台,可以用于部署Elasticsearch集群。以下是部署Elasticsearch集群的一些步骤: 1. 创建Kubernetes集群:您需要先创建一个Kubernetes集群,可以使用公共云提供商(如AWS、GCP、Azure)或私有云(如OpenStack)。 2. 安装Elasticsearch:您可以使用Helm chart或自定义YAML文件来安装Elasticsearch。在安装过程中,您需要指定Elasticsearch节点的数量、资源限制和其他配置。 3. 配置Elasticsearch:您需要配置Elasticsearch集群的网络、存储和安全设置。您可以使用Kubernetes的网络插件(如Calico、Flannel)来配置网络,使用Kubernetes的存储卷(如PersistentVolumeClaim)来配置存储,使用Kubernetes的Secret对象来配置安全设置。 4. 部署Kibana:如果您想使用Kibana来可视化Elasticsearch数据,您可以使用Helm chart或自定义YAML文件来部署Kibana。在部署过程中,您需要指定Kibana的资源限制和其他配置。 5. 配置Kibana:您需要配置Kibana的网络、存储和安全设置。您可以使用Kubernetes的网络插件(如Calico、Flannel)来配置网络,使用Kubernetes的存储卷(如PersistentVolumeClaim)来配置存储,使用Kubernetes的Secret对象来配置安全设置。 6. 部署Logstash:如果您想使用Logstash来收集和处理日志数据,您可以使用Helm chart或自定义YAML文件来部署Logstash。在部署过程中,您需要指定Logstash的资源限制和其他配置。 7. 配置Logstash:您需要配置Logstash的网络、存储和安全设置。您可以使用Kubernetes的网络插件(如Calico、Flannel)来配置网络,使用Kubernetes的存储卷(如PersistentVolumeClaim)来配置存储,使用Kubernetes的Secret对象来配置安全设置。 8. 测试集群:您可以使用curl或其他工具来测试Elasticsearch集群、Kibana和Logstash的功能和性能。 以上是部署Elasticsearch集群的一些步骤,具体实现可能因环境和需求而异。 ### 回答2: Elasticsearch是一个流行的开源搜索引擎和分布式文档存储和分析系统,有着广泛的应用领域,例如搜索、日志分析、业务指标监控、全文检索等方面。在生产环境中,使用KubernetesK8s部署Elasticsearch集群可能是一个不错的选择。下面将简要介绍如何使用K8s部署Elasticsearch集群。 1. 首先,需要准备Elasticsearch Docker镜像,并将其推送到私有或公共的Docker镜像仓库中。如何构建和推送Docker镜像超出本文范围。 2. 接下来,需要定义Elasticsearch集群K8s Object。这里可以使用StatefulSet,用于支持有状态应用程序的部署。同时,需要为每个Pod定义一个独特的网络标识符(hostname),以便它们之间能够互相通信。 3. 进一步,需要创建一个K8s Service,提供对Elasticsearch集群的访问。这可以使用ClusterIP类型的Service,允许在集群内部访问Elasticsearch集群。如果需要在集群外部访问Elasticsearch集群,则可以使用NodePort或LoadBalancer类型的Service,具体取决于环境需求。 4. 配置Elasticsearch集群的存储,以确保数据可持久化存储。这可以使用K8s提供的PersistentVolume或Dynamic Provisioning方式来完成,实现数据持久化存储,并保留Elasticsearch集群数据。同时,建议在Elasticsearch集群中使用minimun_master_nodes属性来避免脑裂(brain split)问题。 5. 可以通过挂载ConfigMap或Secret到Elasticsearch集群中的容器中,来配置Elasticsearch。例如,可以配置Xpack安全性和备份等特性。 6. 创建一个K8s Job,用于初始化Elasticsearch集群。这可以在第一次部署Elasticsearch或者需要重新启动Elasticsearch时使用。初始化作业可以使用Elasticsearch提供的命令行工具,如elasticsearch-keystore、elasticsearch-setup-passwords、elasticsearch-certutil等工具。 7. 最后,可以使用K8s提供的各种监控与日志分析工具,如Prometheus、Grafana、Elasticsearch监控插件等,来监控和管理Elasticsearch集群。 总之,使用K8s部署Elasticsearch集群可以有效简化部署和管理过程,并提高可靠性和可维护性。然而,需要充分理解Elasticsearch的配置和性能特性,以充分发挥其潜力。同时,需要考虑节点数量、硬件负载和可用性等方面的因素,以确保集群的高可用性和性能。 ### 回答3: Kubernetes是一个容器编排平台,可以方便地部署和管理分布式应用程序。在k8s中,我们可以使用ElasticsearchES)的官方Kubernetes运行时部署一组ES节点,从而创建一个高可用,可扩展且可靠的ES集群。在本文中,我们将描述如何在Kubernetes部署ES集群。 1. 前提条件 在开始之前,我们需要准备一个Kubernetes集群,在集群上安装好kubectl CLI和helm工具,以及一个持久存储卷插件(可以使用NFS或者云存储服务商自带的插件)。 2. 创建ES集群 使用helm工具,在Kubernetes上安装ES集群,可以快速地生成可部署ES服务。在安装之前,我们需要设置一些ES集群的参数,如节点数量、内存分配、存储容量等。这些参数根据我们的业务需求进行配置。 helm install --set replicas=3,esJavaOpts='-Xms2g -Xmx2g' elastic/elasticsearch 3. 监控集群部署ES集群之后,我们需要监控集群的健康状态,以及运行时数据等。通过Promethues+Grafana等监控工具,我们可以轻松地监视ES集群,确保集群的稳定性和高可用性。 4. 备份和恢复 为了保证数据的安全性,我们需要定期备份ES集群的数据。在集群发生故障时,我们可以通过备份数据来恢复集群。可以使用Velero等备份恢复工具来进行ES集群的备份和恢复。 总结 Kubernetes是一个在云时代中兴起的容器编排平台。通过使用Kubernetes运行时,我们可以轻松地部署和管理ES集群,从而构建一个高可用,可伸缩的系统。同时,ES集群的监控和备份工作也非常重要,因为数据在大型分布式系统中是最重要的资产之一。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dustin.Hoffman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值