社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

如何在Kubernetes上部署高可用和可扩展的Elasticsearch?

Docker • 6 年前 • 595 次点击  


上一篇文章中,我们通过扩展MongoDB副本集来了解有StatefulSets。 在这篇文章中,我们将与ES-HQ和Kibana一起使用HA Elasticsearch集群(具有不同的Master,Data和Client节点)。

先决条件


  1. Elasticsearch的基本知识,其Node类型及角色

  2. 运行至少有3个节点的Kubernetes集群(至少4Cores 4GB)

  3. Kibana的相关知识


部署架构图



  • Elasticsearch Data Node的Pod被部署为具有Headless Service的StatefulSets,以提供稳定的网络ID。

  • Elasticsearch Master Node的Pod被部署为具有Headless Service的副本集,这将有助于自动发现。

  • Elasticsearch Client Node的Pod部署为具有内部服务的副本集,允许访问R/W请求的Data Node。

  • Kibana和ElasticHQ Pod被部署为副本集,其服务可在Kubernetes集群外部访问,但仍在您的子网内部(除非另有要求,否则不公开)。

  • 为Client Node部署HPA(Horizonal Pod Auto-scaler)以在高负载下实现自动伸缩。


要记住的重要事项:

  1. 设置ESJAVAOPT环境变量。

  2. 设置CLUSTER_NAME环境变量。

  3. 为Master Node的部署设置NUMBEROFMASTERS环境变量(防止脑裂问题)。如果有3个Masters,我们必须设置为2。

  4. 在类似的pod中设置正确的Pod-AntiAffinity策略,以便在工作节点发生故障时确保HA。


让我们直接将这些服务部署到我们的GKE集群。

Master节点部署:

  1. apiVersion: v1

  2. kind: Namespace

  3. metadata:

  4.  name: elasticsearch

  5. ---

  6. apiVersion: apps/v1beta1

  7. kind: Deployment

  8. metadata:

  9.  name: es-master

  10.  namespace: elasticsearch

  11.  labels:

  12.    component: elasticsearch

  13.    role: master

  14. spec:

  15.  replicas: 3

  16.  template:

  17.    metadata:

  18.      labels:

  19.        component: elasticsearch

  20.        role: master

  21.    spec:

  22.      affinity:

  23.        podAntiAffinity:

  24.          preferredDuringSchedulingIgnoredDuringExecution:

  25.          - weight: 100

  26.            podAffinityTerm:

  27.              labelSelector:

  28.                matchExpressions:

  29.                - key: role

  30.                  operator: In

  31.                  values:

  32.                  - master

  33.              topologyKey: kubernetes.io/hostname

  34.      initContainers:

  35.      - name: init-sysctl

  36.        image: busybox:1.27.2

  37.        command:

  38.        - sysctl

  39.        - -w

  40.        - vm.max_map_count=262144

  41.        securityContext :

  42.          privileged: true

  43.      containers:

  44.      - name: es-master

  45.        image: quay.io/pires/docker-elasticsearch-kubernetes:6.2.4

  46.        env:

  47.        - name: NAMESPACE

  48.          valueFrom:

  49.            fieldRef:

  50.              fieldPath: metadata.namespace

  51.        - name: NODE_NAME

  52.          valueFrom:

  53.            fieldRef:

  54.              fieldPath: metadata.name

  55.        - name: CLUSTER_NAME

  56.          value: my-es

  57.        - name: NUMBER_OF_MASTERS

  58.          value: "2"

  59.        - name: NODE_MASTER

  60.          value: "true"

  61.        - name: NODE_INGEST

  62.          value: "false"

  63.        - name: NODE_DATA

  64.          value: "false"

  65.        - name: HTTP_ENABLE

  66.          value: "false"

  67.        - name: ES_JAVA_OPTS

  68.          value: -Xms256m -Xmx256m

  69.        - name: PROCESSORS

  70.          valueFrom:

  71.            resourceFieldRef:

  72.              resource: limits.cpu

  73.        resources:

  74.          limits:

  75.            cpu: 2

  76.        ports:

  77.        - containerPort : 9300

  78.          name: transport

  79.        volumeMounts:

  80.        - name: storage

  81.          mountPath: /data

  82.      volumes:

  83.          - emptyDir:

  84.              medium: ""

  85.            name: "storage"

  86. ---

  87. apiVersion: v1

  88. kind: Service

  89. metadata:

  90.  name: elasticsearch-discovery

  91.  namespace: elasticsearch

  92.  labels:

  93.    component: elasticsearch

  94.    role: master

  95. spec:

  96.  selector:

  97.    component: elasticsearch

  98.    role: master

  99.  ports:

  100.  - name: transport

  101.    port: 9300

  102.    protocol: TCP

  103.  clusterIP: None

  1. root$ kubectl apply -f es-master.yml

  2. root$ kubectl -n elasticsearch get all

  3. NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE

  4. deploy /es-master   3         3         3            3           32s

  5. NAME                      DESIRED   CURRENT   READY     AGE

  6. rs/es-master-594b58b86c   3         3         3         31s

  7. NAME                            READY     STATUS    RESTARTS   AGE

  8. po/es-master-594b58b86c-9jkj2   1/1       Running   0          31s

  9. po/es- master-594b58b86c-bj7g7   1/1       Running   0          31s

  10. po/es-master-594b58b86c-lfpps   1/1       Running   0          31s

  11. NAME                          TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE

  12. svc/elasticsearch-discovery   ClusterIP   None                9300/TCP   31s


