k8s目录和文件挂载到宿主机的方式

 更新时间:2024年01月22日 10:21:25   作者:小邋遢2.0  
Docker是一种流行的容器化技术,它允许开发人员在不同的环境中构建、打包和运行应用程序,下面这篇文章主要给大家介绍了关于k8s目录和文件挂载到宿主机的相关资料,需要的朋友可以参考下

k8s生产中常用的volumes挂载方式有:hostPath、pv,pvc、nfs

1.hostPath挂载     

hostPath是将主机节点文件系统上的文件或目录挂载到Pod 中,同时pod中的目录或者文件也会实时存在宿主机上,如果pod删除,hostpath中的文件不会被删除。(生成的pod只能在同一个节点上,调度到其他节点就不会挂载)

配置文件:

[root@master1 k8s-nginx]# cat nginx-test.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-service
  name: nginx-service
  namespace: default
spec:
  ports:
    #对外暴露端口30003
  - nodePort: 30003
    port: 8010
    protocol: TCP
    targetPort: 8010
  selector:
    app: nginx-web
  #NodePort对外暴露端口
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-web
  name: nginx-web
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-web
  template:
    metadata:
      labels:
        app: nginx-web
      namespace: default
    spec:
      imagePullSecrets:
      - name: secret-key
      containers:
      - image: registry.cn-zhangjiakou.aliyuncs.com/ymku/nginx:v2
        name: nginx
        env:  
        - name: TZ  
          value: Asia/Shanghai
        imagePullPolicy: Always
        ports:
        - containerPort: 8010
        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1Gi
        volumeMounts:
        - name: nginx-volume-dir
          mountPath: /var/log/nginx
        - name: nginx-volume-file
          mountPath: /var/log/nginx/access2.log
      volumes:
      - name: nginx-volume-dir
        hostPath:
          path: /root/k8s-nginx/nginx/log
          type: DirectoryOrCreate #如果目录不存在就创建
      - name: nginx-volume-file
        hostPath:
          path: /root/k8s-nginx/nginx/log/access2.log
          type: FileOrCreate ## 如果文件不存在则创建

这个是master1节点创建的,pod是在node1节点上运行的,所以日志是存储在node1节点上

需要登录到node1节点上查看挂载的情况:

 在node1节点上查看是否目录和日志文件:

2.nfs挂载

nfs挂载是hostPath挂载的升级版,优点是在不同的node节点上的日志,文件都可以挂载到nfs的机器上,只需要配置上nfs挂载的机器ip和挂载的路径就行。

安装nfs,建立共享服务器(单独服务器安装nfs挂载,ip:10.10.10.25)
[root@localhost ~]# yum -y install nfs-utils
...
创建存储目录:
[root@localhost ~]# mkdir -p /data/nfs/{conf,dist,log}   #可以创建多个存储目录

[root@localhost ~]# vim /etc/exports
/data/nfs 10.10.10.24(rw,no_root_squash)  #可以添加多个存储目录
#将共享目录以读写权限给node1机器,因为pod是跑在node1节点上:10.10.10.24

启动nfs应用:
[root@localhost ~]# systemctl start nfs

查看进程:
[root@localhost ~]# ps -ef |grep nfs
root     104715      2  0 15:56 ?        00:00:00 [nfsd4_callbacks]
root     104721      2  0 15:56 ?        00:00:00 [nfsd]
root     104722      2  0 15:56 ?        00:00:00 [nfsd]
root     104723      2  0 15:56 ?        00:00:00 [nfsd]
root     104724      2  0 15:56 ?        00:00:00 [nfsd]
root     104725      2  0 15:56 ?        00:00:00 [nfsd]
root     104726      2  0 15:56 ?        00:00:00 [nfsd]
root     104727      2  0 15:56 ?        00:00:00 [nfsd]
root     104728      2  0 15:56 ?        00:00:00 [nfsd]
root     104750 103971  0 15:56 pts/0    00:00:00 grep --color=auto nfs


