elasticsearch - 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
问题 -
尽管 K8s 启动了 2 个 pod,但只有一个 POD 正在消耗 PV/PVC,而另一个 pod 正在等待并出现错误“pod has unbound immediate PersistentVolumeClaims (repeated 3 times)”
我们是否需要先拥有持久卷?
我们可以运行 ElasticSearch 的 3 个副本 Statefulset pod 以在 On-Prem kubernetes 中使用相同的 VolumeMounts 吗?
非常感谢任何帮助 -
解决方案
我假设您正在使用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-Prem
或Minikube
有. 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
.
您也可以查看这篇文章。
推荐阅读
- c# - MigraDoc:如何在奇数页的部分之后添加空白页?
- python - 将 csv 导入 OrderedDict 并使用回归进行预测
- c++ - 用 C++ 画一棵 ASCII 艺术圣诞树
- python - 在 python 中读取 CSV 文件时如何跳过逗号?
- amazon-s3 - S3 Boto3 python - 将所有文件 acl 更改为公共读取
- geoserver - 我们曾经通过 viewparams 字段将参数发送到我们的 WMS 地理服务器 SQLViews。但是WMTS没有这个字段
- python - python- sqlite3.OperationalError:靠近“<”:语法错误
- sql - If else 在 Where 子句 SQL 中
- authentication - 通过JMeter进行多用户登录
- python - 将 TensorFlow 对象检测与 keras cnn 分类器集成