有趣的是,可以从任何主节点pod的日志来见证它们之间的master选举,然后何时添加新的data和client节点。

  1. root$ kubectl -n elasticsearch logs -f po/es-master-594b58b86c-9jkj2 | grep ClusterApplierService

  2. [2018-10-21T07:41:54,958][INFO ][o.e.c.s.ClusterApplierService] [es-master-594b58b86c-9jkj2] detected_master {es-master-594b58b86c -bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300}, added {{es-master-594b58b86c-lfpps}{wZQmXr5fSfWisCpOHBhaMg}{50jGPeKLSpO9RU_HhnVJCA}{10.9.124.81}{10.9.124.81:9300},{es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300},}, reason: apply cluster state (from master [ master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300} committed version [3]])


可以看出,名为es-master-594b58b86c-bj7g7的es-master pod被选为master节点,其他2个Pod被添加到这个集群。

名为elasticsearch-discovery的Headless Service默认设置为Docker镜像中的env变量,用于在节点之间进行发现。 当然这是可以被改写的。

同样,我们可以部署Data和Client节点。 配置如下:

Data节点部署:

  1. apiVersion: v1

  2. kind: Namespace

  3. metadata:

  4.  name: elasticsearch

  5. ---

  6. apiVersion: storage.k8s.io/v1beta1

  7. kind: StorageClass

  8. metadata:

  9.  name: fast

  10. provisioner: kubernetes.io/gce-pd

  11. parameters:

  12.  type: pd-ssd

  13.  fsType : xfs

  14. allowVolumeExpansion: true

  15. ---

  16. apiVersion: apps/v1beta1

  17. kind: StatefulSet

  18. metadata:

  19.  name: es-data

  20.  namespace: elasticsearch

  21.  labels:

  22.    component: elasticsearch

  23.    role: data

  24. spec:

  25.  serviceName: elasticsearch-data

  26.  replicas: 3

  27.  template:

  28.    metadata:

  29.      labels:

  30.        component: elasticsearch

  31.        role: data

  32.    spec:

  33.      affinity:

  34.        podAntiAffinity:

  35.          preferredDuringSchedulingIgnoredDuringExecution:

  36.          - weight: 100

  37.            podAffinityTerm:

  38.              labelSelector:

  39.                matchExpressions:

  40.                - key: role

  41.                  operator: In

  42.                  values:

  43.                  - data

  44.              topologyKey: kubernetes.io/hostname

  45.      initContainers:

  46.      - name: init-sysctl

  47.        image: busybox:1.27.2

  48.        command:

  49.        - sysctl

  50.        - -w

  51.        - vm.max_map_count=262144

  52.        securityContext:

  53.          privileged: true

  54.      containers:

  55.      - name: es-data

  56.        image: quay.io/pires/docker-elasticsearch-kubernetes:6.2.4

  57.        env:

  58.        - name: NAMESPACE

  59.          valueFrom:

  60.            fieldRef:

  61.              fieldPath: metadata.namespace

  62.        - name: NODE_NAME

  63.          valueFrom:

  64.            fieldRef:

  65.              fieldPath: metadata.name

  66.        - name: CLUSTER_NAME

  67.          value: my-es

  68.        - name: NODE_MASTER

  69.          value: "false"

  70.        - name: NODE_INGEST

  71.          value: "false"

  72.        - name: HTTP_ENABLE

  73.          value: "false"

  74.        - name: ES_JAVA_OPTS

  75.          value: -Xms256m -Xmx256m

  76.        - name: PROCESSORS

  77.          valueFrom:

  78.            resourceFieldRef:

  79.              resource: limits.cpu

  80.        resources:

  81.          limits:

  82.            cpu: 2

  83.        ports:

  84.        - containerPort: 9300

  85.          name: transport

  86.        volumeMounts:

  87.        - name: storage

  88.          mountPath: /data

  89.  volumeClaimTemplates:

  90.  - metadata:

  91.      name: storage

  92.      annotations:

  93.        volume.beta.kubernetes.io/storage-class: "fast"

  94.    spec:

  95.      accessModes: [ "ReadWriteOnce" ]

  96.      storageClassName: fast

  97.      resources:

  98.        requests:

  99.          storage : 10Gi

  100. ---

  101. apiVersion: v1

  102. kind: Service

  103. metadata:

  104.  name: elasticsearch-data

  105.  namespace: elasticsearch

  106.  labels:

  107.    component: elasticsearch

  108.    role: data

  109. spec:

  110.  ports :

  111.  - port: 9300

  112.    name: transport

  113.  clusterIP: None

  114.  selector:

  115.    component: elasticsearch

  116.    role: data