修改/etc/exports后,使文件生效:
[root@localhost ~]# exportfs -r
/data/nfs	10.10.10.24

查看挂载目录:
[root@localhost nfs]# exportfs
/data/nfs/conf	10.10.10.24
/data/nfs/log 	10.10.10.24
/data/nfs/dist	10.10.10.24
[root@localhost nfs]# exportfs -v
/data/nfs/conf	10.10.10.24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/data/nfs/log 	10.10.10.24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/data/nfs/dist	10.10.10.24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

 编写pod的yaml文件:

vim nginx-nfs.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-service
  name: nginx-service
  namespace: default
spec:
  ports:
    #对外暴露端口30003
  - nodePort: 30003
    port: 8010
    protocol: TCP
    targetPort: 8010
  selector:
    app: nginx-web
  #NodePort对外暴露端口
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-web
  name: nginx-web
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-web
  template:
    metadata:
      labels:
        app: nginx-web
      namespace: default
    spec:
      imagePullSecrets:
      - name: secret-key
      containers:
      - image: registry.cn-zhangjiakou.aliyuncs.com/ymku/nginx:v2
        name: nginx
        env:  
        - name: TZ 
          value: Asia/Shanghai
        imagePullPolicy: Always
        ports:
        - containerPort: 8010
        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1Gi
        volumeMounts:
        - name: nginx-volume-dir
          mountPath: /var/log/nginx
        #- name: nginx-volume-file
        #  mountPath: /var/log/nginx/access2.log
        #- name: nginx-config
        #  mountPath: /etc/nginx/conf.d
      volumes:
      - name: nginx-volume-dir
        nfs:
          server: 10.10.10.25
          path: /data/nfs 
      #- name: nginx-volume-file
      #    server: 10.10.10.25
      #    path: /data/nfs
      #- name: nginx-config
      #  nfs:
      #    server: 10.10.10.25
      #    path: /data/nfs

验证:到安装nfs机器上的/data/nfs/log目录查看是否有文件

问题:单独nfs挂载好像只能挂载一个目录,挂载多个目录不生效并且导致部分文件消失? 

/etc/exports 配置:

yaml配置: 

        volumeMounts:
        - name: nginx-dir
          mountPath: /etc/nginx/dist
        - name: nginx-log
          mountPath: /var/log/nginx
        - name: nginx-config
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: nginx-dir
        nfs:
          server: 10.10.10.25
          path: /data/nfs/dist
      - name: nginx-log
        nfs:
          server: 10.10.10.25
          path: /data/nfs/log
      - name: nginx-config
        nfs:
          server: 10.10.10.25
          path: /data/nfs/conf

待续...

3.pv、pvc挂载

pv,pvc挂载是基于nfs挂载的高级方式(如果不搭配nfs使用,侧配置的pv,pvc默认是pod所在node节点上),通过PV和PVC,Kubernetes可以实现存储资源的动态供给、自动扩展和缩减,以及共享和负载均衡等高级特性。PV和PVC的出现使得应用容器可以随时地挂载或卸载存储资源,而无需手动管理存储卷的创建、挂载和卸载等操作。

1.创建pv(相当于存储设备)

vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
  labels:
    pv: pv-nfs
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    server: 10.10.10.25
    path: /data/nfs
kubectl apply -f pv.yaml

2.创建pvc(相当于调度存储设备资源的)

vim nginx-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs
  selector:
    matchLabels:
      pv: pv-nfs
kubectl apply -f pvc.yaml

3.创建pod(去请求pvc的)

vim nginx-pod.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-service
  name: nginx-service
  namespace: default
