目录

Volume

K8S学习笔记

1.emptyDir

这是卷的基础。 生命周期取决于Pod。 当相关 Pod 被删除时,该卷也会被删除。 所以我们可以将其视为Pod的路径。 Pod 的所有容器共享这个 voiume。 让我们展示如何设置音量配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apiVersion: v1
kind: Pod
metadata:
name: producer-consumer
spec:
containers:
- image: busybox
  name: producer
  volumeMounts:
  - mountPath: /producer_dir
    name: shared-volume
  args:
  - /bin/sh
  - -c
  - echo "hello world" > /producer_dir/hello; sleep 30000

- image: busybox
  name: consumer
  volumeMounts:
  - mountPath: /consumer_dir
    name: shared-volume
  args:
  - /bin/sh
  - -c
  - cat /consumer_dir/hello; sleep 30000

volumes:
- name: shared-volume
  emptyDir: {}

上面的文件是关于配置卷的练习。 我们在pod中设计了两个容器,一个是生产者,将日志写入路径文件中,另一个是消费者,从文件中读取日志。 很容易理解,这两个容器共享 Pod 的存储。

2. 主机路径

这种体积很少使用。 这并不常见。 这用于 Docker 主机挂载 Pod 的现有路径。 所以Pod和容器有很强的耦合性。 但如果 pod 被删除,该卷仍然存在。 但是,请避免使用此类卷。

3. 外部存储提供商

这使用外部存储提供者来实现卷。 例如使用AWS,GCE或Azure等。 让我展示一下配置。

这使用了 aws 存储。 使用它的优点是使 k8s 集群和卷隔离。 k8s集群销毁时没有影响。

4.持久卷和持久卷声明

从第 3 节中,我们知道我们可以使用 k8s 卷的外部存储。 但有一个问题,实际上存储系统总是用于管理的,而k8s部署是用于开发人员的。 有不同的部门。 如何平衡差距。 解决方法是PV和PVC。

PV由管理部门维护,是安排的外部存储。 但PVC是给开发商用的。 部署微服务时,可以设置pvc来安排PV的空间。 因此PV和PVC协调部署整个系统。

4.1 NFS 持久卷

首先,在主从节点上安装NFS服务。 还定义安装路径。 以下是 PV 和 PVC 配置文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv1
spec:
capacity:
storage: 1Gi
accessModes:
  - ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
  path: /tmp/pv1
  server: 10.128.0.2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc1
spec:
accessModes:
  - ReadWriteOnce
resources:
  requests:
    storage: 1Gi
storageClassName: nfs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod1
spec:
containers:
  - name: mypod1
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30000
    volumeMounts:
    - mountPath: "/mydata"
      name: mydata
volumes:
  - name: mydata
    persistentVolumeClaim:
      claimName: mypvc1

在PV YAML文件中,我们可以定义持久卷策略类型。 有保留回收删除三种类型。默认策略是删除。

  • Retain:用户删除了一个perpetitiveVolumeClaim,对应的perpetitiveVolume并没有被删除。 相反,它已进入发布阶段,可以手动恢复其所有数据。
  • Recycle:与Retain不同,删除PVC后数据无法手动恢复。
  • 删除:这是默认模式。 意味着当用户删除相应的图片时,动态pv会自动删除。

运行 pod 时,将挂载 PVC 路径。 然后使用命令向挂载路径写入一些内容。 从下面的运行结果,我们可以了解NFS中的PV和PVC。

https://cdn.jsdelivr.net/gh/yeliansong/github-blog-PIC/blog-images/7777.jpeg

关于是静态规定,还有另一种规定,它是动态规定。 它根据情况安排存储。

4.2 数据库实践

  • 后台:使用NFS PV和PVC在节点关闭时进行数据库备份,以验证数据持久性。

  • 步骤:

    • 根据以下配置文件部署PV和PVC。

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      
      mysql-pvc.yaml
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
      name: mysql-pvc
      spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: nfs
      
  •  1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    mysql-pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: mysql-pv
    spec:
    accessModes:
       - ReadWriteOnce
     capacity:
       storage: 1Gi
     persistentVolumeReclaimPolicy: Retain
     storageClassName: nfs
     nfs:
       path: /tmp/mysql-pv
       server: 10.128.0.2	yaml
    
  • 部署 mysql pod 和服务

    •  1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      
      piVersion: v1
      kind: Service
      metadata:
      name: mysql
      spec:
      ports:
       - port: 3306
       selector:
         app: mysql
      
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
       name: mysql
      spec:
       selector:
         matchLabels:
           app: mysql
       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-persistent-storage
               mountPath: /var/lib/mysql
           volumes:
           - name: mysql-persistent-storage
             persistentVolumeClaim:
               claimName: mysql-pvc
      
      • 使用客户端访问数据库,向数据库中插入一些消息。
  • 关闭node1,数据库会自动备份到node2。 备份完成后,我们可以在master节点进行验证