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

elasticsearch 6.3.0在Kubernetes故障下的准备性和活性探测

东方俊杰
2023-03-14

我正试图在Kubernetes上设置EFK堆栈。正在使用的Elasticsearch版本是6.3.2。在我将探针配置放入部署YAML文件之前,一切都很好。我得到以下错误。这将导致pod被声明为不健康,并最终重新启动,这似乎是一个错误的重新启动。

警告不健康15s kubelet,aks-agentpool-23337112-0活性探测失败:获取http://10.xxx.y.zzz:9200/_cluster/health:拨号tcp 10.xxx.y.zzz:9200:connect:连接拒绝

我尝试使用telnet从另一个容器到具有IP和端口的elasticsearch吊舱,并且成功了,但是只有节点上的kubelet无法解析吊舱的IP,导致探测失败。

      - name: es-data
        image: quay.io/pires/docker-elasticsearch-kubernetes:6.3.2
        env:
        - name: NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: CLUSTER_NAME
          value: myesdb
        - name: NODE_MASTER
          value: "false"
        - name: NODE_INGEST
          value: "false"
        - name: HTTP_ENABLE
          value: "true"
        - name: NODE_DATA
          value: "true"
        - name: DISCOVERY_SERVICE
          value: "elasticsearch-discovery"
        - name: NETWORK_HOST
          value: "_eth0:ipv4_"          
        - name: ES_JAVA_OPTS
          value: -Xms512m -Xmx512m
        - name: PROCESSORS
          valueFrom:
            resourceFieldRef:
              resource: limits.cpu
        resources:
          requests:
            cpu: 0.25
          limits:
            cpu: 1
        ports:
        - containerPort: 9200
          name: http
        - containerPort: 9300
          name: transport
        livenessProbe:
          httpGet:
            port: http
            path: /_cluster/health
          initialDelaySeconds: 40
          periodSeconds: 10
       readinessProbe:
         httpGet:
           path: /_cluster/health
           port: http
         initialDelaySeconds: 30
         timeoutSeconds: 10 

吊舱/容器在没有探测器的情况下运行得很好。期望探测在部署YAML上设置时能够正常工作,并且POD不会重新启动。

共有1个答案

范浩宕
2023-03-14

首先,请使用

kubectl logs <pod name> -n <namespacename>

您必须首先运行init容器并更改卷权限。

您必须以用户:1000的身份运行整个配置,而且在elasticsearch的容器启动之前,还必须使用init容器更改卷权限。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app : elasticsearch
    component: elasticsearch
    release: elasticsearch
  name: elasticsearch
spec:
  podManagementPolicy: Parallel
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app : elasticsearch
      component: elasticsearch
      release: elasticsearch
  serviceName: elasticsearch
  template:
    metadata:
      creationTimestamp: null
      labels:
        app : elasticsearch
        component: elasticsearch
        release: elasticsearch
    spec:
      containers:
      - env:
        - name: cluster.name
          value: <SET THIS>
        - name: discovery.type
          value: single-node
        - name: ES_JAVA_OPTS
          value: -Xms512m -Xmx512m
        - name: bootstrap.memory_lock
          value: "false"
        image: elasticsearch:6.5.0
        imagePullPolicy: IfNotPresent
        name: elasticsearch
        ports:
        - containerPort: 9200
          name: http
          protocol: TCP
        - containerPort: 9300
          name: transport
          protocol: TCP
        resources:
          limits:
            cpu: 250m
            memory: 1Gi
          requests:
            cpu: 150m
            memory: 512Mi
        securityContext:
          privileged: true
          runAsUser: 1000
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/elasticsearch/data
          name: elasticsearch-data
      dnsPolicy: ClusterFirst
      initContainers:
      - command:
        - sh
        - -c
        - chown -R 1000:1000 /usr/share/elasticsearch/data
        - sysctl -w vm.max_map_count=262144
        - chmod 777 /usr/share/elasticsearch/data
        - chomod 777 /usr/share/elasticsearch/data/node
        - chmod g+rwx /usr/share/elasticsearch/data
        - chgrp 1000 /usr/share/elasticsearch/data
        image: busybox:1.29.2
        imagePullPolicy: IfNotPresent
        name: set-dir-owner
        resources: {}
        securityContext:
          privileged: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/elasticsearch/data
          name: elasticsearch-data
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 10
  updateStrategy:
    type: OnDelete
  volumeClaimTemplates:
  - metadata:
      creationTimestamp: null
      name: elasticsearch-data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
 类似资料:
  • 如何为我的spring boot应用程序编写kubernetes Readision probe(启动大约需要20秒)?我试着从配置活跃度、就绪和启动探测中学习,但我不知道Kubernetes是如何将状态代码200计算为成功的

  • 有没有一种方法可以让fluentd船LivenessProbes输出像它对普通容器在吊舱中的输出一样?

  • 为了简单起见,我认为在kubernetes中最好只检查TCP端口的活跃度和就绪度,因为它不需要了解健康检查endpoint(HTTP路径),而只需要端口号。任何关于仅仅依赖TCP端口进行服务健康检查的缺点的指南都非常赞赏,请假设POD不是其他服务的代理,并且所有业务逻辑都在POD本身中。 https://kubernetes.io/docs/tasks/configure-pod-containe

  • 我正在使用Spring开发一个服务,并将其部署在OpenShift上。目前,我正在使用Spring Actuctor health endpoint作为Kubernetes的活跃度和就绪度探测器。 但是,我将在执行器健康endpoint中添加一个对另一个服务的调用,在这种情况下,我认为我需要为我的服务实现新的活跃度探测。如果我不这样做,那么第二个服务的失败将导致活跃度探测失败,Kubernetes

  • 我在一个kubernetes集群中使用了6个单独的微服务,并且还配置了活跃度和就绪度探测。我使用了一个入口负载均衡器来调用微服务endpoint。 示例: 有没有办法通过入口获得健康endpoint来检查kubernetes集群的健康状况。 我需要配置Akamai负载均衡器。为此,我需要公开健康endpoint。健康endpoint需要确保所有POD都工作或不工作

  • 我遇到了一个问题: 获取健康检查以成功。尝试使用容器本机负载平衡(CNLB)时,在IIS容器中运行的Net app。 我有一个网络endpoint组(NEG),由GKE中的入口资源定义和VPC本机集群创建。 当我通过公开NodePort或制作LoadBalancer类型的服务来规避CNLB时,站点会毫无问题地解决。 所有的吊舱条件从一个描述看起来不错:吊舱准备就绪 运行时会显示网络endpoint