spec:
  ports:
    #对外暴露端口30003
  - nodePort: 30003
    port: 8010
    protocol: TCP
    targetPort: 8010
  selector:
    app: nginx-web
  #NodePort对外暴露端口
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-web
  name: nginx-web
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-web
  template:
    metadata:
      labels:
        app: nginx-web
      namespace: default
    spec:
      imagePullSecrets:
      - name: secret-key
      containers:
      - image: registry.cn-zhangjiakou.aliyuncs.com/ymku/nginx:v2
        name: nginx
        env:  
        - name: TZ 
          value: Asia/Shanghai
        imagePullPolicy: Always
        ports:
        - containerPort: 8010
        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1Gi
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/nginx
        #- name: nginx-conf
        #  mountPath: /etc/nginx/conf.d
        #- name: nginx-dist
        #  mountPath: /etc/nginx/dist
      volumes:
      - name: nginx-log
        persistentVolumeClaim:
          claimName: pvc
      #- name: nginx-conf
      #  persistentVolumeClaim:
      #    claimName: pvc
      #- name: nginx-dist
      #  persistentVolumeClaim:
      #    claimName: pvc
		
kubectl apply -f nginx-pod.yaml

查看运行状态:

kubectl describe pod nginx-web-6665c66698-fxhzl

验证:

登录到nfs的服务器,进到挂载路径下看是否有文件

总结 

到此这篇关于k8s目录和文件挂载到宿主机的文章就介绍到这了,更多相关k8s目录文件挂载到宿主机内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 超详细的Kubernetes (k8s)常用命令整理

    超详细的Kubernetes (k8s)常用命令整理

    这篇文章主要介绍了Kubernetes (k8s)常用命令整理的相关资料,讲解了Kubernetes集群管理、节点资源查看、Pod管理、部署管理、命名空间管理、服务负载均衡、调试排错以及备份恢复等操作的命令,需要的朋友可以参考下
    2025-03-03
  • k8s应用监控探针详解

    k8s应用监控探针详解

    这篇文章主要为大家介绍了k8s应用监控探针的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    这篇文章主要介绍了k8s-部署HADOOP-3.2.2(HDFS)的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • kubernetes需要默认的serviceaccount的原因解析

    kubernetes需要默认的serviceaccount的原因解析

    这篇文章主要介绍了kubernetes为何需要默认的serviceaccount,ServiceAccount 是 Kubernetes 中的一种重要概念,它的实际使用场景包括很多,本文给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • 详解kubectl资源管理命令(陈述式)

    详解kubectl资源管理命令(陈述式)

    kubectl是官方的CTL命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径,这篇文章主要介绍了详解kubectl资源管理命令(陈述式),需要的朋友可以参考下
    2025-04-04
  • k8s如何给node添加标签(最新推荐)

    k8s如何给node添加标签(最新推荐)

    k8s集群如果由大量节点组成,可将节点打上对应的标签,然后通过标签进行筛选及查看,更好的进行资源对象的相关选择与匹配,这篇文章主要介绍了k8s如何给node添加标签,需要的朋友可以参考下
    2023-02-02
  • k8s控制deamonset中pod数量的方法

    k8s控制deamonset中pod数量的方法

    DaemonSet是Kubernetes中用于确保每个节点运行一个Pod副本的控制器,常用于运行集群守护进程,通过节点选择器、节点亲和性、容忍度和更新策略,可以精确控制Pod的数量和调度,本文介绍k8s控制deamonset中pod数量的方法,感兴趣的朋友一起看看吧
    2025-01-01
  • Kubernetes(K8S)基础知识

    Kubernetes(K8S)基础知识

    本文详细讲解了Kubernetes(K8S)的基础知识,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • ES业务数据迁移遇到的精度问题BUG

    ES业务数据迁移遇到的精度问题BUG

    这篇文章主要为大家介绍了ES业务数据迁移遇到的BUG精度问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 使用sealos快速搭建K8s集群环境的过程

    使用sealos快速搭建K8s集群环境的过程

    这篇文章主要介绍了使用sealos快速搭建K8s集群环境,主要包括sealos安装方法,虚拟机设置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09

最新评论