美文网首页
备战CKA每日一题——第12天

备战CKA每日一题——第12天

作者: 小E的私房菜 | 来源:发表于2020-03-13 15:25 被阅读0次

第十二题:不以持久卷方式挂载:


题目:

1.创建一个pod,名为non-presistent-redis
2.挂载存储卷,卷名为:cache-control,挂载到本地的:/data/redis目录下
3.在名称空间ns-ehj里做,不要以持久卷方式挂载

解题思路:
解题步骤-1( emptyDir 模式):
  • 步骤1: dry-run创建初始文件:
sudo kubectl run non-persistent-redis --image=redis --generator=run-pod/v1 --dry-run -o yaml > non-persistent-redis.yaml
  • 步骤2: 修改文件,挂载硬盘(emptyDir:{}):
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: non-persistent-redis
  name: non-persistent-redis
  namespace: ns-ehj
spec:
  volumes:
    - name: cache-control
      emptyDir: {}
  containers:
  - image: redis
    name: non-persistent-redis
    volumeMounts:
      - mountPath: /data/redis
        name: cache-control
解题步骤-2( hostPath模式):
  • 步骤1: dry-run创建初始文件
sudo kubectl run non-persistent-redis-hostpath --image=redis --generator=run-pod/v1 --dry-run -o yaml > non-persistent-redis-hostpath.yaml
  • 步骤2: 修改文件,挂载硬盘(hostPath):
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: non-persistent-redis-hostpath
  name: non-persistent-redis-hostpath
  namespace: ns-ehj
spec:
  volumes:
    - name: cache-control-hostpath
      hostPath:
        path: ~/data/redis
        type: DirectoryOrCreate
  containers:
  - image: redis
    name: non-persistent-redis-hostpath
    volumeMounts:
      - mountPath: /data/redis
        name: cache-control-hostpath
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

下面我们来具体了解下K8S中的volume挂载方式:
1.我们需要清楚的是:

  • 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。 首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失——因为容器会以干净的状态重建。
  • 当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两个问题。
    2.K8S支持的Volume的类型:

我们来看下几个常用的Volume:

  1. emptyDir:当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
注意:

容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。
默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium 字段设置为 "Memory",以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。
emptyDir示例:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
  1. hostPath:
    hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。
    例如,hostPath 的一些用法有:
  • 运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
  • 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
  • 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。
    除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。
    支持的 type 值如下:


    image.png

    当使用这种类型的卷时要小心,因为:

  • 具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
  • 当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 使用的资源。
  • 基础主机上创建的文件或目录只能由 root 用户写入。您需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath
    hostPath 示例:
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

注意:

一定要找到该node上的mount目录。

相关文章

网友评论

      本文标题:备战CKA每日一题——第12天

      本文链接:https://www.haomeiwen.com/subject/arefshtx.html