K8S上のASP.NETコアの深さの調査(8)データ管理

Benpianが参加した「K8S研究と実践シリーズインデックスON .NETコア」、あなたは記事のより多くのコンテナ技術関連のシリーズを参照してくださいするにはここをクリックすることができます。

ドッカーでは、永続的なデータを(いわゆるドッカーデータの永続性、実現するために、知っているデータは、コンテナの終わりで終了されていない)、ホストからのデータは、一般的に使用される手段は、コンテナをマウントするために必要があるボリュームデータボリュームK8Sでは、だけでなく、ストレージモデルのボリュームを提供し、我々は容器に永続ストア内のデータアプリケーションをサポートします。

、ボリューム

約1.1 K8Sボリューム

  

  永続的なデータコンテナを節約するために、我々は基本的に内容のテーブルであるK8Sボリュームを、使用することができ、全く異なるドッカーボリュームではありません。

  なお:容器のK8Sボリュームライフサイクルの独立は、容器内のポッドは破壊され、再構築が、ボリュームは保持されてもよいです。

  ボリュームポッドをマウントする場合は、コンテナのすべてのポッドは、ボリュームにアクセスすることができます。K8Sでは、バックエンドは、そのようなemptyDir、ホストパス、NFS、セファロストレージサービスなどだけでなく、クラウド・サービス・プロバイダーの一部として、さまざまなタイプのをサポートしています。ポッドのために、それはデータがローカルファイルシステムまたはリモートドライブに保存されます最終的には心配する必要はありません、それはストレージのすべての種類がばかりのボリュームのディレクトリですと見なします。

1.2 K8Sボリューム

  (1)emptyDir

  ボリュームの最も基本的なタイプをK8Sとして、emptyDirは、最も基本的な持続性スキームを提供していますが、このプログラムは非常に良いではありません。ポッド用emptyDirが永続的ではない、ので、ノードはポッドから除去されるとき、ボリュームのコンテンツが削除されるので、(それが容器の持続性があります)。まだポッド、ボリュームが影響を受けることはありませんしながら、しかし、コンテナが破壊されている場合のみ。

  :つまりemptyDirボリュームのライフサイクルポッドと一致この機能の観点からは、実際にこのタイプのボリュームを使用することは推奨されません。

  (2)ホストパス

  emptyDirと比較して、ホットパスは、ポッドが破壊された場合、ホストパス対応するディレクトリがまだ保持されます、その弱点のライフサイクルを克服します。しかし、ホストがクラッシュした場合、一度、ホストパスは、それが訪問することはできません。、ホストパスが既にポッドコンテナをマウントするために存在するドッカーホストファイルシステムディレクトリがあるので、それはホストに依存します。

  K8Sでは、アプリケーションの内部データK8Sまたはドッカー(バイナリおよび設定ファイル)にアクセスする必要がある人は、ホストパス、例えばKUBE-apiserver及びアプリケーションようKUBEコントローラマネージャを必要とします。次の構成は、三のホストパス定義KUBE-apiserver永続設定です:CA-本命、ETC-PKIとK8S-本命を、それぞれのディレクトリに/ etc / SSL /本命は、/ etc / PKIおよび/ etcホスト/ kubernetes / PKI。

    volumeMounts:
     - MOUNTPATH:の/ etc / sslの/ certsの
      名:CA - 本命
      読み取り専用: 
    - MOUNTPATH:の/ etc / PKIの
      名前:など - PKI 
      読み取り専用: 
    - MOUNTPATH:の/ etc / kubernetes / PKIの
      名前:K8S - 本命
      読み取り専用:
  dnsPolicy:ClusterFirst 
  enableServiceLinks:
  hostNetwork:
  のnodeName:K8S - マスターの
  優先順位:2000000000 
  のnodeName:K8S - マスター 
  優先順位:2000000000 
  priorityClassName:システム -cluster- 臨界
  restartPolicy:常に
  schedulerName:デフォルト - スケジューラ
  SecurityContextが:{} 
  terminationGracePeriodSeconds:30 
  tolerations:
   - 効果:NOEXECUTEの
    オペレータは:存在
  ボリューム:
   - ホストパス:
      パス:の/ etc / SSL / 本命は
      入力:DirectoryOrCreate 
    名: CA - 本命
   - ホストパス:
      パス:の/ etc / PKIの
      タイプ:DirectoryOrCreate 
    名前:など - PKI
  - ホストパス:
      パス:の/ etc / kubernetes / PKIの
      タイプ:DirectoryOrCreate 
    名前:K8S -certs

  (3)外部ストレージPovider

  私たちのK8SがAWS、GCE、アズールと他のパブリッククラウド上に展開されている場合は、直接クラウドボリュームとしてハードドライブを使用することができます。私はここで使用するので、友達と一緒にスキップしていないので、各クラウドサービスプロバイダの設定のための直接のリファレンスドキュメントの使用を参照することができます。