Headless Service为Data节点提供稳定的网络ID,有助于它们之间的数据传输。

在将持久卷附加到pod之前格式化它是很重要的。 这可以通过在创建storage class时指定卷类型来完成。 我们还可以设置标志以允许动态扩展。这里[1]可以阅读更多内容。

  1. ...

  2. parameters:  

  3.  type: pd-ssd  

  4.  fsType: xfs

  5. allowVolumeExpansion: true

  6. ...


Client节点部署:

  1. apiVersion: v1

  2. kind: Namespace

  3. metadata:

  4.  name: elasticsearch

  5. ---

  6. apiVersion: apps/v1beta1

  7. kind: Deployment

  8. metadata:

  9.  name: es-client

  10.  namespace: elasticsearch

  11.  labels:

  12.    component: elasticsearch

  13.    role: client

  14. spec:

  15.  replicas: 2

  16.  template:

  17.    metadata :

  18.      labels:

  19.        component: elasticsearch

  20.        role: client

  21.    spec:

  22.      affinity:

  23.        podAntiAffinity:

  24.          preferredDuringSchedulingIgnoredDuringExecution:

  25.          - weight: 100

  26.            podAffinityTerm:

  27.              labelSelector:

  28.                matchExpressions:

  29.                - key: role

  30.                  operator: In

  31.                  values:

  32.                  - client

  33.              topologyKey: kubernetes.io/hostname

  34.      initContainers:

  35.      - name: init-sysctl

  36.        image: busybox:1.27.2

  37.        command:

  38.        - sysctl

  39.        - -w

  40.        - vm.max_map_count=262144

  41.        securityContext:

  42.          privileged: true

  43.      containers:

  44.      - name: es-client

  45.        image: quay.io/pires/docker-elasticsearch-kubernetes: 6.2.4

  46.        env:

  47.        - name: NAMESPACE

  48.          valueFrom:

  49.            fieldRef:

  50.              fieldPath: metadata.namespace

  51.        - name: NODE_NAME

  52.          valueFrom:

  53.            fieldRef:

  54.              fieldPath: metadata.name

  55.        - name : CLUSTER_NAME

  56.          value: my-es

  57.        - name: NODE_MASTER

  58.          value: "false"

  59.        - name: NODE_DATA

  60.          value: "false"

  61.        - name: HTTP_ENABLE

  62.          value: "true"

  63.        - name: ES_JAVA_OPTS

  64.          value: -Xms256m -Xmx256m

  65.        - name: NETWORK_HOST

  66.          value: _site_,_lo_

  67.        - name: PROCESSORS

  68.          valueFrom:

  69.            resourceFieldRef:

  70.              resource: limits.cpu

  71.        resources:

  72.          limits:

  73.            cpu: 1

  74.        ports:

  75.        - containerPort: 9200

  76.          name: http

  77.        - containerPort: 9300

  78.          name: transport

  79.        volumeMounts:

  80.        - name: storage

  81.          mountPath: /data

  82.      volumes:

  83.          - emptyDir:

  84.              medium: ""

  85.            name: storage

  86. ---

  87. apiVersion: v1

  88. kind: Service

  89. metadata:

  90.  name: elasticsearch

  91.  namespace: elasticsearch

  92.  annotations:

  93.    cloud.google.com /load-balancer-type: Internal

  94.  labels:

  95.    component: elasticsearch

  96.    role: client

  97. spec:

  98.  selector:

  99.    component: elasticsearch

  100.    role: client

  101.  ports:

  102.  - name: http

  103.    port: 9200

  104.  type: LoadBalancer


