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は、ソリューションを提供します:PersistentVolumeとPersistentVolumeClaimは、以下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服务》