k8s中管理有状态pod得statefulset,关联Volume,会用到persistent vloume claim(PVC),和persistent vloume(PV)。

可以把它们两个当作是接口和类的关系,PV实现PVC,PVC关联PV,开发人员定义PVC(把关心的程序参数植入,存储多大,可读写,是否共享等等),运维人员定义PV(具体的机器配置等等包括用户密码、网络地址之类的)

声明一个PVC

apiVersion: v1
kind: Pod
metadata:
  name: pv-pod
spec:
  containers:
    - name: pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pv-storage
  volumes:
    - name: pv-storage
      persistentVolumeClaim:
        claimName: pv-claim
 

每个 PVC 包含一个 spec 以及 status,用以表达其规格和状态

然后声明一个PV

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-volume
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  rbd:
    monitors:
    - '10.16.154.78:6789'
    - '10.16.154.82:6789'
    - '10.16.154.83:6789'
    pool: kube
    image: foo
    fsType: ext4
    readOnly: true
    user: admin
    keyring: /etc/ceph/keyring
    imageformat: "2"
    imagefeatures: "layering"

 

观察发现PVC和PV两者之间,没有key进行关联。其实PVC是自动绑定符合条件的PV的,一般来说关键字段是spec:storage,满足申请空间的就绑定。

pv和pvc是一对一绑定的。不过多个pod可以挂载同一个pvc  

通常使用的流程是,首先创建存储,在创建pv,接着创建pvc,pod挂载到相应的pvc。

Pod 能够借助 PVC 来访问存储。PVC 必须跟 Pod 处于同一个命名空间。集群找到 Pod 命名空间中的 PVC,然后利用 PVC 获取到背后的 PV。这个卷就会被加载到主机上,让 Pod 可以使用

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: dockerfile/nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: pv-claim

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