k 8 s実践10:pod応用データ記憶デカップリングpv&&pvc


1.PV&&PVCの基本概念PersistentVolume(PV)は外部ストレージシステムのストレージ空間であり、管理者が作成し、メンテナンスする.PVは独立性を有し、ライフサイクルはPodから独立している.PersistentVolumeClaim(PVC)はPVの申請です.PVCは一般的に一般的なユーザーが作成し、メンテナンスする.
Podにリソースを割り当てる必要がある場合、ユーザーはPVCを作成し、ストレージリソースの容量の大きさとアクセスモードを指定し、kubernetesは条件を満たすPVを検索して提供する.
2.nfs配備
実験環境、nfsの配置は簡単で速い.実際の環境では、セキュリティの高い分散型ストレージ、cephなどを使用することをお勧めします.
nfsサービスに必要なソフトウェアnfs-utils nfsメインプログラム(rpc.nfsd,rbc.mountd)rpcbind rpcメインプログラム
いくつかの基礎的な情況は説明します:今全体のクラスタ環境の4つのノード、k 8 s-master 1 Ready 32 d v 1.12.3k8s-master2   Ready         32d       v1.12.3k8s-master3   Ready         32d       v1.12.3k8s-node1     Ready         32d       v1.12.3のうちk 8 s-node 1の空き容量が最も大きいため、ここではk 8 s-node 1を用いてnfsディレクトリとデータを記憶する.
k 8 s-node 1にnfsを配備
パッケージのインストール
[root@k8s-node1 ~]# yum install -y nfs-utils rpcbind