此处部署的服务是从Kubernetes集群外部访问ES群集,但仍在我们的子网内部。 注释掉 cloud.google.com/load-balancer-type:Internal可确保这一点。

但是,如果我们的ES集群中的应用程序部署在集群中,则可以通过 http://elasticsearch.elasticsearch:9200 来访问ElasticSearch服务。

创建这两个deployments后,新创建的client和data节点将自动添加到集群中。(观察master pod的日志)

  1. root$ kubectl apply -f es-data.yml

  2. root$ kubectl -n elasticsearch get pods -l role=data

  3. NAME        READY     STATUS    RESTARTS   AGE

  4. es-data-0   1/1       Running   0          48s

  5. es-data-1   1/1       Running   0          28s

  6. --------------------------------------------------------------------

  7. root$ kubectl apply -f es-client.yml

  8. root$ kubectl -n elasticsearch get pods -l role=client

  9. NAME                         READY     STATUS    RESTARTS   AGE

  10. es-client-69b84b46d8-kr7j4   1/1       Running   0          47s

  11. es-client-69b84b46d8-v5pj2   1/1       Running   0          47s

  12. --------------------------------------------------------------------

  13. root$ kubectl -n elasticsearch get all

  14. NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE

  15. deploy/es-client   2         2         2            2           1m

  16. deploy/es-master   3         3         3            3           9m

  17. NAME                      DESIRED   CURRENT   READY     AGE

  18. rs/es-client-69b84b46d8   2         2         2         1m

  19. rs/es-master-594b58b86c   3         3         3         9m

  20. NAME                   DESIRED   CURRENT   AGE

  21. statefulsets/es-data   2         2         3m

  22. NAME                            READY     STATUS    RESTARTS   AGE

  23. po/es-client-69b84b46d8-kr7j4   1/1       Running   0          1m

  24. po/es-client-69b84b46d8-v5pj2   1/1       Running   0          1m

  25. po/es-data-0                    1/1       Running   0          3m

  26. po/es -data-1                    1/1       Running   0          3m

  27. po/es-master-594b58b86c-9jkj2   1/1       Running   0          9m

  28. po/es-master-594b58b86c-bj7g7   1/1       Running   0          9m

  29. po/es-master-594b58b86c-lfpps   1 /1       Running   0          9m

  30. NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE

  31. svc/elasticsearch             LoadBalancer   10.9.121.160 10.9.120.8     9200:32310/TCP   1m

  32. svc/elasticsearch-data        ClusterIP   None                  9300/TCP         3m

  33. svc/elasticsearch-discovery   ClusterIP   None                  9300/TCP         9m

  34. --------------------------------------------------------------------

  35. #Check logs of es-master leader pod

  36. root$ kubectl -n elasticsearch logs po/es-master-594b58b86c-bj7g7 | grep ClusterApplierService

  37. [2018-10-21T07:41:53,731][INFO ][o.e.c.s.ClusterApplierService] [es-master- 594b58b86c-bj7g7] new_master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300}, added {{es-master-594b58b86c-lfpps}{wZQmXr5fSfWisCpOHBhaMg}{50jGPeKLSpO9RU_HhnVJCA}{10.9.124.81}{10.9.124.81:9300},}, reason: apply cluster state (from master [master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA }{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300} committed version [1] source [zen-disco-elected-as-master ([1] nodes joined)[{es-master-594b58b86c-lfpps}{wZQmXr5fSfWisCpOHBhaMg}{50jGPeKLSpO9RU_HhnVJCA}{10.9.124.81}{10.9.124.81:9300}]]])

  38. [2018-10-21T07:41:55,162 ][INFO ][o.e.c.s.ClusterApplierService] [es-master-594b58b86c-bj7g7] added {{es-master-594b58b86c-9jkj2}{x9Prp1VbTq6_kALQVNwIWg}{7NHUSVpuS0mFDTXzAeKRcg}{10.9.125.81}{10.9.125.81:9300},}, reason: apply cluster state (from master [master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9. 126.87}{10.9.126.87:9300} committed version [3] source [zen-disco-node-join[{es-master-594b58b86c-9jkj2}{x9Prp1VbTq6_kALQVNwIWg}{7NHUSVpuS0mFDTXzAeKRcg}{10.9.125.81}{10.9.125.81:9300}]]])

  39. [2018-10-21T07:48:02,485][INFO ][o.e.c.s.ClusterApplierService ] [es-master-594b58b86c-bj7g7] added {{es-data-0}{SAOhUiLiRkazskZ_TC6EBQ}{qirmfVJBTjSBQtHZnz-QZw}{10.9.126.88}{10.9.126.88:9300},}, reason: apply cluster state (from master [master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300} committed version [4] source [zen-disco-node-join[{es-data-0}{SAOhUiLiRkazskZ_TC6EBQ}{qirmfVJBTjSBQtHZnz-QZw}{10.9.126.88}{10.9.126.88:9300}]]])

  40. [2018-10-21T07:48:21,984][INFO ][o.e.c.s.ClusterApplierService] [es-master-594b58b86c-bj7g7] added {{ es-data-1}{fiv5Wh29TRWGPumm5ypJfA}{EXqKGSzIQquRyWRzxIOWhQ}{10.9.125.82}{10.9.125.82:9300},}, reason: apply cluster state (from master [master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300} committed version [5] source [zen-disco-node-join[{es-data-1}{ fiv5Wh29TRWGPumm5ypJfA}{EXqKGSzIQquRyWRzxIOWhQ}{10.9.125.82}{10.9.125.82:9300}]]])

  41. [2018-10-21T07:50:51,245][INFO ][o.e.c.s.ClusterApplierService] [es-master-594b58b86c-bj7g7] added {{es-client-69b84b46d8-v5pj2}{MMjA_tlTS7ux-UW44i0osg}{rOE4nB_jSmaIQVDZCjP8Rg}{10.9.125.83 }{10.9.125.83:9300},}, reason: apply cluster state (from master [master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300} committed version [6] source [zen-disco-node-join[{es-client-69b84b46d8-v5pj2}{MMjA_tlTS7ux-UW44i0osg}{rOE4nB_jSmaIQVDZCjP8Rg}{10.9.125.83}{10.9 .125.83:9300}]]])

  42. [2018-10-21T07:50:58,964][INFO ][o.e.c.s.ClusterApplierService] [es-master-594b58b86c-bj7g7] added {{es-client-69b84b46d8-kr7j4}{gGC7F4diRWy2oM1TLTvNsg}{IgI6g3iZT5Sa0HsFVMpvvw}{10.9.124.82}{10.9.124.82:9300},}, reason: apply cluster state ( from master [master {es-master-594b58b86c-bj7g7}{1aFT97hQQ7yiaBc2CYShBA}{Q3QzlaG3QGazOwtUl7N75Q}{10.9.126.87}{10.9.126.87:9300} committed version [7] source [zen-disco-node-join[{es-client-69b84b46d8-kr7j4}{gGC7F4diRWy2oM1TLTvNsg}{IgI6g3iZT5Sa0HsFVMpvvw}{10.9.124.82}{10.9.124.82:9300}]]])


