搞清楚pv,pvc
pv = PersistentVolume 持久化存储控制器,面向集群而不是namespace。
pvc = PersistentVolumeClaim 对接pod与pv,
关系,官方说明
A PVC to PV binding is a one-to-one mapping, using a ClaimRef which is a bi-directional binding between the PersistentVolume and the PersistentVolumeClaim
大体意思如下:pvc与pv的绑定关系是一一对应的。注意!这里的一一对应是每个pvc只有一个pv,但pv可以对应多个pvc。这一点从Access Modes包含ReadWriteMany就可以看出来。
这篇文章只针对简单的“静态存储”,不包含“动态存储”部分。
pvc与pv对应问题。pvc会搜索pv,找到没有被绑定,资源要求又一致,如果添加了label,pvc又设置了matchLabel属性的时候,会自动绑定。 更具体的,会在NFS存储(复杂版本)中介绍。
$yum install nfs-utils -y
$systemctl enable rpcbind nfs
$systemctl start rpcbind nfs
$mkdir /data/nfs
$chown -R nfsnobody.nfsnobody /data/nfs
$vim /etc/export
/data/nfs 192.168.56.0/24(rw,async,all_squash)
/data/nfs/mysql 192.168.56.0/24(rw,async,no_root_squash,fsid=0) # 这里很重要,MYSQL会修改目录权限所以必须放宽ROOT权限
$systemctl restart nfscd $HOME
mkdir nfs  
sudo mount -t nfs 192.168.56.4:/data/nfs nfs创建给MySQL用的存储空间mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/nfs/mysql
    server: 192.168.56.4$kubectl create -f mysql-pv.yaml
$kubectl get pv mysql-pv
NAME       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     REASON    AGE
mysql-pv   5Gi        RWO           Recycle         Available                       3s创建mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi$kubectl create -f mysql-pvc.yaml
NAME            STATUS    VOLUME     CAPACITY   ACCESSMODES   AGE
pvc/mysql-pvc   Bound     mysql-pv   5Gi        RWO           22s
NAME          CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM               REASON    AGE
pv/mysql-pv   5Gi        RWO           Recycle         Bound     default/mysql-pvc             2m
修改mysql-rc.yaml(参见无脑系列-最小集群搭建)
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql-rc
spec:
  replicas: 1
  selector:
    app: mysql-pod
  template:
    metadata:
      labels:
        app: mysql-pod
    spec:
      containers:
      - name: mysql
        image: mysql:5.6
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123"
        volumeMounts:
        - mountPath: "/var/lib/mysql"
          name: mysql-data
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc$kubectl create -f mysql-rc.yaml
$kubectl get rc mysql-rc
NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)    SELECTOR
mysql-rc   1         1         1         16s       mysql          mysql:5.6   app=mysql-pod至此,带持久化存储的MySQL实例已经运行在集群中。
一定要再验证一下的话进入NFS服务目录发现mysql数据已经出现在目录中
$cd /data/nfs/mysql && ls
auto.cnf  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schemamysql-rc创建不成功,报告“changing ownership of ‘/var/lib/mysql/‘: Operation not permitted”
解答:请参考NFS的export部分,挂载给MySQL的目录,一定要加入no_root_squash,fsid=0。不然就会报告上面的错误
如果已经做了调整,请重启nfs服务,删除mysql-rc。重新创建
诊断技巧
mysql-rc创建不成功,xxxx代表运行时的编号
$kubectl describe pod mysql-rc-xxxx
$kubectl log mysql-rc-xxxx
查看pod所在机器、错误日志
进入pod所在Node,执行df命令查看挂载是否成功
原文:https://www.cnblogs.com/smokelee/p/12444956.html