二、PersistentVolume与PersistentVolumeClaim

約2.1 PersistentVolumeとPersistentVolumeClaim

  前述したいくつかのプログラムが大規模クラスター時間、効率および安全性を向上させることがある場合は特に、管理の不備です。したがって、K8Sは、ソリューションを提供します:PersistentVolumePersistentVolumeClaimは、以下PVとPVCと呼ばれます。

  PVは、管理者によって作成され、維持された外部ストレージ・システムのストレージ容量、です。ボリューム、ポッドのPV永続的な、ライフサイクル依存しないと同じように。

  PVCは、PV(請求項)のアプリケーションであり、PVCは、通常、普通のユーザによって作成され、維持されます。あなたは、ストレージリソースポッドを割り当てる必要がある場合、ユーザーが作成することができ、PVC、サイズ、およびアクセス(例えば読み取り専用など)メソッド指定された容量のストレージリソースおよびその他の情報、K8Sを見つけるとPVの条件を満たすように提供します。

  学ぶASP.NETアイデンティティ我々はクレームなどの情報を認証場合は子供用の靴のは、言葉を請求する不慣れであってはならない、そして、キーと値のペアの一つは、請求項です。我々は価値のクレーム認証情報を見つけることができ、以下のようClaimTypesを使用しました。

  

  同様に、我々は、請求項は、我々が使用したいPVに対処するように配置されることを知っています。

  K8Sボリュームと同じように、K8S PersistentVolumeはまた、そのようなので、上のNFS、AWS EBS、セファロやなどのストレージの複数の種類をサポートしています。

2.2 NFSのPVを使用

  NFSは、システムがネットワーク上の他のシステムにローカルディレクトリとファイルを共有することができますネットワークファイルシステム(ネットワークファイルシステム)、です。彼らはローカルファイルであるかのようにNFSによって、ユーザーやアプリケーションがリモートシステム上のファイルにアクセスすることができます。

  CentOSのようNFSの設定方法については、こちらの記事を参照してください「NFSサービスをインストールCentOS7。」

  以下に示すようにNFSサーバは、ディレクトリ/ EDC / K8S / nfsdata、当社K8S-マスターノードに設定されているものとします。

  

  (1)PVを作成します

   次は、次のように設定ファイルをYAML PVを作成する必要があります。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: edc-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /edc/k8s/nfsdata/edc-pv
    server: 192.168.2.100

  其中:

  • capacity指定了PV的容量为1GB
  • accessModes指定访问模式为ReadWriteOnce,表示PV能够以Read-Write模式mount到单个节点。此外,还支持ReadOnlyMany和ReadWriteMany,分别代表PV能以Read-Only模式或者Read-Write模式mount到多个节点。这里ReadWriteOnce只mount到单个节点,即k8s-master(192.168.2.100)。
  • persistentVolumeReclaimPolicy指定了此PV的回收策略为Recycle,表示清除PV中的数据。此外,还支持Retain和Delete,Retain表示需要管理员手动回收,类似于你用C/C++还需要手动写free代码释放空间。而Delete呢,表示删除Storage Provider中的对应存储资源,如果你使用的是外部云服务提供商的存储空间的话。
  • storageClassName指定了PV的class为nfs。
  • nfs配置项指定了PV在NFS服务器上对应的目录,如果没有可以事先创建一下。

  理解了其中的配置项,我们创建该PV,可以看到其状态Status变为了Available,表示可以被PVC申请啦。

  

   (2)创建一个PVC

   与创建PV不同,创建PVC只需指定PV容量、访问模式以及class即可:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: edc-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs

  有了配置文件,就可以创建PVC了:

  

   可以看到,edc-pvc已经Bound到edc-pv了,申请PV成功。

   申请成功之后,我们就可以在Pod中使用了,下面是一个示例Pod的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: edc-pv-pod