leading master pod的日志清楚地描述了每个节点何时添加到集群。 这在调试问题时非常有用。

部署完所有组件后,我们应验证以下内容:

1、在kubernetes集群内部使用ubuntu容器进行Elasticsearch部署的验证。

  1. root$ kubectl run my-shell --rm -i --tty --image ubuntu -- bash

  2. root@my-shell-68974bb7f7-pj9x6:/# curl http://elasticsearch.elasticsearch:9200/_cluster/health?pretty

  3. {

  4. "cluster_name" : "my-es",

  5. "status" : "green",

  6. "timed_out" : false,

  7. "number_of_nodes" : 7,

  8. "number_of_data_nodes" : 2,

  9. "active_primary_shards" : 0,

  10. "active_shards" : 0,

  11. "relocating_shards" : 0,

  12. "initializing_shards" : 0,

  13. "unassigned_shards" : 0,

  14. "delayed_unassigned_shards" : 0,

  15. "number_of_pending_tasks" : 0,

  16. "number_of_in_flight_fetch" : 0,

  17. "task_max_waiting_in_queue_millis" : 0,

  18. "active_shards_percent_as_number" : 100.0

  19. }


2、在kubernetes集群外部使用GCP内部LoadBalancer IP(这里是10.9.120.8)进行Elasticsearch部署的验证。

  1. root$ curl http://10.9.120.8:9200/_cluster/health?pretty

  2. {

  3. "cluster_name" : "my-es",

  4. "status" : "green",

  5. "timed_out" : false,

  6. "number_of_nodes" : 7,

  7. "number_of_data_nodes" : 2,

  8. "active_primary_shards" : 0,

  9. "active_shards" : 0,

  10. "relocating_shards" : 0,

  11. "initializing_shards" : 0,

  12. "unassigned_shards" : 0,

  13. "delayed_unassigned_shards" : 0,

  14. "number_of_pending_tasks" : 0,

  15. "number_of_in_flight_fetch" : 0,

  16. "task_max_waiting_in_queue_millis" : 0,

  17. "active_shards_percent_as_number" : 100.0

  18. }


