• 1)emptyDir(pod删除卷被删除)

    点击查看代码
    [root@anyu967master1 volume]# more ./emptydir.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-empty
    spec:
      containers:
      - name: container-empty
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: /cache
          name: cache-volume
      volumes:
      - name: cache-volume
        emptyDir: {}
    [root@anyu967master1 volume]# kubectl get pods -o wide
    NAME        READY   STATUS    RESTARTS      AGE   IP               NODE           NOMINATED NODE   READINESS GATES
    demo-pod    1/1     Running   7 (21h ago)   13d   10.244.255.178   anyu967node2   <none>           <none>
    pod-empty   1/1     Running   0             69s   10.244.255.180   anyu967node2   <none>           <none>
    [root@anyu967master1 volume]# kubectl get pods pod-empty -o yaml |grep uid
      uid: cfcda1a8-4a8e-4141-9422-d6cacac21ac8
    [root@anyu967node2 ~]# tree /var/lib/kubelet/pods/cfcda1a8-4a8e-4141-9422-d6cacac21ac8
    /var/lib/kubelet/pods/cfcda1a8-4a8e-4141-9422-d6cacac21ac8
    ├── containers
    │   └── container-empty
    │       └── 59e15d9f
    ├── etc-hosts
    ├── plugins
    │   └── kubernetes.io~empty-dir
    │       ├── cache-volume
    │       │   └── ready
    │       └── wrapped_kube-api-access-wx7m6
    │           └── ready
    └── volumes
        ├── kubernetes.io~empty-dir
        │   └── cache-volume
        └── kubernetes.io~projected
            └── kube-api-access-wx7m6
                ├── ca.crt -> ..data/ca.crt
                ├── namespace -> ..data/namespace
                └── token -> ..data/token
    
  • 2)hostPath(pod删除卷不会被删除)

    点击查看代码
    [root@anyu967master1 volume]# cat ./hostPath.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-hostpath
    spec:
      # nodeName: anyu967node2
      containers:
        - image: nginx
          imagePullPolicy: IfNotPresent
          name: test-nginx
          volumeMounts:
            - mountPath: /test-nginx
              name: test-volume
        - image: tomcat:8.5-jre8-alpine
          imagePullPolicy: IfNotPresent
          name: test-tomcat
          volumeMounts:
            - mountPath: /test-tomcat
              name: test-volume
      volumes:
        - name: test-volume
          hostPath:
            path: /home/xy/data1
            type: DirectoryOrCreate
    [root@anyu967master1 volume]# kubectl get pods -o wide
    NAME            READY   STATUS    RESTARTS      AGE   IP               NODE           NOMINATED NODE   READINESS GATES
    test-hostpath   2/2     Running   0             21s   10.244.255.186   anyu967node2   <none>           <none>
    [root@anyu967master1 xy]# kubectl exec -it test-hostpath -c test-nginx -- /bin/sh
    
  • 3)nfs(network file system)

    点击查看代码
    [root@anyu967master1 volume]# yum install nfs-utils -y
    [root@anyu967master1 volume]# ll /home/xy/data/volumes
    [root@anyu967master1 volume]# more /etc/exports
    /home/xy/data/volumes 192.168.56.0/24(rw,no_root_squash)
    [root@anyu967master1 volume]# exportfs -arv
    exporting 192.168.56.0/24:/home/xy/data/volumes
    
    [root@anyu967master1 volume]# cat ./nfs.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-nfs-volume
    spec:
      containers:
      - name: test-nfs
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nfs-volumes
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-volumes
        nfs:
          path: /home/xy/data/volumes
          server: 192.168.56.129
    
    [root@anyu967node1 xy]# mount 192.168.56.129:/home/xy/data/volumes /home/xy/nfs/
    
  • 4)PV & PVC & StorageClass(持久化存储卷)

    访问模式:
    ReadWriteOnce(RWO), 卷可以被一个节点以读写方式挂载

    ReadOnlyMany(ROX), 卷可以被多个节点以只读方式挂载

    ReadWriteMany(RWX), 卷可以被多个节点以读写方式挂载

    点击查看代码
    [root@anyu967master1 volumes_pv]# exportfs -arv
    exporting 192.168.56.0/24:/home/xy/data/volumes_pv/v4
    exporting 192.168.56.0/24:/home/xy/data/volumes_pv/v3
    exporting 192.168.56.0/24:/home/xy/data/volumes_pv/v2
    exporting 192.168.56.0/24:/home/xy/data/volumes_pv/v1
    exporting 192.168.56.0/24:/home/xy/data/volumes
    
    [root@anyu967master1 volume]# kubectl get pv
    NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    v1     1Gi        RWO            Retain           Available                                   18s
    v2     2Gi        RWX            Retain           Available                                   18s
    v3     3Gi        ROX            Retain           Available                                   18s
    v4     4Gi        RWO,RWX        Retain           Available                                   18s
    [root@anyu967master1 volume]# kubectl get pvc
    NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    my-pvc   Bound    v2       2Gi        RWX                           6s
    [root@anyu967master1 volume]# kubectl get pv
    NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
    v1     1Gi        RWO            Retain           Available                                            7m48s
    v2     2Gi        RWX            Retain           Bound       default/my-pvc                           7m48s
    v3     3Gi        ROX            Retain           Available                                            7m48s
    v4     4Gi        RWO,RWX        Retain           Available                                            7m48s
    [root@anyu967master1 volume]# kubectl get pods -o wide
    NAME       READY   STATUS    RESTARTS      AGE   IP               NODE           NOMINATED NODE   READINESS GATES
    pod-pvc    1/1     Running   0             14s   10.244.255.190   anyu967node2   <none>           <none>
    
    # StorageClass 创建PV的模板,动态供给PV
    [root@anyu967master1 volume]# kubectl get sa
    NAME              SECRETS   AGE
    default           0         18d
    nfs-provisioner   0         12s
    [root@anyu967master1 data]# kubectl create clusterrolebinding nfs-provisioner --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
    clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner created
    [root@anyu967master1 volume]# kubectl apply -f nfsDeployment.yaml 
    deployment.apps/nfs-provisioner created
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-provisioner
    spec:
      selector:
        matchLabels:
          app: nfs-provisioner
      replicas: 1
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nfs-provisioner
        spec:
          serviceAccount: nfs-provisioner
          containers:
          - name: nfs-provisioner
            image: registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisione:v4.0.0
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
            env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.56.129
            - name: NFS_PATH
              value: /home/xy/data/nfs_pro/
    
    [root@anyu967master1 volume]# kubectl get pods
    NAME                               READY   STATUS    RESTARTS      AGE
    nfs-provisioner-8558b45ff5-pkx44   1/1     Running   0             6s
    [root@anyu967master1 volume]# kubectl get storageclass
    NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    nfs    example.com/nfs   Delete          Immediate           false                  10s
    [root@anyu967master1 volume]# kubectl apply -f dynamicClaim.yaml 
    persistentvolumeclaim/test-claim1 created
    [root@anyu967master1 volume]# kubectl get pvc
    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    test-claim1   Bound    pvc-414340e3-a0ed-41b8-aeff-d314f237fce5   1Gi        RWX            nfs            9s
    
  • 5)StatefulSet 控制器(handleless service)

    StatefulSet是有状态的集合,管理有状态的服务,所管理的Pod的名称不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独有的数据持久化存储目录。比如MySQL主从、redis集群等。
    Replicaset、Deployment、DaemonSet都是管理无状态的服务,所管理的Pod的IP、名字、启停顺序等都是随机的。个体对整体无影响,所有pod都是共用一个数据卷的,部署的tomcat就是无状态的服务,tomcat被删除,在启动一个新的tomcat,加入到集群即可,跟tomcat的名字无关。

    点击查看代码
    # Headless Service: 用来定义Pod网络标识,生成可以解析DNS记录;
    # vollumeClaimTemplates: 存储申请模板,创建PVC,指定pvc名称大小,自动创建pvc,且pvc由存储类供应;
    # StatefulSet: 管理pod的
    
    # FQDN:<pod_name>.<svc_name>.<namespace_name>.svc.cluster.local
    
    [root@anyu967master1 statefulset]# cat ./statefulSet.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80    # service 端口
        name: web
      clusterIP: None
      selector:
        app: nginx  # 标签选择器 选择拥有**app=nginx**标签的pod
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:  # May match selectors of replication controllers and services
        app: sts-nginx
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx" # handlerless service的名字
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx  # 标签
        spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: ["ReadWriteOnce","ReadWriteMany"]
          storageClassName: nfs-web  # 指定从哪个存储类申请pv
          resources:
            requests:
              storage: 1Gi  # 需要1Gi的pv 会自动跟符合条件的pv绑定
    
posted on 2023-04-22 16:10  anyu967  阅读(59)  评论(0)    收藏  举报