Kubernetes本地Statefulset Pod-ELF堆栈

时间:2019-12-13 08:27:24

标签: elasticsearch kubernetes

我正在尝试在DC位置运行的Kubernetes设置上实现ELF堆栈。 K8由3个主节点和3个工作节点组成。目前,我已经为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

问题-

  • 尽管K8s启动2个吊舱,但只有一个POD消耗PV / PVC, 另一个豆荚正在等待错误,“豆荚立即未绑定 PersistentVolumeClaims(重复3次)”

  • 我们需要首先拥有持久卷吗?

  • 我们可以运行3个ElasticSearch的副本Statefulset Pod来使用相同的 本地kubernetes中的VolumeMount?

我们非常感谢您的帮助-

1 个答案:

答案 0 :(得分:0)

我假设您正在使用Kubeadm

  

尽管K8s启动了2个Pod,但只有一个POD正在消耗PV / PVC,而另一个Pod正在等待,并显示错误“ pod具有未绑定的即时PersistentVolumeClaims(已重复3次)”

如果您使用的是StatefulSet,则需要知道它会创建从N-1到0的容器。还必须正确运行之前,它一个接一个地创建它。因此,在您的情况下:第一个容器已绑定到PV,并且运行正常。 StatefulSet想要创建第二个Pod,但不能绑定到PV,Pod处于Pending状态。由于此Pod无法正常工作,因此Statefulset无法创建另一个Pod。

通常On-PremMinikube具有default的{​​{1}}模板。

使用Minikube,它会:

storageclass

或GKE

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

由于使用默认的$ kubectl get sc NAME PROVISIONER AGE standard (default) kubernetes.io/gce-pd 25d ,您只能使用storageClass,Kubernetes会自动使用所需资源创建PersistentVolumeClaim

但是PersistentVolume尚未定义Kubeadm。这意味着您需要手动创建default storageclassPersistentVolume

Persistent Volume docs中,尤其是在PersistentVolumeClaim一章中,您将找到以下信息:

  

绑定后,无论绑定如何绑定,PersistentVolumeClaim绑定都是互斥的。 PVC与PV的绑定是一对一的映射。

您可以检查this StackOverflow thread以获得更多信息。

  

我们需要先拥有持久卷吗?

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

  

我们可以运行3个ElasticSearch的Statefulset副本Pod来在本地kubernetes中使用相同的VolumeMount吗?

是的,吊舱可以共享VolumeMount,但是每个吊舱都需要拥有自己的PVC。

另外

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

在Yaml中,您有default。它将仅一个节点使用此PV。 您可以here对此进行很好的解释。

我无法使用accessModes: [ "ReadWriteOnce" ]图像创建此sts。最新版本为elasticsearch:7.4.2

您还可以查看this文章。