3、ES-Pods的Anti-Affinity规则验证。

  1. root$ kubectl -n elasticsearch get pods -o wide

  2. NAME                         READY     STATUS    RESTARTS   AGE       IP            NODE

  3. es-client-69b84b46d8-kr7j4   1/1       Running   0          10m       10.8.14.52   gke-cluster1-pool1-d2ef2b34-t6h9

  4. es-client-69b84b46d8-v5pj2   1/1       Running   0          10m       10.8.15.53   gke-cluster1-pool1-42b4fbc4-cncn

  5. es-data-0                    1/1       Running   0          12m       10.8.16.58   gke-cluster1-pool1-4cfd808c-kpx1

  6. es-data-1                    1/1       Running   0          12m       10.8.15.52   gke-cluster1-pool1-42b4fbc4-cncn

  7. es-master-594b58b86c-9jkj2   1/1       Running   0          18m       10.8.15.51   gke-cluster1-pool1-42b4fbc4-cncn

  8. es-master-594b58b86c-bj7g7   1/1       Running   0          18m       10.8.16.57   gke-cluster1-pool1-4cfd808c-kpx1

  9. es-master-594b58b86c-lfpps   1/1       Running   0          18m       10.8.14.51   gke-cluster1-pool1-d2ef2b34-t6h9


请注意,同一节点上没有2个类似的Pod。 这可以在节点发生故障时确保HA。

Scaling相关注意事项


我们可以根据CPU阈值为client节点部署autoscalers。 Client节点的HPA示例可能如下所示:




    
  1. apiVersion: autoscaling/v1

  2. kind: HorizontalPodAutoscaler

  3. metadata:

  4.  name: es-client

  5.  namespace: elasticsearch

  6. spec:

  7.  maxReplicas: 5

  8.  minReplicas: 2

  9.  scaleTargetRef:

  10.    apiVersion: extensions /v1beta1

  11.    kind: Deployment

  12.    name: es-client

  13. targetCPUUtilizationPercentage: 80


每当autoscaler启动时,我们都可以通过观察任何master pod的日志来观察添加到集群中的新client节点Pod。

对于Data Node Pod,我们必须使用K8 Dashboard或GKE控制台增加副本数量。 新创建的data节点将自动添加到集群中,并开始从其他节点复制数据。

Master Node Pod不需要自动扩展,因为它们只存储集群状态信息,但是如果要添加更多data节点,请确保集群中没有偶数个master节点,同时环境变量NUMBEROFMASTERS也需要相应调整。

部署Kibana和ES-HQ


Kibana是一个可视化ES数据的简单工具,ES-HQ有助于管理和监控Elasticsearch集群。 对于我们的Kibana和ES-HQ部署,我们记住以下事项:

  • 我们提供ES-Cluster的名称作为Docker镜像的环境变量

  • 访问Kibana/ES-HQ部署的服务仅在我们组织内部,即不创建公共IP。 我们使用GCP内部负载均衡。


