K8sの実用的な照合(18)-k8sストレージNFS

K8sの実用的な照合(18)-k8sストレージNFS

1NFSの概要

NFSは、Network File System、つまりネットワークファイルシステムの略です。NFSは、FreeBSDでサポートされているファイルシステムの1つです。NFSはRPC(Remote Procedure Call)実装に基づいており、システムがネットワーク上の他のユーザーとディレクトリやファイルを共有できるようにします。NFSを使用することにより、ユーザーとプログラムはローカルファイルと同じようにリモートシステム上のファイルにアクセスできます。NFSは、非常に安定したポータブルなネットワークファイルシステムです。スケーラビリティや高性能などの機能により、エンタープライズレベルのアプリケーション品質基準に達しています。ネットワーク速度の向上と遅延の減少により、NFSシステムは、ネットワークを介してファイルシステムサービスを提供するための競争力のある選択肢でした。

1.1NFSの原則

NFSは、実装にRPC(Remote Procedure Call)メカニズムを使用します。RPCを使用すると、クライアントはサーバーの関数を呼び出すことができます。同時に、VFSが存在するため、クライアントは他の通常のファイルシステムと同じようにNFSファイルシステムを使用できます。オペレーティングシステムのカーネルを介して、NFSファイルシステムの呼び出し要求がTCP / IPを介してサーバーのNFSサービスに送信されます。NFSサーバーは関連する操作を実行し、操作結果をクライアントに返します。

 

 

NFSサービスの主なプロセスは次のとおりです。

  • rpc.nfsd:最も重要なNFSプロセスであり、クライアントがログインできるかどうかを管理します

  • rpc.mountd:権限管理を含むNFSファイルシステムのマウントとアンマウント

  • rpc.lockd:不要です。ファイルロックを管理して、同時書き込みエラーを回避します

  • rpc.statd:必須ではありません。ファイルの整合性をチェックし、ファイルを修復します

NFSの主要なツールは次のとおりです。

  • メイン設定ファイル:/ etc / exports;

  • NFSファイルシステムのメンテナンスコマンド:/ usr / bin / exportfs;

  • 共有リソースのログファイル:/ var / lib / nfs / * tab;

  • クライアントクエリ共有リソースコマンド:/ usr / sbin / showmount;

  • ポート構成:/ etc / sysconfig / nfs。

1.2共有構成

NFSサーバーのメイン構成ファイルが/ etc / exportsの場合、共有ファイルディレクトリはこの構成ファイルを介して設定できます。各構成レコードは、NFS共有ディレクトリ、NFSクライアントアドレス、およびパラメータの3つの部分で構成されています。形式は次のとおりです。

[NFS共有ディレクトリ] [NFSクライアントアドレス1(パラメーター1、パラメーター2、パラメーター3 ...)] [クライアントアドレス2(パラメーター1、パラメーター2、パラメーター3 ...)]

  • NFS共有ディレクトリ:サーバー上で共有されるファイルディレクトリ。

  • NFSクライアントアドレス:アクセスが許可されているNFSサーバーのクライアントアドレス。クライアントIPアドレスまたはネットワークセグメント(192.168.64.0/24)の場合があります。

  • アクセスパラメータ:角かっこで囲まれたカンマ区切りの項目、主にいくつかの権限オプション。

1)アクセス権限パラメータ

 

2)ユーザーマッピングパラメータチャート

3)その他の構成パラメータチャート 

 

2NFSサーバー構成

nfsをネットワークファイルストレージシステムとして使用する前に、まずnfsおよびrpcbindサービスをインストールする必要があります。次に、共有ディレクトリを使用するユーザーを作成する必要があります。次に、共有ディレクトリを構成する必要があります。これは比較的重要です。複雑な手順です。最後に、アプリケーションで使用するためにrpcbindおよびnfsサービスを開始する必要があります。

2.1nfsサービスをインストールする

1)yumディレクトリからnfsサービスとrpcbindサービスをインストールします。

1

rpcinfo -p localhost

2)nfsサービスが正常にインストールされているかどうかを確認します 

1

rpcinfo -p localhost

2.2ユーザーの作成

NFSサービスのユーザーを追加し、共有ディレクトリを作成し、共有ディレクトリのアクセス許可を設定するようにユーザーを設定します。

1

2

3

useradd -u nfs

