k8s创建NFS动态存储

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: k8s创建NFS动态存储

1.插件项目地址

k8s实验版本:v1.28.2

第三方插件地址:https://github.com/kubernetes-retired/external-storage

nfs插件:https://github.com/kubernetes-retired/external-storage/tree/master/nfs-client

需要注意的是,nfs最新文档已经迁移到其他地址

2. 创建存储类资源对象

wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/class.yaml
cat class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client #class名称,调用时需要
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner  #动态供给插件
parameters:
  archiveOnDelete: "false" #删除时是否存档
kubectl apply -f class.yaml 
kubectl get sc

3.创建rbac资源对象

wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/rbac.yaml

kubectl apply -f  rbac.yaml   #无需修改

4.创建NFS provisioner

wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/deployment.yaml
vim  deployment.yaml #修改NFS相关配置,如果无法使用k8s官方镜像,需要替换镜像仓库地址
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: dyrnq/nfs-subdir-external-provisioner:v4.0.2 #默认k8s镜像仓库国内无法访问,使用其他仓库地址
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner 
            - name: NFS_SERVER       
              value: 192.168.0.134  #NFS服务地址及共享目录
            - name: NFS_PATH
              value: /data/nfs
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.0.134  #同上
            path: /data/nfs
kubectl apply -f   deployment.yaml  
kubectl get pods|grep nfs #查看pod是否正常运行

5.验证手动绑定

test-claim.yaml

 

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
spec:
  storageClassName: nfs-client # #与class.yaml metadata.name保持一致
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

 

test-pod.yaml

kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: busybox:1.24
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"   #创建一个SUCCESS文件后退出
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim

检查(NFS服务所在机器)

[root@harbor ~]# ll /data/nfs/
总用量 0
drwxrwxrwx. 2 nfsnobody nfsnobody 21 1月  27 15:44 default-test-claim-pvc-c5e2c537-0173-4ab3-b7d5-c7492be7ef10
[root@harbor ~]# ll /data/nfs/default-test-claim-pvc-c5e2c537-0173-4ab3-b7d5-c7492be7ef10/  ##文件规则是按照${namespace}-${pvcName}-${pvName}创建的
总用量 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 1月  27 15:44 SUCCESS ##下面有一个 SUCCESS 的文件,证明我们上面的验证是成功

6.验证动态绑定

nginx-statefulset.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-headless
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: ikubernetes/myapp:v1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-client"   #和创建的名称保持一致
      resources:
        requests:
          storage: 1Gi

检查

[root@k8s-master sci]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-c5e2c537-0173-4ab3-b7d5-c7492be7ef10   1Mi        RWX            nfs-client     7m58s
www-web-0    Bound    pvc-2a5f9d6c-b31e-470a-a10c-29de0b02e23e   1Gi        RWO            nfs-client     16s
www-web-1    Bound    pvc-8aba3a31-e155-44fd-9d7f-3118a17422d2   1Gi        RWO            nfs-client     13s
[root@k8s-master sci]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
pvc-2a5f9d6c-b31e-470a-a10c-29de0b02e23e   1Gi        RWO            Delete           Bound    default/www-web-0    nfs-client              17s
pvc-8aba3a31-e155-44fd-9d7f-3118a17422d2   1Gi        RWO            Delete           Bound    default/www-web-1    nfs-client              14s
pvc-c5e2c537-0173-4ab3-b7d5-c7492be7ef10   1Mi        RWX            Delete           Bound    default/test-claim   nfs-client              7m59s
[root@k8s-master sci]# kubectl get pods -o wide
NAME                                      READY   STATUS      RESTARTS   AGE     IP              NODE         NOMINATED NODE   READINESS GATES
web-0                                     1/1     Running     0          2m5s    10.244.85.215   k8s-node01   <none>           <none>
web-1                                     1/1     Running     0          2m2s    10.244.58.210   k8s-node02   <none>           <none>
#NFS服务器上
[root@harbor nfs]# ll
总用量 0
drwxrwxrwx. 2 nfsnobody nfsnobody 21 1月  27 15:44 default-test-claim-pvc-c5e2c537-0173-4ab3-b7d5-c7492be7ef10
drwxrwxrwx. 2 nfsnobody nfsnobody  6 1月  27 15:51 default-www-web-0-pvc-2a5f9d6c-b31e-470a-a10c-29de0b02e23e
drwxrwxrwx. 2 nfsnobody nfsnobody  6 1月  27 15:51 default-www-web-1-pvc-8aba3a31-e155-44fd-9d7f-3118a17422d2
[root@harbor nfs]#  echo "web-00" > default-www-web-0-pvc-2a5f9d6c-b31e-470a-a10c-29de0b02e23e/index.html #分别创建不同的index文件
[root@harbor nfs]#  echo "web-01" > default-www-web-1-pvc-8aba3a31-e155-44fd-9d7f-3118a17422d2/index.html
#直接访问pod地址查看index文件
[root@k8s-master sci]# curl 10.244.85.215
web-00
[root@k8s-master sci]# curl 10.244.58.210
web-01
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
存储 Kubernetes 容器
Kubernetes 存储选项:持久化卷与存储类
【8月更文第29天】随着容器化的普及,越来越多的应用程序需要持久化数据以保持状态信息。Kubernetes 提供了一套完整的解决方案来管理和配置持久化存储,包括持久卷 (Persistent Volume, PV)、持久卷声明 (Persistent Volume Claim, PVC) 和存储类 (StorageClass)。本文将详细介绍这些概念,并通过实际示例来演示如何在 Kubernetes 中配置存储。
291 1
|
1月前
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
131 0
|
3月前
|
存储 运维 Kubernetes
k8s学习笔记之StorageClass+NFS
k8s学习笔记之StorageClass+NFS
|
3月前
|
Kubernetes 关系型数据库 MySQL
k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。
150 0
|
3月前
|
存储 Kubernetes 数据安全/隐私保护
在K8S中,如果后端nfs存储的ip发生变化如何解决?
在K8S中,如果后端nfs存储的ip发生变化如何解决?
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(三)
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(三)
186 0
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(三)
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(二)
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(二)
227 0
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(二)
|
Kubernetes Docker Perl
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(一)
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(一)
296 0
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(一)
|
安全 网络安全 数据安全/隐私保护
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(四)
KUBERNETES05_NFS坏境搭建、PV、PVC挂载目录、ConfigMap挂载文件、Secret挂载敏感信息(四)
175 0
|
23天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景