Kibana部署:

  1. apiVersion: v1

  2. kind: Namespace

  3. metadata:

  4.  name: elasticsearch

  5. ---

  6. apiVersion: apps/v1beta1

  7. kind: Deployment

  8. metadata:

  9.  name: es-kibana

  10.  namespace: elasticsearch

  11.  labels:

  12.    component: elasticsearch

  13.    role: kibana

  14. spec:

  15.  replicas: 1

  16.  template:

  17.    metadata:

  18.      labels:

  19.        component: elasticsearch

  20.        role: kibana

  21.    spec:

  22.      containers:

  23.      - name: es-kibana

  24.        image: docker.elastic.co/kibana/kibana-oss:6.2.2

  25.        env:

  26.        - name: CLUSTER_NAME

  27.          value: my-es

  28.        - name: ELASTICSEARCH_URL

  29.          value: http://elasticsearch:9200

  30.        resources:

  31.          limits:

  32.            cpu: 0.5

  33.        ports:

  34.        - containerPort: 5601

  35.          name: http

  36. ---

  37. apiVersion: v1

  38. kind: Service

  39. metadata:

  40.  name: kibana

  41.  annotations:

  42.    cloud.google.com/load-balancer-type: "Internal"

  43.  namespace: elasticsearch

  44.  labels:

  45.    component: elasticsearch

  46.    role: kibana

  47. spec:

  48.  selector:

  49.    component: elasticsearch

  50.    role: kibana

  51.  ports :

  52.  - name: http

  53.    port: 80

  54.    targetPort: 5601

  55.    protocol: TCP

  56.  type: LoadBalancer


ES-HQ部署:

  1. apiVersion: v1

  2. kind: Namespace

  3. metadata:

  4.  name : elasticsearch

  5. ---

  6. apiVersion: apps/v1beta1

  7. kind: Deployment

  8. metadata:

  9.  name: es-hq

  10.  namespace: elasticsearch

  11.  labels:

  12.    component: elasticsearch

  13.    role: hq

  14. spec:

  15.  replicas: 1

  16.  template:

  17.    metadata:

  18.      labels:

  19.        component: elasticsearch

  20.        role: hq

  21.    spec:

  22.      containers:

  23.      - name: es-hq

  24.        image: elastichq/elasticsearch-hq:release-v3 .4.0

  25.        env:

  26.        - name: HQ_DEFAULT_URL

  27.          value: http://elasticsearch:9200

  28.        resources:

  29.          limits:

  30.            cpu: 0.5

  31.        ports:

  32.        - containerPort: 5000

  33.          name: http

  34. ---

  35. apiVersion: v1

  36. kind: Service

  37. metadata:

  38.  name: hq

  39.  annotations:

  40.    cloud.google.com/load-balancer-type: "Internal"

  41.  namespace: elasticsearch

  42.  labels:

  43.    component: elasticsearch

  44.    role : hq

  45. spec:

  46.  selector:

  47.    component: elasticsearch

  48.    role: hq

  49.  ports:

  50.  - name: http

  51.    port: 80

  52.    targetPort: 5000

  53.    protocol: TCP

  54.  type: LoadBalancer


我们可以使用新创建的Internal LoadBalancers访问这两个服务。

  1. root$ kubectl -n elasticsearch get svc -l role=kibana

  2. NAME      TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE

  3. kibana    LoadBalancer   10.9.121.246   10.9.120.10   80:31400/TCP   1m

  4. root$ kubectl -n elasticsearch get svc -l role=hq

  5. NAME      TYPE           CLUSTER- IP     EXTERNAL-IP   PORT(S)        AGE

  6. hq        LoadBalancer   10.9.121.150   10.9.120.9    80:31499/TCP   1m


Kibana Dashboard http:///app/kibana#/home?_g=()


ElasticHQ Dasboard http:///#!/clusters/my-es


ES是最广泛使用的分布式搜索和分析系统之一,当与Kubernetes结合使用时,将消除有关扩展和HA的关键问题。 此外,使用Kubernetes部署新的ES群集需要时间。 我希望这个博客对你有用,我真的很期待改进的建议。 随意评论或联系LinkedIn[2]。

相关链接:

  1. https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/

  2. https://www.linkedin.com/in/vaibhavthakur/


原文链接:https://medium.com/devopslinks/https-medium-com-thakur-vaibhav23-ha-es-k8s-7e655c1b7b61


Kubernetes线下实战培训


Kubernetes应用实战培训将于2018年12月21日在北京开课,3天时间带你系统学习Kubernetes本次培训包括:容器特性、镜像、网络;Docker特性、架构、组件、概念、Runtime;Docker安全;Docker实践;Kubernetes架构、核心组件、基本功能;Kubernetes设计理念、架构设计、基本功能、常用对象、设计原则;Kubernetes的实践、运行时、网络、插件已经落地经验;微服务架构、DevOps等,点击下方图片查看详情。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/sQMrs7vArD
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/26756
 
595 次点击