データの永続性のK8S
kubernetesストレージボリューム:
ドッキングウィンドウメカニズムようにデータボリュームの永続ストレージを提供しますので、我々は、デフォルトのデータコンテナは、コンテナの破壊の後に続くデータ損失の非永続的なケースであることを知っています。同様の、K8Sは容器と容器共有データとの間のデータの永続性の問題を解決するためのボリュームとリッチプラグインのより強力な機構を提供します。
ボリューム:
私たちはしばしば言う:コンテナとポッドは短いです。
含意は、彼らは非常に短いライフサイクルであってもよいし、頻繁に作成および破棄されていることです。ファイル・システム・データ内のコンテナに格納されて破壊された容器は、クリアされたとき。永続的なデータストレージコンテナのK8Sボリュームを使用してもよいです。
ライフサイクルの体積が容器から独立している、容器内のポッドは破壊され、再構築が、ボリュームは保持されてもよいです。
ボリュームタイプのK8Sがemptydir、ホストパス、persistentVolumeClaim、gcePersistentDisk、サポートされています awsElasticBlockStore、NFS、iSCSIの、gitRepo、秘密などを、完全なリストと詳細な文書が参照するhttp://docs.kubernetes.org.cn/429.htmlを。
この記事では主なボリュームは、次のタイプの練習します:
1、EmptyDir(一時保存):
emptyDirボリュームは、最も基本的なタイプです。その名前が示すように、emptyDirボリュームは、ホスト上の空のディレクトリです。つまり、ホストに直接内部ポッドによってマッピングされたホスト上のディレクトリやファイルを指定しないでください。(中ドッカードッカーマネージャボリュームをマウントする方法と同様に)
練習emptydirは、次の例でみましょう:
[root@master yaml]# vim emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: read-write
spec:
containers:
- name: write
image: busybox
volumeMounts: #定义数据持久化
- mountPath: /write #定义挂载目录,该目录是pod内部的目录
name: share-volume
args:
- /bin/sh
- -c
- echo "hello volumes" > /write/hello; sleep 3000;
- name: read #在该pod内定义第二个容器
image: busybox
volumeMounts:
- mountPath: /read
name: share-volume
args:
- /bin/sh
- -c
- cat /read/hello; sleep 30000;
volumes:
- name: share-volume
emptyDir: {} #定义一个数据持久化的类型empytdir
私たちは、データ、データを読み込むための1つを記述するための1、二つの容器は、ボリュームを共有し、二つの容器内のポッドのシミュレーションを実行します。
//运行该pod, 并进行查看:
[root@master yaml]# kubectl apply -f emptydir.yaml
pod/read-write created
[root@master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
read-write 2/2 Running 0 14s 10.244.2.2 node02 <none> <none>
//我们分别查看两个容器中的挂载内容:
[root@master yaml]# kubectl exec -it read-write -c read cat /read/hello
hello volumes
[root@master yaml]# kubectl exec -it read-write -c write cat /write/hello
hello volumes
パラメータについて説明:
-c:コンテナを指定するために、省略--helpによって見ることができる--container =です。
emptyDirがドッカーホスト・ファイル・システム・ディレクトリであるため、効果がドッキングウィンドウの実行-v /書き込みとドッキングウィンドウ実行-v /読み込みの実装に相当します。node02で我々
容器を検査ドッキングウィンドウを通じて詳細な設定情報を表示していたが、我々は二つの容器が同じディレクトリをマウントが見つかりました:
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume",
"Destination": "/read",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume",
"Destination": "/write",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
ここで「/var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume」dockerhostにemptydirマウントする真のパスです。
私たちは、パスを表示するために入力できるように:
[root@node02 ~]# cd /var/lib/kubelet/pods/756b4f4a-917a-414d-a7ee-523eecf05465/volumes/kubernetes.io~empty-dir/share-volume/
[root@node02 share-volume]# cat hello
hello volumes
要約emptydir:
ポッド内部と共有し、同じpersistenceディレクトリと別のコンテナ。ときポッド削除ノードは、コンテンツのボリュームが削除されますが、コンテナが破壊されている場合にのみ、ポッドはまだ、音量には影響しません。そのemptydirデータの永続性のライフサイクルと同じポッドを使用しています。一時的な記憶だけでなく、チェックポイント・タスクの長いプロセスの途中を保存する一時ディレクトリ、および複数のコンテナの共有ディレクトリなどの一般的な使用。
2、ホストパス:
- 1)容器の内部に、ホストファイルまたはディレクトリを、既存のマウント。
- 2)我々は、コア仮想化技術を使用するので、この永続的な方法で、小さなシーンの使用は、宿主から単離されるべきであるが、この方法は、ノード間の結合にポッドを増加させます。
- 3)クラスタ自体K8S永続性、データの永続性とドッカー自体のための一般的なデータは、このように使用されます。
例えばKUBE-apiserverとKUBEコントローラマネージャは、そのようなアプリケーションです。
レッツは、「kubectl編集-n KUBE-システムのポッドでKUBE-apiserverポッドの設定を参照してください KUBE-apiserverマスター」 以下はボリュームの関連部分で、コマンドを実行します。
volumeMounts:
- mountPath: /etc/ssl/certs
name: ca-certs
readOnly: true
- mountPath: /etc/pki
name: etc-pki
readOnly: true
- mountPath: /etc/kubernetes/pki
name: k8s-certs
readOnly: true
volumes:
- hostPath:
path: /etc/ssl/certs
type: DirectoryOrCreate
name: ca-certs
- hostPath:
path: /etc/pki
type: DirectoryOrCreate
name: etc-pki
- hostPath:
path: /etc/kubernetes/pki
type: DirectoryOrCreate
name: k8s-certs
この定義は、三のホストパス体積は、それぞれK8S-本命、CA-本命とetc- PKI、ホストディレクトリの/ etc / kubernetes / PKIは、/ etc / SSL /本命および/ etc / PKIです。
ポッドが破壊された場合、ホストパス対応するディレクトリも、この点、ホストパス永続emptyDirよりも強いが保持されます。しかし、ホストがクラッシュしたら、ホストパスも訪問することができません。
3、PV&PVC
- PersistentVolume(PV):統一されたディレクトリデータの永続性は、基礎となる共有ストレージの抽象化であるストレージシステムは、ユーザ・アプリケーションで使用可能な共有ストレージ・リソースを提供するクラスタ管理者の設定に空間の部分を指し「メモリ消費」メカニズムを実現しています。
- PersistentVolumeClaim(PVC):永続的なアプリケーション空間(クレーム)のためのPVは、宣言しました。必要な最小容量要件とアクセスモードを指定して、ユーザーがkubernetes APIサーバーへの持続的なボリューム文のリストを提出する、kubernetesはそれがステートメントに耐久性のある長期的なボリュームのボリュームを一致することが判明してバインドされます。
NFS PersistentVolume
NFS練習PVやPVCによります。
1)当社は、マスターノードでNFSサービスを展開しました。
[root@master ~]# yum -y install nfs-utils
[root@master ~]# mkdir /nfsdata
[root@master ~]# vim /etc/exports #编写nfs配置文件
/nfsdata 172.16.1.0/24(rw,sync,no_root_squash)
[root@master ~]# systemctl enable rpcbind
[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl enable nfs-server
[root@master ~]# systemctl start nfs-server
[root@master ~]# showmount -e #查看是否挂载成功
Export list for master:
/nfsdata 172.16.1.0/24
2)PVを作成します。
[root@master yaml]# vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfsdata #指定nfs共享目录
server: 172.16.1.30 #指定的是nfs服务器的ip地址
//通过以下命令来运行pv:
[root@master yaml]# kubectl apply -f nfs-pv.yaml
persistentvolume/nfs-pv created
字段解释: capacity:指定pv的容量大小,目前,capacity仅支持空间设定,将来应该还可以指定IOPS和throughput。 accessModes:访问模式,有以下几种模式: ReadWriteOnce: 以读写的方式挂载到单个节点,命令行中简写为RWO。 ReadOnlyMany:以只读的方式挂载到多个节点,命令行中简写为ROX。 ReadWriteMany: 以读写的方式挂载到多个节点,命令行中简写为RWX。 persistentVolumeReclaimPolicy:pv空间释放时的回收策略,有以下几种策略: Recycle:清除pv中的数据,然后自动回收。(自动回收策略是由pvc的保护机制保护的,当pv删除后,只要pvc还在数据就还在) Retain: 保持不动,由管理员手动回收。 Delete: 删除云存储资源,仅部分云储存系统支持,如果AWS,EBS,GCE PD,Azure Disk和Cinder。 注意:这里的回收策略是指在pv被删除之后,所存储的源文件是否删除。 storageClassName:pv和pvc关联的依据。
//验证pv是否可用:
[root@master yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 1Gi (容量为1GB) RWO (读写) Recycle (自动回收) Available(可用的,确保是该状态才可被使用) nfs(基于nfs来做的) 18m(时间)
3)PVCを作成します。
[root@master yaml]# vim nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteOnce #pv和pvc的访问模式必须一致
resources: #在该字段下的requests子字段中定义要申请的资源
requests:
storage: 1Gi
storageClassName: nfs
运行该pvc:
[root@master yaml]# kubectl apply -f nfs-pvc.yaml
persistentvolumeclaim/nfs-pvc created
//验证pvc是否可用:
[root@master yaml]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound nfs-pv 1Gi RWO nfs 3m53s
[root@master yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 1Gi RWO Recycle Bound default/nfs-pvc nfs 29m
PVとPVCは状態が割り当てられているこの時間は、それが結合が成功したことを意味していることを確認します。
PVのスペースを使用します。
次は、私たちは、MySQL使用しての練習PV:
1)のmysqlのポッドを作成します。
[root@master yaml]# vim mysql-pod.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env: #定义一个变量,将容器中mysqlroot密码映射到本地
- name: MYSQL_ROOT_PASSWORD
value: 123.com #密码为123.com
ports:
- containerPort: 3306
volumeMounts: #定义数据持久化
- name: mysql-pv-storage
mountPath: /var/lib/mysql #该目录为默认的mysql数据持久化目录
volumes: #该volumes字段为上面的一个解释
- name: mysql-pv-storage #注意名称要与上面的名称相同
persistentVolumeClaim: #指定pvc,注意下面声明的pvc要于之前创建的pvc名称一致
claimName: nfs-pvc
---
apiVersion: v1 #创建一个service资源对象
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 30000
selector:
app: mysql
通过以下命令来运行pod:
[root@master yaml]# kubectl apply -f mysql-pod.yaml
deployment.extensions/mysql created
service/mysql created
//查看pod是否正常运行:
[root@master yaml]# kubectl get pod -o wide mysql-68d65b9dd9-hf2bf
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-68d65b9dd9-hf2bf 1/1 Running 0 9m34s 10.244.1.3 node01 <none> <none>
2)ログmysqlデータベース、データの書き込み:
[root@master yaml]# kubectl exec -it mysql-68d65b9dd9-hf2bf -- mysql -u root -p123.com
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> create database volumes_db; #创建库
Query OK, 1 row affected (0.01 sec)
mysql> use volumes_db; #进入库中
Database changed
mysql> create table my_id( #创建表
-> id int primary key,
-> name varchar(25)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> insert into my_id values(1,'zhangsan'); #往表中写入数据
Query OK, 1 row affected (0.01 sec)
mysql> select * from my_id; #查看数据
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
+----+----------+
1 row in set (0.00 sec)
3)確認する:
(1)手動でポッドを削除し、データベース内のデータが存在し続けることを確認し
[root@master ~]# kubectl delete pod mysql-68d65b9dd9-hf2bf
pod "mysql-68d65b9dd9-hf2bf" deleted
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-68d65b9dd9-bf9v8 1/1 Running 0 26s 10.244.1.4 node01 <none> <none>
あなたはポッドを削除した後、kubernetesは新しいポッドを生成します、我々は、MySQL表示する様にログインして
、データが存在し続けるかどうかを。
[root@master ~]# kubectl exec -it mysql-68d65b9dd9-bf9v8 -- mysql -u root -p123.com
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from volumes_db.my_id;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
+----+----------+
1 row in set (0.01 sec)
私たちは、データがまだ存在しています見ることができます。
アナログポッドが新たポッドで生成されたノードを、ダウン実行されている2)、データが正常に復元されます。
ポッドを表示する上記の情報から、我々はそのポッドはnode01上で実行されている知っている、node01我々は、クラスタシャットダウンに開催します。
## [ルート@ node01〜]# systemctl電源オフ
しばらくすると、kubernetesは、クラスタ内のnode02でホストにポッドに移行します。
[root@master ~]# kubectl get nodes #得知node01节点已经宕机
NAME STATUS ROLES AGE VERSION
master Ready master 39d v1.15.0
node01 NotReady <none> 39d v1.15.0
node02 Ready <none> 39d v1.15.0
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-68d65b9dd9-bf9v8 1/1 Terminating 0 15m 10.244.1.4 node01 <none> <none>
mysql-68d65b9dd9-mvxdg 1/1 Running 0 83s 10.244.2.3 node02 <none> <none>
私たちは、ポッドはとnode02に移動されている見ることができます。
最後に、我々はデータ復旧いることを確認し、MySQLでログインします。
[root@master ~]# kubectl exec -it mysql-68d65b9dd9-mvxdg -- mysql -u root -p123.com
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from volumes_db.my_id;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
+----+----------+
1 row in set (0.09 sec)
ポッドを移行した後、mysqlのサービスの稼働時間を学習することができ、データが失われることはできません。。。
PVとPVCは、本番環境のためのより適切な管理者と一般ユーザの職務を分離し、永続的なMySQLのデータを達成します。