首页 > 其他分享 >K8s系列---【安装nfs文件系统(为k8s提供动态创建pv的能力)】

K8s系列---【安装nfs文件系统(为k8s提供动态创建pv的能力)】

时间:2022-11-10 00:02:52浏览次数:46  
标签:name 动态创建 --- client nfs provisioner master k8s

安装nfs文件系统(为k8s提供动态创建pv的能力)

1.1 安装nfs-server

# 在每个机器执行下面这条命令(包含master)。
yum install -y nfs-utils

下面的/nfs/data目录可以自定义,这个是用来供node节点往master节点同步pv数据用的目录

# 在master 执行以下命令,直接粘贴执行,或者粘贴到shell脚本中执行
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports


# 在master执行以下命令,启动 nfs 服务;创建共享目录
mkdir -p /nfs/data


# 在master执行
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server

# 使配置生效
exportfs -r


#检查配置是否生效
exportfs

验证:执行完命令之后,出现/nfs/data <world>,则说明执行成功。

1.2 配置nfs-client(选做)

主要用来把node节点的/nfs/data的数据同步到master节点,下面命令直接复制所有并在所有node节点执行。

  #在所有node节点执行,下面的ip改成你自己的master的ip
  showmount -e 192.168.26.180
  
  mkdir -p /nfs/data
  
  #在所有node节点执行,下面的ip改成你自己的master的ip
  mount -t nfs 192.168.26.180:/nfs/data /nfs/data

1.3 配置动态创建pv默认存储

把下面的两处ip更换成自己的nfs的server服务的ip,这里我已把master作为nfs的server服务,所以更换成master的ip即可。

在nfs服务器上创建sc.yml文件:vi sc.yaml

把下面的代码粘贴到sc.yaml文件中

在master执行kubectl get sckubectl get storageclass,此时查看都是没有的,No resource found。

在master执行:kubectl apply -f sc.yaml

    ## 创建了一个存储类
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
    parameters:
      archiveOnDelete: "true"  ## 删除pv的时候,pv的内容是否要备份
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-client-provisioner
      labels:
        app: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    spec:
      replicas: 1
      strategy:
        type: Recreate
      selector:
        matchLabels:
          app: nfs-client-provisioner
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
          serviceAccountName: nfs-client-provisioner
          containers:
            - name: nfs-client-provisioner
              image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
              # resources:
              #    limits:
              #      cpu: 10m
              #    requests:
              #      cpu: 10m
              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.26.180 ## 指定自己nfs服务器地址,这里我把master设置成server服务器了
                - name: NFS_PATH  
                  value: /nfs/data  ## nfs服务器共享的目录
          volumes:
            - name: nfs-client-root
              nfs:
                server: 192.168.26.180 ## 指定自己nfs服务器地址,这里我把master设置成server服务器了
                path: /nfs/data
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["nodes"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["create", "update", "patch"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: default
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    ---
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: default
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io

1.4 验证

执行kubectl get sc,此时可以看到一个默认的存储类,nfs-storage (default),说明执行成功,下面的可以用测试,直接省略即可。

测试动态创建pv的能力(选做):

  • 执行:kubectl get pod -A ,查看nfs-client-provisioner-322342c323是否Running。
  • pvc的创建与绑定
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name:nginx-pvc
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 200Mi
        # 使用kubectl get sc 查看默认存储类的name,一般为nfs-storage,也可以不指定,自动会挂载到默认存储类上
        sotrageClassName: nfs-storage

创建pvc.yaml,并把上面的命令粘贴到pvc.yaml文件中

      vi pvc.yaml
      
      kubectl apply -f pvc.yaml
      
      #pvc处于绑定状态
      kubectl get pvc
      
      #这时会发现,已经自动创建了pv 
      kubectl get pv

标签:name,动态创建,---,client,nfs,provisioner,master,k8s
From: https://www.cnblogs.com/hujunwei/p/16875627.html

相关文章

  • [JavaScript-05]函数和箭头函数
    1.函数functionaddNums(num1=1,num2=2){console.log('num1+num2:',num1+num2);returnnum1+num2;}addNums();addNums(5,6);console.log('addNums(......
  • POJ-1417(带权并查集+01背包+回溯)
    TrueLiars题目描述:Peter有一个王国。在这个王国里,一共有2种人,即诚实人和撒谎人。诚实人永远说真话,撒谎人永远说假话。可惜的是,Peter只记得诚实人的数量和撒谎人的数量......
  • Python10-实战
    实战01(根据当前时间创建文件)importtimedefcreate():globalnamelocalTime=time.strftime("%Y%m%d%H%M%S",time.localtime())name=localTime+'.txt'......
  • Python10-eg
    实例01(创建并打开记录蚂蚁庄园的文件)1print("\n","="*10,"蚂蚁庄园动态","="*10)2file=open('message.tex','w')3print("\n即将显示...........\n")实例02(向......
  • uni-app中使用moment
    npminstallmoment--save在main.js中引入并挂载importmomentfrom'moment';Vue.prototype.$moment=moment;使用:YYYY-MM-DD转成时间戳this.$moment(YYYY-MM......
  • JAVA-this关键字
    packagecom.itheima;/*学生类*/publicclassstudent02{//成员变量privateStringname;privateintage;publicvoidsetAge(intage){......
  • [Element UI 2.x] el-upload组件的部分事件属性传参在.jsx文件中失效的问题
    在之前的开发工作经历中,基本会首选Antd、ant-design-vue、Vant做为前端工程的UI库。今天在处理一个现有项目时,其UI库使用的是ElementUI(2.15.10)。在以JSX形式编写一个具......
  • [JavaScript-03]IF 三元表达式 逻辑运算 == ===
    1.语句//if语句letx=10;if(x==10){console.log('xis10')};//ifelseifelsex=20;if(x===10){console.log('xis10');}elsei......
  • [JavaScript-04]Switch
    1.Switch//Switch语句constcolor='green';switch(color){case'red':console.log('colorisred');break;case'blue':......
  • JAVA-private关键字
    packagecom.itheima;/*学生类*/publicclassstudent01{//成员变量privateStringname;//给name设置privateprivateintage;publicvoid......