spec:
  containers:
  - name: edc-pv-pod
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30000
    volumeMounts:
    - mountPath: "/mydata"
      name: mydata
  volumes:
    - name: mydata
      persistentVolumeClaim:
        claimName: edc-pvc

  通过kubectl创建该pod,如下所示:

  

   接下来验证一下PV是否可用:

   

   可以看到,在Pod中创建的文件/mydata/hello已经保存到了NFS服务器目录的edc-pv目录下了。

2.2 NFS PV的回收

  当我们不再需要某个PV时,也可以使用PVC来回收PV,如下所示:

kubectl delete pvc edc-pvc

  当edc-pvc被删除后,我们会发现K8S启动了一个新Pod,这个Pod就是用来清除edc-pv的数据的。数据的清理需要一个过程,完成后edc-pv的状态会重新恢复为Available,此时可以被新的PVC申请。

  

   此外,由于我们设置的回收策略为Recycle,所以Pod中的数据也被清除了:

  

   如果希望能够保留这些数据,那么我们需要将回收策略改为Retain:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: edc-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /edc/k8s/nfsdata/edc-pv
    server: 192.168.2.100

  这里就不再验证Retain的效果了。

三、MySQL持久化存储案例

3.1 准备工作

  这里我们来演示一个MySQL持久化存储的案例:

  (1)创建PV和PVC

  准备PV和PVC的yaml:

-- mysql-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /edc/k8s/nfsdata/mysql-pv
    server: k8s-master

-- mysql-pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs

  通过kubectl apply创建PV和PVC:

kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml

  

   可以看到,mysql-pvc已经申请到了mysql-pv。

  (2)部署MySQL

  准备yaml配置文件:

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  ports:
  - port: 3306
  selector:
    app: mysql

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql-container
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

  重点关注其中的volumeMounts和volumes配置,其中mysql-pvc申请Bound的mysql-pv将会被mount到MySQL的数据目录/var/lib/mysql下。

  通过kubectl创建MySQL:  

kubectl apply -f mysql-service.yaml
kubectl get pod -o wide

  

  可以看到,MySQL被部署到了k8s-node1节点上。

  (3)客户端访问MySQL

  下面我们在k8s-master上通过客户端访问MySQL Service:

kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql-service -ppassword

  如下图所示,进入了MySQL数据库:

  

  接下来我们更新一下数据库,如下图所示:

  

   新建了一张表edc_test,插入了一行数据1110.

3.2 快速验证

  (1)模拟k8s-node1故障

  接下来我们模拟一下k8s-node1宕机,这样在k8s-node1上运行的MySQL服务就会受到影响,不过根据之前的了解,K8S会帮我们将MySQL迁移到k8s-node2上从而保证服务可用。

  首先,关闭k8s-node1:

shutdown now

  

  其次,验证K8S迁移MySQL:

  

  (2)验证数据一致性

  虽然k8s-node1挂了,但是K8S帮我们迁移了MySQL到k8s-node2,而且数据也是完好无损,如下图所示:

  

  (3)验证数据持久性

  如果我们将部署的Service和Deployment删掉,那么其Pod也会停止被删除,但是由于我们的PV的回收策略是Retain,因此其数据不会被清除:

  

四、小结

  本文探索了K8S的数据管理方案Volume,其中普通类型的Volume如emptyDir和hostPath虽然使用方便,但是可持久性不强,而外部云存储Volume Provider则提供了更好的持久化存储。PV和PVC的模式,更加适合于我们使用在实际环境中,最后还通过了一个MySQL持久化案例演示了如何应用PV和PVC实现持久化。

参考资料

(1)CloudMan,《每天5分钟玩转Kubernetes

(2)李振良,《一天入门Kubernets教程

(3)马哥(马永亮),《Kubernetes快速入门

(4)~信~仰~,《CentOS7安装NFS服务

 

おすすめ

転載: www.cnblogs.com/edisonchou/p/aspnet_core_on_k8s_deepstudy_part8.html