首页 > 解决方案 > Kubernetes On-Prem Statefulset Pod - ELF 堆栈

问题描述

我正在尝试在我们的 DC 位置运行的 Kubernetes 设置上实现 ELF 堆栈。K8s 由 3 个 master 节点和 3 个 worker 节点组成。目前,我已经为 ElasticSearch 模块创建并实现了无头服务,并继续在 Statefulset 模式下在集群上运行 ElasticSearch pod。以下是 YAML 代码 -

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-cluster
  namespace: kube-logging
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elasticsearch:7.4.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.seed_hosts
            value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
          - name: cluster.initial_master_nodes
            value: "es-cluster-0,es-cluster-1,es-cluster-2"
          - name: ES_JAVA_OPTS
            value: "-Xms512m -Xmx512m"
      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"]
        securityContext:
          privileged: true
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        app: elasticsearch
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi

问题 -

非常感谢任何帮助 -

标签: elasticsearchkubernetes

解决方案


我假设您正在使用Kubeadm.

尽管 K8s 启动了 2 个 pod,但只有一个 POD 正在消耗 PV/PVC,而另一个 pod 正在等待并出现错误“pod has unbound immediate PersistentVolumeClaims (repeated 3 times)”

如果您使用StatefulSet,您需要知道它会创建 0 到 N-1 的 pod。此外,它会一一创建它,并且必须正确运行之前的 pod。所以在你的情况下:第一个 pod 绑定到 PV 并且运行正常。StatefulSet 想要创建第二个 Pod,但它无法绑定到 PV,Pod 处于Pending状态。由于此 pod 无法正常工作,因此 statefulset 不会创建另一个。

通常On-PremMinikube有. default_storageclass

使用 Minikube 它会喜欢:

$ kubectl get sc
NAME                 PROVISIONER                AGE
standard (default)   k8s.io/minikube-hostpath   21m

或 GKE

$ kubectl get sc
NAME                 PROVISIONER            AGE
standard (default)   kubernetes.io/gce-pd   25d

由于这个默认设置storageClass,你只能PersistentVolumeClaim和 Kubernetes 自动创建PersistentVolume所需的资源。

但是Kubeadm没有定义default storageclass。这意味着您需要手动创建PersistentVolume和创建。PersistentVolumeClaim

Persistent Volume docs中,尤其是在Binding章节中,您会找到以下信息:

一旦绑定,PersistentVolumeClaim 绑定是独占的,无论它们是如何绑定的。PVC 到 PV的绑定是一对一的映射。

您可以查看此 StackOverflow 线程以获取更多信息。

我们是否需要先拥有持久卷?

是的,您需要在 PV 中指定资源。这里有 PV 的例子。

我们可以运行 ElasticSearch 的 3 个副本 Statefulset pod 以在 On-Prem kubernetes 中使用相同的 VolumeMounts 吗?

是的,pod 可以共享 VolumeMounts,但是每个 pod 都需要有自己的 PVC。

此外

您可以考虑创建default存储类。

在您的 Yaml 中,您有accessModes: [ "ReadWriteOnce" ]. 它将只允许一个节点使用这个 PV。你可以在这里很好地解释这一点。

我无法sts使用elasticsearch:7.4.2图像创建它。最新版本是elasticsearch:7.5.0.

您也可以查看这篇文章。


推荐阅读