サービス設定を起動して起動し、現在のステータスを表示
[root@k8s-node1 ~]# systemctl start rpcbind  &&systemctl enable rpcbind
[root@k8s-node1 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-04-01 13:46:48 CST; 3min 24s ago
Main PID: 36888 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─36888 /sbin/rpcbind -w

Apr 01 13:46:48 k8s-node1 systemd[1]: Starting RPC bind service...
Apr 01 13:46:48 k8s-node1 systemd[1]: Started RPC bind service.
[root@k8s-node1 ~]# systemctl start nfs && systemctl enable nfs
[root@k8s-node1 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Mon 2019-04-01 13:53:05 CST; 2s ago
  Process: 38033 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 38016 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 38015 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 38016 (code=exited, status=0/SUCCESS)
   Memory: 0B
   CGroup: /system.slice/nfs-server.service

Apr 01 13:53:05 k8s-node1 systemd[1]: Starting NFS server and services...
Apr 01 13:53:05 k8s-node1 systemd[1]: Started NFS server and services.
[root@k8s-node1 ~]#
[root@k8s-node1 ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  53501  nlockmgr
    100021    3   udp  53501  nlockmgr
    100021    4   udp  53501  nlockmgr
    100021    1   tcp  35799  nlockmgr
    100021    3   tcp  35799  nlockmgr
    100021    4   tcp  35799  nlockmgr
[root@k8s-node1 ~]#

構成nfsサービス側/etc/exportsはデフォルトのnfsプログラムプロファイルであり、デフォルトでは空の構成が追加されます.
[root@k8s-node1 ~]# cat /etc/exports
[root@k8s-node1 ~]# echo "/mnt/data 192.168.32.0/24(rw,no_root_squash,no_all_squash,sync)" >/etc/exports
[root@k8s-node1 ~]#

rpcbindとnfsサービスを再起動し、nfsローカルマウント状況を取得
[root@k8s-node1 ~]# showmount -e localhost
Export list for localhost:
/mnt/data 192.168.32.0/24

注意:192.168.32.0/24(rw,no_root_squash,no_all_squash,sync)の間にスペースがあることはできません.
注意:nfsが正常にマウントされるように、すべてのnodeにrpcbindをインストールして起動する必要があります.エラー:mount failed:exit status 32
nfsクライアント構成クライアントもnfs-utilsとrpcbindをインストールとともにrpcbindを起動する必要がある.
[root@k8s-master1 ~]#  yum install -y nfs-utils rpcbind
[root@k8s-master1 ~]# showmount -e k8s-node1
Export list for k8s-node1:
/mnt/data 192.168.32.0/24
[root@k8s-master1 ~]#

3.pv基礎知識
pvの作成
[root@k8s-master1 pv]# cat nfs-pv1.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv1
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /mnt/data/pv1
    server: 192.168.32.131
[root@k8s-master1 pv]#

Capacity PVの容量指定
アクセスモードを指定します.サポートされるモードは、ReadWriteOnceがread-writeモードmountから単一ノードReadOnlyManyまでread-onlyモードmountから複数ノードReadWriteManyまでread-writeモードmountから複数ノードへ
ノードはpodです.複数のpodがReadWriteManyを使用する必要がある場合は
persistentVolumeReclaimPolicy指定pvの回収ポリシーRetainは管理者が回収を終了する必要があり、安全性が最も高いRecycleはPV中のデータを消去し、rm-rf Deleteを実行してstorage provider上の対応するストレージリソースを削除することに相当する.
storageClassNameはPVの分類を指定し、PVCはclassを指定して相応のPVを申請することができる.
path:/data/k 8 s/pv 1 nfs上の対応するディレクトリを指定し、手動で作成する必要があります
[root@k8s-master1 pv]# kubectl apply -f nfs-pv1.yml
persistentvolume "mypv1" created
[root@k8s-master1 pv]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mypv1     100Mi      RWX            Retain           Available             nfs                      35s

PVは状態のあるリソースオブジェクトで、以下のいくつかの状態がある:Available:空き状態Bound:あるpvcにバインドされたReleased:対応するpvcは削除されたが、リソースはまだ回収されていないFailed:pv自動回収に失敗した
4.pvc基礎知識
pvcの作成
[root@k8s-master1 pv]# cat nfs-pvc1.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
   name: mypvc1
spec:
   accessModes:
     - ReadWriteMany
   resources:
     requests:
       storage: 50Mi
   storageClassName: nfs
[root@k8s-master1 pv]# kubectl get pvc,pv
NAME                           STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/mypvc1   Bound     mypv1     100Mi      RWX            nfs            3m

NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM            STORAGECLASS   REASON    AGE
persistentvolume/mypv1   100Mi      RWX            Retain           Bound     default/mypvc1   nfs                      16m
[root@k8s-master1 pv]#

注意:pvc使用後、pvの状態はBoundになりました
5.pvとpvcはどのように対応していますか?
上記テストのpvとpvcはstorageClassName:nfsパラメータを指定することによって対応する.
このパラメータを指定しないとどうなりますか?公式の説明によると、ユーザーはPVCを作成し、ストレージリソースの容量の大きさとアクセスモードを指定し、kubernetesは条件を満たすPVを検索し、提供する.すなわち、pvcは自分のニーズに応じて適切なpvを申請する.
テストは以下の通りです:pv
[root@k8s-master1 pv]# cat nfs-pv1.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv1
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName:
  nfs:
    path: /mnt/data/pv1
    server: 192.168.32.131
[root@k8s-master1 pv]# cat nfs-pv2.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv2
spec:
  capacity:
    storage: 10Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName:
  nfs:
    path: /mnt/data/pv1
    server: 192.168.32.131
[root@k8s-master1 pv]#

pvc
[root@k8s-master1 pv]# cat nfs-pvc1.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
   name: mypvc1
spec:
   accessModes:
     - ReadWriteMany
   resources:
     requests:
       storage: 10Mi
   storageClassName:
[root@k8s-master1 pv]# cat nfs-pvc2.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
   name: mypvc2
spec:
   accessModes:
     - ReadWriteMany
   resources:
     requests:
       storage: 50Mi
   storageClassName:
[root@k8s-master1 pv]#

コマンドを実行して、対応状況を表示します.
[root@k8s-master1 pv]# kubectl apply -f nfs-pv2.yml
persistentvolume "mypv2" created                                 7s
[root@k8s-master1 pv]# kubectl apply -f nfs-pv1.yml
persistentvolume "mypv1" created
[root@k8s-master1 pv]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mypv1     100Mi      RWX            Retain           Available                                      2s
mypv2     10Mi       RWX            Retain           Available                                      16s
[root@k8s-master1 pv]# kubectl apply -f nfs-pvc2.yml
persistentvolumeclaim "mypvc2" created
[root@k8s-master1 pv]# kubectl apply -f nfs-pvc1.yml
persistentvolumeclaim "mypvc1" created
[root@k8s-master1 pv]# kubectl get pv,pvc
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM            STORAGECLASS   REASON    AGE
persistentvolume/mypv1   100Mi      RWX            Retain           Bound     default/mypvc2                            24s
persistentvolume/mypv2   10Mi       RWX            Retain           Bound     default/mypvc1                            38s

NAME                           STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/mypvc1   Bound     mypv2     10Mi       RWX                           5s
persistentvolumeclaim/mypvc2   Bound     mypv1     100Mi      RWX                           8s

マッチングパラメータを指定する場合、pvcはマッチングpvの使用を自動的に申請することがわかる.注意:pvがstorageClassName:パラメータを指定する場合、pvcは対応するstorageClassName:パラメータを指定しないため、pvcは一致するpvの使用を自動的に申請できません.コマンドを実行すると、pvcはpending状態になります.以下を参照してください.
[root@k8s-master1 pv]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mypv1     100Mi      RWX            Retain           Available             my1                      2m
mypv2     10Mi       RWX            Retain           Available             my2                      2m
[root@k8s-master1 pv]# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc1    Pending                                                      2m
mypvc2    Pending                                                      2m
[root@k8s-master1 pv]#

6.mysql pvとpvcを使用
pvのストレージディレクトリを手動で作成する
[root@k8s-node1 ~]# mkdir -p /mnt/data/mysqlpv1
[root@k8s-node1 ~]# ll /mnt/data/
total 0
drwxr-xr-x 2 root       root         6 Apr  8 17:26 mysqlpv1
drwxr-xr-x 2 root       root         6 Apr  8 10:55 pv1

pv
[root@k8s-master1 pv]# cat mysql-pv1.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv1
spec:
  capacity:
    storage: 300Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName:
  nfs:
    path: /mnt/data/mysqlpv1
    server: 192.168.32.131

[root@k8s-master1 pv]# kubectl apply -f mysql-pv1.yml
persistentvolume "mysql-pv1" created
[root@k8s-master1 pv]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mysql-pv1   300Mi      RWX            Retain           Available                                      31s

pvc
[root@k8s-master1 pv]# cat mysql-pvc1.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
   name: mysql-pvc1
spec:
   accessModes:
     - ReadWriteMany
   resources:
     requests:
       storage: 300Mi
   storageClassName:

[root@k8s-master1 pv]# kubectl apply -f mysql-pvc1.yml
persistentvolumeclaim "mysql-pvc1" created
[root@k8s-master1 pv]# kubectl get pvc
NAME         STATUS    VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc1   Bound     mysql-pv1   300Mi      RWX                           5s

mysqlでの導入
[root@k8s-master1 pv]# cat mysql.yml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: mysql
spec:
  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
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
      volumes:
        - name: mysql-data
          persistentVolumeClaim:
            claimName: mysql-pvc1
[root@k8s-master1 pv]#
[root@k8s-master1 pv]# kubectl apply -f mysql.yml
service "mysql" created
deployment.apps "mysql" created
[root@k8s-master1 pv]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
mysql-5f4c86bcf9-gtstz   1/1       Running   0          9m        172.30.79.2   k8s-master2

docker inspectで情報を検索してみる
[root@k8s-master2 ~]# docker ps
CONTAINER ID        IMAGE                                                                           COMMAND                  CREATED             STATUS              PORTS               NAMES
af22cadb3a3b        mysql@sha256:de2913a0ec53d98ced6f6bd607f487b7ad8fe8d2a86e2128308ebf4be2f92667   "docker-entrypoint..."   9 minutes ago       Up 9 minutes                            k8s_mysql_mysql-5f4c86bcf9-gtstz_default_7ff51d1a-5a71-11e9-ae21-000c291d7023_0
0dc35308a0fb        registry.access.redhat.com/rhel7/pod-infrastructure:latest                      "/usr/bin/pod"           10 minutes ago      Up 10 minutes                           k8s_POD_mysql-5f4c86bcf9-gtstz_default_7ff51d1a-5a71-11e9-ae21-000c291d7023_0
[root@k8s-master2 ~]# docker inspect af22cadb3a3b

 "Mounts": [
            {
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/7ff51d1a-5a71-11e9-ae21-000c291d7023/volumes/kubernetes.io~nfs/mysql-pv1",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },

使用しているpvが見えます
pvディレクトリ生成データの取得
[root@k8s-node1 ~]# ll /mnt/data/mysqlpv1/
total 110604
-rw-rw---- 1 systemd-bus-proxy ssh_keys       56 Apr  9 10:46 auto.cnf
-rw-rw---- 1 systemd-bus-proxy ssh_keys 12582912 Apr  9 10:46 ibdata1
-rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 Apr  9 10:46 ib_logfile0
-rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 Apr  9 10:45 ib_logfile1
drwx------ 2 systemd-bus-proxy ssh_keys     4096 Apr  9 10:46 mysql
drwx------ 2 systemd-bus-proxy ssh_keys     4096 Apr  9 10:45 performance_schema
[root@k8s-node1 ~]#

7.mysqlを操作し、データを生成し、効果をテストする
データベースt 1の作成
[root@k8s-master2 ~]# docker exec  af22cadb3a3b mysql -uroot -ppassword -e"create database t1"
Warning: Using a password on the command line interface can be insecure.
[root@k8s-master2 ~]# docker exec  af22cadb3a3b mysql -uroot -ppassword -e"show databases;"
Warning: Using a password on the command line interface can be insecure.
Database
information_schema
mysql
performance_schema
t1

t 1におけるデータテーブルt 1の作成
[root@k8s-master2 ~]# docker exec  af22cadb3a3b mysql -uroot -ppassword -e "use t1;create table t1(i int);"
Warning: Using a password on the command line interface can be insecure.

データテーブルt 1は、データを挿入して取得する
[root@k8s-master2 ~]# docker exec  af22cadb3a3b mysql -uroot -ppassword -e "use t1;create table t1(i int);"
Warning: Using a password on the command line interface can be insecure.
[root@k8s-master2 ~]# docker exec  af22cadb3a3b mysql -uroot -ppassword -e "use t1;insert into t1 values(1),(3),(3);"
Warning: Using a password on the command line interface can be insecure.
[root@k8s-master2 ~]# docker exec  af22cadb3a3b mysql -uroot -ppassword -e "use t1;select * from t1;"
i
1
3
3
Warning: Using a password on the command line interface can be insecure.
[root@k8s-master2 ~]#

データが生成されましたnfsストレージディレクトリの状況とコンテナストレージディレクトリの状況を見てみましょう
nfsディレクトリ
[root@k8s-node1 ~]# ll /mnt/data/mysqlpv1/
total 110604
-rw-rw---- 1 systemd-bus-proxy ssh_keys       56 Apr  9 10:46 auto.cnf
-rw-rw---- 1 systemd-bus-proxy ssh_keys 12582912 Apr  9 11:09 ibdata1
-rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 Apr  9 11:09 ib_logfile0
-rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 Apr  9 10:45 ib_logfile1
drwx------ 2 systemd-bus-proxy ssh_keys     4096 Apr  9 10:46 mysql
drwx------ 2 systemd-bus-proxy ssh_keys     4096 Apr  9 10:45 performance_schema
drwx------ 2 systemd-bus-proxy ssh_keys       48 Apr  9 11:08 t1
[root@k8s-node1 ~]# ll /mnt/data/mysqlpv1/t1
total 112
-rw-rw---- 1 systemd-bus-proxy ssh_keys    65 Apr  9 11:05 db.opt
-rw-rw---- 1 systemd-bus-proxy ssh_keys  8554 Apr  9 11:08 t1.frm
-rw-rw---- 1 systemd-bus-proxy ssh_keys 98304 Apr  9 11:09 t1.ibd
[root@k8s-node1 ~]#

ようき
[root@k8s-master2 ~]# docker exec  af22cadb3a3b ls /var/lib/mysql
auto.cnf
ib_logfile0
ib_logfile1
ibdata1
mysql
performance_schema
t1
[root@k8s-master2 ~]# docker exec  af22cadb3a3b ls /var/lib/mysql/t1
db.opt
t1.frm
t1.ibd
[root@k8s-master2 ~]#

データの比較から分かるように、pvcは成功して今故障を模擬して、k 8 s-master 2機械は死んでしまいます
[root@k8s-master2 ~]# init 0
Connection closing...Socket close.

Connection closed by foreign host.

Disconnected from remote host(k8s-master2) at 11:14:05.

Type `help' to learn how to use Xshell prompt.
[C:\~]$
[root@k8s-master1 pv]# kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
mysql-5f4c86bcf9-cz2np   1/1       Running   0          1m        172.30.27.2   k8s-master3
mysql-5f4c86bcf9-gtstz   1/1       Unknown   0          34m       172.30.79.2   k8s-master2
[root@k8s-master1 pv]#

podはk 8 s-master 3に自動的に切り替わりました
[root@k8s-master3 ~]# docker ps
CONTAINER ID        IMAGE                                                                           COMMAND                  CREATED              STATUS              PORTS               NAMES
e53dccc404b7        mysql@sha256:de2913a0ec53d98ced6f6bd607f487b7ad8fe8d2a86e2128308ebf4be2f92667   "docker-entrypoint..."   About a minute ago   Up About a minute                       k8s_mysql_mysql-5f4c86bcf9-cz2np_default_38792912-5a76-11e9-ae21-000c291d7023_0
228f7a798f7e        registry.access.redhat.com/rhel7/pod-infrastructure:latest                      "/usr/bin/pod"           2 minutes ago        Up 2 minutes                            k8s_POD_mysql-5f4c86bcf9-cz2np_default_38792912-5a76-11e9-ae21-000c291d7023_0
[root@k8s-master3 ~]#

データの取得
[root@k8s-master3 ~]# docker exec e53dccc404b7 mysql -uroot -ppassword -e "use t1;select * from t1;"
Warning: Using a password on the command line interface can be insecure.
i
1
3
3
[root@k8s-master3 ~]#

Mysqlのデータはpodとデカップリングされていることがわかります.