Py学习  »  Elasticsearch

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

Docker • 5 年前 • 452 次点击  


上一篇文章中,我们通过扩展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
 
452 次点击