mkdir -p /nfs-share

chmod a+w /nfs-share

2.3共有ディレクトリを構成する

nfsサーバーでクライアントの共有ディレクトリを構成します。

1

echo "/nfs-share 172.16.0.0(rw,async,no_root_squash)" >> /etc/exports

構成は、次のコマンドを実行することで有効になります。

1

exportfs -r

2.4サービスの開始

1)rpcbindサービスを最初に開始し、次にnfsサービスを開始して、nfsサービスをrpcbindサービスに正常に登録できるようにする必要があるため: 

1

systemctl start rpcbind

 2)nfsサービスを開始します。 

1

systemctl start nfs-server

3)rpcbindとnfs-serverを起動するように設定します。 

1

2

systemctl enable rpcbind

systemctl enable nfs-server

2.5nfsサービスが正常に起動するかどうかを確認します

1

2

showmount -e localhost

mount -t nfs 127.0.0.1:/data /mnt

ボリュームとしての3つのNFS

nfsはストレージボリュームとして直接使用できます。以下は、redisデプロイメント用のYAML構成ファイルです。この例では、コンテナ内のredisの永続データは/ dataディレクトリに保存されます。ストレージボリュームはnfsを使用し、nfsのサービスアドレスは192.168.8.150、ストレージパスは/ k8s-nfs / redis /です。データ。コンテナーは、volumeMounts.nameの値によって使用されるストレージボリュームを決定します。

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: redis
spec:
  selector:
    matchLabels:
      app: redis
  revisionHistoryLimit: 2
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      
# 应用的镜像
      - image: redis
        name: redis
        imagePullPolicy: IfNotPresent
        
# 应用的内部端口
        ports:
        - containerPort: 6379
          name: redis6379
        env:
        - name: ALLOW_EMPTY_PASSWORD
          value: "yes"
        - name: REDIS_PASSWORD
          value: "redis"          
# 持久化挂接位置,在docker中 
        volumeMounts:
        - name: redis-persistent-storage
          mountPath: /data
      volumes:      
# 宿主机上的目录
      - name: redis-persistent-storage
        nfs:
          path: /k8s-nfs/redis/data
          server: 192.168.8.150

 

PersistentVolumとしての4つのNFS

現在のバージョンのKubernetesでは、タイプnfsの永続ストレージボリュームを作成して、PersistentVolumClaimのストレージボリュームを提供できます。以下のPersistenVolumeYAML構成ファイルでは、nfs-pvという名前の永続ストレージボリュームが定義されています。このストレージボリュームは5Gストレージスペースを提供し、1つのPersistentVolumClaimによってのみ読み取りと書き込みが可能です。この永続ストレージボリュームで使用されるNFSサーバーアドレスは192.168.5.150で、ストレージパスは/ tmpです。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
  - hard
  - nfsvers=4.1
  # 此持久化存储卷使用nfs插件
  nfs:
    # nfs共享目录为/tmp
    path: /tmp
    # nfs服务器的地址
    server: 192.168.5.150

 

上記の永続ストレージボリュームは、次のコマンドを実行することで作成できます。 

kubectl create -f {path}/nfs-pv.yaml

ストレージボリュームが正常に作成されると、使用可能な状態になり、PersistentVolumClaimがそれを使用するのを待ちます。PersistentVolumClaimは、アクセスモードとストレージスペースに基づいて適切なストレージボリュームを自動的に選択し、それをバインドします。

5NFSは動的ストレージとして提供されます

5.1 fsnfsコミッション

nfs-provisionerインスタンスの状態とデータを保存するストレージボリュームを選択し、ストレージボリュームをコンテナの/ exportコマンドにアタッチします。

...
 volumeMounts:
    - name: export-volume
      mountPath: /export
volumes:
  - name: export-volume
    hostPath:
      path: /tmp/nfs-provisioner
...

StorageClassのプロバイダー名を選択し、deploy / kubernetes /deployment.yamlに設定します。

args:
  - "-provisioner=example.com/nfs"
...

完全なdeployment.yamlファイルの内容は次のとおりです。

kind: Service
apiVersion: v1
metadata:
  name: nfs-provisioner
  labels:
    app: nfs-provisioner
