介绍

凭借容器的分布式和动态特性,静态管理和配置存储已成为Kubernetes上的难题,现在工作负载能够在几秒钟内从一个虚拟机(VM)迁移到另一个虚拟机(VM)。为了解决这个问题,Kubernetes使用Persistent Volumes(PV),代表存储配置/卷的API对象和PersistentVolumeClaims(PVC)的系统来管理卷,PersistentVolumeClaims(PVC)是由Persistent Volume满足的存储请求。此外,容器存储接口(CSI)驱动程序可以帮助自动化和管理容器化工作负载的存储处理和供应。这些驱动程序负责配置,安装,卸载,删除和快照卷。

digitalocean-csi将Kubernetes集群与DigitalOcean块存储产品集成在一起。开发人员可以使用它为Kubernetes中的容器化应用程序动态配置块存储卷。但是,应用程序有时可能需要在多个Droplet之间保留和共享数据。 DigitalOcean的默认块存储CSI解决方案无法支持将一个块存储卷同时安装到多个Droplet。这意味着这是一个ReadWriteOnce(RWO)解决方案,因为该卷仅限于一个节点。另一方面,网络文件系统(NFS)协议确实支持将相同的共享导出到许多使用者。这称为ReadWriteMany(RWX),因为许多节点可以将卷作为读写装载。因此,我们可以在群集中使用NFS服务器来提供存储,该存储可以利用DigitalOcean块存储的可靠支持和NFS共享的灵活性。

在本教程中,您将为DigitalOcean Kubernetes(DOKS)群集中的NFS卷配置动态预配置,其中导出存储在DigitalOcean Block存储卷上。然后,您将部署一个演示Nginx应用程序的多个实例,并测试每个实例之间的数据共享。

先决条件

在开始本指南之前,您需要满足以下条件:

  • 安装在本地计算机上的kubectl命令行界面。您可以在其官方文档中阅读有关安装和配置kubectl的更多信息。
  • 一个DigitalOcean Kubernetes集群,其连接配置为kubectl默认。要在DigitalOcean上创建Kubernetes集群,请参阅我们的Kubernetes快速入门。创建集群时,“如何连接到集群”步骤下会显示有关如何配置kubectl的说明。
  • 在本地计算机上安装了Helm软件包管理器,在群集上安装了Tiller。为此,请使用Helm Package Manager教程完成如何在Kubernetes群集上安装软件的步骤1和2。

注意:从Helm 3.0版开始,不再需要安装Tiller才能使Helm工作。如果您使用的是最新版本的Helm,请参阅Helm安装文档以获取说明。

Step 1 — Deploying the NFS Server with Helm

要部署NFS服务器,您将使用Helm chart。部署Helm图表是一种自动化的解决方案,它比手动创建NFS服务器部署更快,更不容易出错。

首先,通过添加存储库来确保默认图表存储库稳定对您可用:

  • helm repo add stable https://kubernetes-charts.storage.googleapis.com/

接下来,为刚刚添加的存储库提取元数据。这将确保Helm客户端已更新:

  • helm repo update

要验证对稳定回购的访问,请在图表上执行搜索:

  • helm search repo stable

这将为您提供可用图表的列表,类似于以下内容:

Output
NAME CHART VERSION APP VERSION DESCRIPTION stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools stable/aerospike 0.3.2 v4.5.0.5 A Helm chart for Aerospike in Kubernetes stable/airflow 5.2.4 1.10.4 Airflow is a platform to programmatically autho... stable/ambassador 5.3.0 0.86.1 A Helm chart for Datawire Ambassador ...

此结果表示您的Helm客户端正在运行并且是最新的。

既然已经设置了Helm,请安装nfs-server-provisioner Helm图表来设置NFS服务器。如果您想检查图表的内容,请查看GitHub上的文档。

部署Helm图表时,将为NFS服务器设置一些变量,以进一步指定应用程序的配置。您还可以研究其他配置选项,并对其进行调整以满足应用程序的需求。

要安装Helm图表,请使用以下命令:

  • helm install nfs-server stable/nfs-server-provisioner --set persistence.enabled=true,persistence.storageClass=do-block-storage,persistence.size=200Gi

此命令为NFS服务器提供以下配置选项:

  • 使用--set标志为NFS服务器添加持久卷。这样可以确保所有NFS共享数据在Pod重新启动后都保持不变。
  • 对于持久性存储,请使用do-block-storage存储类。
  • 为NFS服务器提供总计200Gi的容量,以便可以拆分为导出。

注意:persistence.size选项将确定您可以配置的所有NFS卷的总容量。在发布此版本时,仅DOKS版本1.16.2-do.3和更高版本支持卷扩展,因此如果您使用的是较早版本,则调整此卷的大小将是一项手动任务。在这种情况下,请确保根据您的未来需求设置此大小。

此命令完成后,您将获得类似于以下内容的输出:

Output
NAME: nfs-server LAST DEPLOYED: Thu Feb 13 19:30:07 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The NFS Provisioner service has now been installed. A storage class named 'nfs' has now been created and is available to provision dynamic volumes. You can use this storageclass by creating a PersistentVolumeClaim with the correct storageClassName attribute. For example: --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-dynamic-volume-claim spec: storageClassName: "nfs" accessModes: - ReadWriteOnce resources: requests: storage: 100Mi

要查看您配置的NFS服务器,请运行以下命令:

  • kubectl get pods

这将显示以下内容:

Output
NAME READY STATUS RESTARTS AGE nfs-server-nfs-server-provisioner-0 1/1 Running 0 11m

接下来,检查您创建的存储类:

  • kubectl get storageclass

这将产生类似于以下内容的输出:

Output
NAME PROVISIONER AGE do-block-storage (default) dobs.csi.digitalocean.com 90m nfs cluster.local/nfs-server-nfs-server-provisioner 3m

现在,您正在运行NFS服务器,以及可用于动态配置卷的存储类。接下来,您可以创建将使用此存储并在多个实例之间共享的部署。

第2步—使用共享的PersistentVolumeClaim部署应用程序

在此步骤中,您将在DOKS群集上创建一个示例部署,以测试您的存储设置。这将是一个名为web的Nginx Web服务器应用程序。

要部署此应用程序,请首先编写YAML文件以指定部署。使用文本编辑器打开nginx-test.yaml文件;本教程将使用nano:

  • nano nginx-test.yaml

在此文件中,添加以下行以使用名为nfs-data的PersistentVolumeClaim定义部署:

nginx-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        resources: {}
        volumeMounts:
        - mountPath: /data
          name: data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: nfs-data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-data
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs

保存文件并退出文本编辑器。

此部署配置为使用随附的PersistentVolumeClaim nfs-data并将其安装在/ data上。

在PVC定义中,您会发现storageClassName设置为nfs。这告诉集群使用您在上一步中创建的nfs storageClass的规则满足该存储需求。将处理新的PersistentVolumeClaim,然后将以Persistent Volume的形式提供NFS共享以满足要求。设置完毕后,吊舱将尝试安装该PVC。完成安装后,您将验证ReadWriteMany(RWX)功能。

使用以下命令运行部署:

  • kubectl apply -f nginx-test.yaml

这将给出以下输出:

Output
deployment.apps/web created persistentvolumeclaim/nfs-data created

接下来,检查一下Web Pod旋转起来:

  • kubectl get pods

这将输出以下内容:

Output
NAME READY STATUS RESTARTS AGE nfs-server-nfs-server-provisioner-0 1/1 Running 0 23m web-64965fc79f-b5v7w 1/1 Running 0 4m

现在示例部署已启动并正在运行,您可以使用kubectl scale命令将其扩展到三个实例:

  • kubectl scale deployment web --replicas=3

这将给出输出:

Output
deployment.extensions/web scaled

现在再次运行kubectl get命令:

  • kubectl get pods

您将找到扩展的部署实例:

Output
NAME READY STATUS RESTARTS AGE nfs-server-nfs-server-provisioner-0 1/1 Running 0 24m web-64965fc79f-q9626 1/1 Running 0 5m web-64965fc79f-qgd2w 1/1 Running 0 17s web-64965fc79f-wcjxv 1/1 Running 0 17s

现在,您已将Nginx部署的三个实例连接到相同的Persistent Volume中。在下一步中,您将确保它们可以彼此共享数据。

步骤3 —验证NFS数据共享

对于最后一步,您将验证数据是否在安装到NFS共享的所有实例之间共享。为此,您将在其中一个Pod中的/ data目录下创建一个文件,然后验证该文件是否在另一个Pod的/ data目录中。

为了验证这一点,您将使用kubectl exec命令。此命令使您可以指定容器并在该容器内执行命令。要了解有关使用kubectl检查资源的更多信息,请查看我们的kubectl备忘单。

要在您的一个Web容器中创建一个名为hello_world的文件,请使用kubectl exec传递touch命令。请注意,pod名称中Web后面的数字对您而言将有所不同,因此请确保将突出显示的Pod名称替换为您自己的一个Pod,您将其作为最后一步的kubectl get pods的输出找到。

  • kubectl exec web-64965fc79f-q9626 -- touch /data/hello_world

接下来,更改容器的名称,并使用ls命令列出其他容器的/ data目录中的文件:

  • kubectl exec web-64965fc79f-qgd2w -- ls /data

您的输出将显示您在第一个窗格中创建的文件:

Output
hello_world

这表明所有Pod都使用NFS共享数据,并且您的设置工作正常。

结论

在本教程中,您创建了一个由DigitalOcean Block Storage支持的NFS服务器。然后,NFS服务器使用该块存储来以RWX兼容协议将NFS共享调配和导出到工作负载。这样,您就可以解决DigitalOcean块存储的技术限制,并在多个Pod中共享相同的PVC数据。在遵循本教程之后,现在将设置您的DOKS集群以适应更广泛的部署用例集。

如果您想了解有关Kubernetes的更多信息,请查看我们的面向全栈开发人员的Kubernetes课程,或浏览DigitalOcean Kubernetes的产品文档。