我正在评估Kubernetes作为我们新应用程序的平台。现在看来,这一切都非常令人兴奋!但是,我遇到了一个问题:我在GCE上托管集群,需要某种机制在两个POD(持续集成服务器和应用服务器)之间共享存储。对库伯内特斯来说,最好的方法是什么?所有的卷类型似乎都不适合我的需要,因为如果一个pod需要写入磁盘,GCE磁盘就不能共享。NFS将是完美的,但似乎需要kubernetes集群的特殊构建选项?
编辑:共享存储似乎是我在使用Kubernetes时多次遇到的问题。有多种使用情形,我只想拥有一个卷并将其连接到多个pod(具有写访问权限)。我只能假设这是一个常见的用例,不是吗?
EDIT2:例如,本页描述了如何设置一个Elasticsearch集群,但是用持久存储连接它是不可能的(如这里所述),这使得它毫无意义:(
NFS是一个内置卷插件,支持多个pod写入程序。没有特殊的构建选项可以让NFS在Kube中工作。
我在Kubernetes的Red Hat工作,主要关注存储。
首先呢。库伯内特斯没有在主机之间共享存储的集成功能。下面有几个选项。但是首先,如果您已经设置了一些卷,如何共享存储。
要在多个Pod之间共享一个卷,您需要创建一个具有访问模式的PVC ReadWrite很多
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: myvolume
resources:
requests:
storage: 1Gi
之后,您可以将其装载到多个吊舱:
apiVersion: v1
kind: Pod
metadata:
name: myapp1
spec:
containers:
...
volumeMounts:
- mountPath: /data
name: data
subPath: app1
volumes:
- name: data
persistentVolumeClaim:
claimName: 'my-pvc'
---
apiVersion: v1
kind: Pod
metadata:
name: myapp2
spec:
containers:
...
volumeMounts:
- mountPath: /data
name: data
subPath: app2
volumes:
- name: data
persistentVolumeClaim:
claimName: 'my-pvc'
当然,持久卷必须通过网络访问。否则,您需要确保所有Pod都被调度到具有该卷的节点。
有几种卷类型适用于此,并且不与任何云提供商绑定:
当然,要使用一个卷,首先需要拥有它。也就是说,如果您想要使用NFS,您需要在K8s集群中的所有节点上设置NFS。如果您想使用Ceph,则需要设置Ceph集群等等。
唯一支持库伯内特斯开箱即用的卷类型是Portworks。有关于如何在GKE中设置它的说明。
要在K8s中设置Ceph集群,有一个名为Rook的项目正在开发中。
但是,如果您只希望一个节点中的文件夹在另一个节点中可用,那么这就太过分了。在这种情况下,只需设置NFS服务器。它不会比配置其他卷类型更难,而且会消耗更少的cpu/内存/磁盘资源。
根据我对Kubernetes/micro service architecture(MSA)的经验,这个问题通常与您的设计模式更相关。MSA的基本设计模式之一是服务的适当封装,这包括每个服务拥有的数据。
与OOP的方式大致相同,您的服务应该关注与其关注领域相关的数据,并且应该允许通过接口访问其他服务的数据。该接口可以是API、直接或通过brokage服务处理的消息,或使用协议缓冲区和gRPC。通常,对数据的多服务访问是一种反模式,类似于OOP和大多数编程语言中的全局变量。
例如,如果您希望在何处写入日志,那么您应该拥有一个日志服务,每个服务都可以使用需要记录的相关数据调用该服务。直接写入共享磁盘意味着,如果您更改日志目录结构,或者决定添加额外功能(如针对某些类型的错误发送电子邮件),则需要更新每个容器。
在大多数情况下,在使用文件系统之前,您应该使用某种形式的最小接口,避免使用文件系统时暴露于Hyrum定律的意外副作用。如果服务之间没有适当的接口/契约,则会严重降低构建可维护和弹性服务的能力。
显然,有时,能够处理多个并发编写器的文件系统提供了优于“传统”MSA通信形式的解决方案。Kubernetes支持大量的卷类型,可以在这里找到。虽然此列表很长,但其中许多卷类型不支持多个写入程序(在Kubernetes中也称为ReadWriteMany
)。
可以在此表中找到那些支持ReadWrite很多
的卷类型,在编写时,这些卷类型是AzureFile、CephFS、Glusterfs、Quobyte、NFS和PortworxVolume。
还有一些运营商,比如流行的rook。io功能强大,并提供了一些强大的功能,但当您只需要一个简单的解决方案并继续前进时,这类系统的学习曲线可能会很困难。
根据我的经验,最好的初始选择是NFS。这是一个很好的学习有关ReadWriteMany
Kubernetes存储的基本思想的方法,它将服务于大多数用例,并且是最容易实现的。在您建立了多服务持久性的实用知识之后,您就可以做出更明智的决定,使用更多功能丰富的产品,这通常需要更多的工作来实现。
根据群集的运行方式和位置以及NFS服务的具体情况,设置NFS的细节有所不同,我之前写了两篇文章,介绍如何为本地群集设置NFS,以及在EKS群集上使用AWS NFS等效的EFS。这两篇文章给出了一个很好的对比,说明了如何根据您的特定情况实现不同的实现。
举个简单的例子,您首先需要一个NFS服务。如果你想做一个快速测试,或者你的SLO要求很低,下面这篇文章是在Ubuntu上设置NFS的快速入门。如果您有一个提供NFS的现有NAS,并且可以从您的群集访问它,那么这也可以工作。
拥有NFS服务后,可以创建类似以下内容的持久卷:
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-name
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
nfs:
server: 255.0.255.0 # IP address of your NFS service
path: "/desired/path/in/nfs"
这里的一个警告是,您的节点需要安装二进制文件才能使用NFS,我已经在我的on-prem集群文章中详细讨论了这一点。这也是在EKS上运行时需要使用EFS的原因,因为您的节点没有连接到NFS的能力。
一旦设置了持久卷,就可以像使用任何其他卷一样简单地使用它。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-name
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: p-name
volumeMounts:
- mountPath: /data
name: v-name
volumes:
- name: v-name
persistentVolumeClaim:
claimName: pvc-name
正在等待,服务endpoint尚未就绪。 Minikube版本:V0.20.0 环境: minikube日志还报告了以下错误:..... 名称:kubernetes-dashboard-2039414953-czptd命名空间:kube-system节点:minikube/192.168.99.102开始时间:2017年7月14日星期五09:31:58+0530标签:k8s-app=kuberne
我在Linux服务器的Kubernetes上安装了带有2或3个pod的Spring Boot应用程序。为了监控它,我也安装了普罗米修斯。目前,从应用程序到普罗米修斯的衡量标准进展顺利。 但我怀疑普罗米修斯只从一个豆荚中提取指标。对于普罗米修斯配置文件中的如下作业,普罗米修斯是否只从一个pod中获取指标?我怎样才能让普罗米修斯同时刮掉所有的豆荚呢?
我正在运行许多CronJobs来自动化我的家庭服务器上的任务。当一个作业运行并且其pod完成时,我可以使用
我运行了Kubernetes的自定义设置,并使用Prometheus刮取各种度量。除其他外,我还收集了和度量标准。 我想回答这样一个问题:“在我的部署中,有多少由和定义的CPU资源实际上被pod(及其容器)使用了(毫厘)核?” 有很多可用的量度,但没有这样的量度。也许它可以用秒的CPU使用时间来计算,但我不知道如何计算。 我一直在考虑这是不可能的--直到一个朋友告诉我,她在集群中运行Heapste
我怎样才能使用入口呢?我尝试使用NodePort和--Target etPort=1001,我在servicePort中添加了80在。 kubectl公开部署测试--Target-port=1001--type=NodePort 我得到了错误 找不到后端-404 我使用的是正确的方法还是需要遵循其他方法?
我假设没有愚蠢的问题,所以这里有一个我找不到直接答案的问题。 现在的情况 我目前有一个运行1.15的Kubernetes集群。AKS上的x,通过Terraform部署和管理。AKS最近宣布Azure将在AKS上停用Kubernetes的1.15版本,我需要将集群升级到1.16或更高版本。现在,据我所知,直接在Azure中升级集群不会对集群的内容产生任何影响,即节点、豆荚、秘密和当前在那里的所有其他