spec:
  ports:
    - name: nfs
      port: 2049
    - name: mountd
      port: 20048
    - name: rpcbind
      port: 111
    - name: rpcbind-udp
      port: 111
      protocol: UDP
  selector:
    app: nfs-provisioner
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nfs-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      containers:
        - name: nfs-provisioner
          image: quay.io/kubernetes_incubator/nfs-provisioner:v1.0.8
          ports:
            - name: nfs
              containerPort: 2049
            - name: mountd
              containerPort: 20048
            - name: rpcbind
              containerPort: 111
            - name: rpcbind-udp
              containerPort: 111
              protocol: UDP
          securityContext:
            capabilities:
              add:
                - DAC_READ_SEARCH
                - SYS_RESOURCE
          args:
            # 定义提供者的名称,存储类通过此名称指定提供者
            - "-provisioner=nfs-provisioner"
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: SERVICE_NAME
              value: nfs-provisioner
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          imagePullPolicy: "IfNotPresent"
          volumeMounts:
            - name: export-volume
              mountPath: /export
      volumes:
        - name: export-volume
          hostPath:
            path: /srv

 

deploy / kubernetes / deployment.yamlファイルを設定した後、kubectlcreateコマンドを使用してKubernetesクラスターにnfs-provisionerをデプロイします。 

kubectl create -f {path}/deployment.yaml

 

5.2StorageClassを作成する

次に、example-nfsのStorageClass構​​成ファイルを示します。この構成ファイルは、nfs-storageclassという名前のストレージクラスを定義します。このストレージクラスのプロバイダーはnfs-provisionerです。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storageclass
  provisioner: nfs-provisioner

上記の構成ファイルを使用して、kubectl create-fコマンドで作成します。

# kubectl create -f deploy/kubernetes/class.yaml
storageclass “example-nfs” created

ストレージクラスが正しく作成されたら、PersistenetVolumeClaimを作成してStorageClassを要求できます。StorageClassは、PersistenetVolumeClaimで使用可能なPersistentVolumeを自動的に作成します。

 

5.3PersistenetVolumeClaimを作成する

PersistenetVolumeClaimは、PersistenetVolumeに対するステートメントです。つまり、PersistenetVolumeはストレージプロバイダーであり、PersistenetVolumeClaimはストレージコンシューマーです。以下は、PersistentVolumeClaimのYAML構成ファイルです。この構成ファイルは、metadata.annotations []。volume.beta.kubernetes.io/storage-classフィールドで使用されるストレージクラスを指定します。

この構成ファイルで、nfs-storageclassストレージクラスを使用して、PersistenetVolumeClaimのPersistenetVolumeを作成します。必要なPersistenetVolumeストレージスペースは1Miであり、複数のコンテナーで読み取りおよび書き込みが可能です。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs-storageclass"
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

 

kubectl createコマンドを使用して、前述の永続ストレージボリューム宣言を作成します。 

1

kubectl create -f {path}/claim.yaml

   

5.4PersistenVolumeClaimを使用してデプロイメントを作成します

ここでbusybox-deploymentという名前のデプロイメントYAML構成ファイルを定義します。使用されるイメージはbusyboxです。ビジーボックスイメージに基づくコンテナは、/ mntディレクトリにデータを永続化する必要があります。コンテナのデータを永続化するには、YAMLファイルでnfsという名前のPersistenVolumeClaimを指定します。

# This mounts the nfs volume claim into /mnt and continuously
# overwrites /mnt/index.html with the time and hostname of the pod.
apiVersion: v1
kind: Deployment
metadata:  
  name: busybox-deployment
spec:  
  replicas: 2  
  selector:    
    name: busybox-deployment
  template:    
    metadata:      
      labels:        
        name: busybox-deployment    
    spec:      
      containers:      
      - image: busybox        
        command:          
        - sh          
        - -c          
        - 'while true; do date > /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); done'        
        imagePullPolicy: IfNotPresent        
        name: busybox        
        volumeMounts:          
        # name must match the volume name below          
        - name: nfs            
          mountPath: "/mnt"    
      #
      volumes:      
      - name: nfs        
        persistentVolumeClaim:          
         claimName: nfs-pvc 

 

kubectl createを使用してビジーデプロイメントデプロイメントを作成します:

1

kubectl create -f {path}/nfs-busybox-deployment.yaml

おすすめ

転載: blog.csdn.net/yucaifu1989/article/details/107712042