Kubernetes 修仙录

锻骨境-第7层 k8s文件系统实现PVC挂载

2019-10-30  本文已影响0人  一笑醉红颜zh

我就是我,不一样的烟火。

容器是可以随时死去的,但是,我们在容器执行完成之后,需要把结果存储下来,而我们的pod 是在各个主机上的,或者是一组pod 协同工作的时候,需要同时读写一块共同的数据,那么自然需要一个共同的可用的存储,我们使用的NFS 文件系统。
这里说明如何做安装nfs 服务已经使用k8s 创建在nfs 上创建pv,pvc 。

搭建NFS 服务

NFS需要nfs-utils和rpcbind两个包, 但安装nfs-utils时会一起安装上rpcbind

  rpcinfo -p
  rpm -qa |grep nfs-utils
  yum -y install nfs-utils
 # 设置开机启动
 systemctl enable rpcbind.service 
 systemctl enable nfs-server.service
# 启动
  systemctl start nfs-utils
  systemctl enable  nfs-utils
# 查看nfs服务信息
  rpcinfo -p
# 关闭防火墙 
systemctl stop firewalld.service

# 客户端只需要client 连接服务端即可
yum install nfs-utils
# 客户端验证
[root@localhost ~]# showmount -e 192.168.64.133
Export list for 192.168.64.133:
/home/nfs *
#  客户端挂载,挂载访问点:把服务端的文件目录挂载在本地 ,本地是/data/kubernetes 
mkdir  -p /data/kubernetes 
mount -t nfs 192.168.10.134:/dada/k8s /data/kubernetes  -o proto=tcp -o nolock

# 意思就是服务端上的挂载点是134 的 dada/k8s , 133 本地的目录是 /data/kubernetes 

注意:挂载的时候,挂载点 /data/kubernetes 目录必须已经存在, 且在 /data/kubernetes 目录中没有文件或子目录。


k8s 的pv pvc

k8s  配置nfs provisor ,一个提供者,创建完storageCalss 之后,创建pv ,然后创建pvc 

静态是直接指定多大的pv,指定使用多大的pvc 
动态是从pvc 大小,自动的创建 pv 进行绑定,是和静态创建相反的过程。
即:
如果在pv 中指定了nfs 的路径,则是静态pv 
如果是通过provisor 来指定,是动态pv 。

在k8s 原先配置一个nfs RBAC权限,使用create 命令创建。

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["watch", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services", "endpoints"]
    verbs: ["get"]
  - apiGroups: ["extensions"]
    resources: ["podsecuritypolicies"]
    resourceNames: ["nfs-provisioner"]
    verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

配置一个nfs provisioner :

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-client-provisioner
          image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.64.134
            - name: NFS_PATH
              value: /dada/kubernetes 
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.64.134
            path: /dada/kubernetes 


配置storageClass

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: managed-nfs-storage 
provisioner: fuseim.pri/ifs

测试例子:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web1
spec:
  serviceName: "nginx3"
  replicas: 1
  volumeClaimTemplates:
  - metadata:
      name: default
      annotations:
        volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi 
  template:
    metadata:
     labels:
       app: nginx3
    spec:
     containers:
     - name: nginx
       image: nginx:1.7.9
       volumeMounts:
       - mountPath: "/mnt"
         name: default

部署

[root@bogon statefulset]# kubectl create -f deployment-nfs.yaml
[root@bogon statefulset]# kubectl get deployment
NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nfs-client-provisioner   1         1         1            1           36m

[root@bogon statefulset]# kubectl create -f storageclass-nfs.yaml
[root@bogon statefulset]# kubectl get storageclass 
NAME                  PROVISIONER      AGE
managed-nfs-storage   fuseim.pri/ifs   36m


[root@bogon statefulset]# kubectl create -f statefulset-nfs.yaml
statefulset "web" created



[root@bogon statefulset]# kubectl get  pvc 


小结

pvc 其实就是在 /dada/kubernetes 上这个目录下存储的数据,这个数据在 133 上可以从/data/kubernetes 上可以看到 。

volumeClaimTemplates 下的metadata.name属性必须和最下面的voluments.name属性一致,创建pod 的会校验。默认动态生成的pvc名称就是 : {volumeClaimTemplates.metadata.name}-{podName}"。 通过注解方式实现动态pvc绑定。
动态创建的pvc 删除之后,根据 策略,如果是delete ,pv也会自动删除、

上一篇下一篇

猜你喜欢

热点阅读