我正在尝试在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?
我们非常感谢您的帮助-
答案 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-Prem
或Minikube
具有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 storageclass
和PersistentVolume
。
在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文章。