近一段时间在做容器化的项目,公司需要把nginx也放到kubernetes集群内,nginx有静态资源,如果在每个node节点都同步一份感觉太费劲,所以使用nfs挂载到pod内部使用。pod使用nfs存储有两种方法,介绍如下:

一、在pod直接挂载nfs存储

特别注意: 使用此种方法在pod里挂载nfs,务必要在pod所调度的节点上安装nfs-utils,否则无法挂载!!!
  • 最近的几个Kubernetes大版本已经原生支持在pod内部直接挂载nfs存储,只需把volumes的类型改成nfs就行,示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    kind: Pod
    apiVersion: v1
    metadata:
    name: nfs-in-a-pod
    spec:
    # hostNetwork: true
    containers:
    - name: app
    image: alpine
    volumeMounts:
    - name: nfs-volume
    mountPath: /var/nfs
    command: ["/bin/sh"]
    args: ["-c", "sleep 5000000000"]
    volumes:
    - name: nfs-volume
    nfs:
    server: 192.168.7.107
    path: /tmp/nfs_test

二、使用pvc挂载nfs存储

  • 创建pv:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: my-nfs-share
    spec:
    capacity:
    storage: 5Gi
    accessModes:
    - ReadWriteOnce
    persistentVolumeReclaimPolicy: Retain # 特别注意pv的回收策略,此处若需要pv删除后,nfs文件存在,则需要配置回收策略为:Retain
    nfs:
    server: 192.168.7.107
    path: /tmp/nfs_test
  • 创建pvc:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: myapp-nfs
    namespace: default
    spec:
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 5Gi
  • 创建pod:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    kind: Pod
    apiVersion: v1
    metadata:
    name: nfs-in-a-pod
    spec:
    # hostNetwork: true
    containers:
    - name: app
    image: alpine
    volumeMounts:
    - name: nfs-volume
    mountPath: /var/nfs
    command: ["/bin/sh"]
    args: ["-c", "sleep 5000000000"]
    volumes:
    - name: nfs-volume
    persistentVolumeClaim:
    claimName: myapp-nfs

参考: