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 |
|
2)nfsサービスが正常にインストールされているかどうかを確認します
1 |
|
2.2ユーザーの作成
NFSサービスのユーザーを追加し、共有ディレクトリを作成し、共有ディレクトリのアクセス許可を設定するようにユーザーを設定します。
1 2 3 |
|
2.3共有ディレクトリを構成する
nfsサーバーでクライアントの共有ディレクトリを構成します。
1 |
|
構成は、次のコマンドを実行することで有効になります。
1 |
|
2.4サービスの開始
1)rpcbindサービスを最初に開始し、次にnfsサービスを開始して、nfsサービスをrpcbindサービスに正常に登録できるようにする必要があるため:
1 |
|
2)nfsサービスを開始します。
1 |
|
3)rpcbindとnfs-serverを起動するように設定します。
1 2 |
|
2.5nfsサービスが正常に起動するかどうかを確認します
1 2 |
|
ボリュームとしての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 |
|
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 |
|