带你玩转kubernetes-k8s(第七篇:k8s-Job,Volume概念及其实例)

     哈喽~大家好,Service的基本概念讲了一个大致的框架,不知道大家有没有看到,如果不懂,欢迎大家前来一起讨论哦。

     现在我们开始接下来的内容。

Job

   批处理任务通常并行(或串行)启动多个计算进程去处理一批工作项(work item),在处理完成后,整个批处理任务结束。k8s支持批处理类型的应用,我们可以通过Kubernetes Job这种资源对象定义并启动一个批处理任务Job。与RC、Deployment、ReplicaSet、DaemonSet类似,Job也控制一组Pod容器。从这个角度来看,Job也是一种特殊的Pod副本自动控制器,同时Job控制Pod副本与RC等控制器的工作机制有以下重要差别。

(1)Job所控制的Pod副本是短暂运行的,可以将其视为一组Docker容器,其中的每个Docker容器都仅仅运行一次。当Job控制的所有Pod副本都运行结束时,对应的Job也就结束了。Job生存的Pod副本是不能自动重启的,对应Pod副本的RestartPoliy都被设置为Never。k8s1.5之后提供了类似crontab的定时任务——Cronjob,解决了某些批处理任务需要定时反复执行的问题。

(2)Job所控制的Pod副本的工作模式能够多实例并行计算,以TensorFlow框架为例,可以将一个机器学习的计算任务分布到10台机器上,在每台机器上都运行一个worker执行计算任务,这很适合通过Job生成10个Pod副本同时启动运算。

后面我们会继续深入讲解Job的实现原理及对应的案例。

Volume

       Volume(存储卷)是Pod中能够被多个容器访问的共享目录。k8s中的Volume与Docker中的Volume概念、用途和目的都比较类似,但两者不能等价。k8s中的Volume被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下;k8s中的Volume与Pod的生命周期相同,但与容器的生命周期不相关,当容器终止或者重启时,Volume中的数据也不会丢失。k8s支持多种类型的Volume,如GlusterFS,Ceph等先进的分布式文件系统。

     接下来为大家准备了一个实例。

        我们要给之前的Tomcat Pod增加一个名为datavol的Volume,并且挂载到容器的/mydata-data目录上,则只要对Pod的定义文件做如下修正即可。

  替换资源

kubectl replace -f xxx.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
spec:
  replicas: 1
  selector:
    tier: frontend
  template:
    metadata:
      labels:   #可以自己定义key-value
        app: app-demo   
        tier: frontend   #前端架构
    spec:
      volumes:
      - name: datavol
        emptyDir: {}
      containers:
      - name: tomcat-damo
        image: tomcat
        volumeMounts:
        - mountPath: /mydata-data
          name: datavol
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        env:             
        - name: GET_HOSTS_FROM
          value: dns

验证是否挂载成功。

带你玩转kubernetes-k8s(第七篇:k8s-Job,Volume概念及其实例)_第1张图片

     除了可以让一个Pod里的多个容器共享文件、让容器的数据写到宿主机的磁盘上或者写文件到网络存储中,Kubernetes的Volume还扩展出了一种非常有实用价值的功能,即容器配置文件集中化定义与管理,这是通过ConfigMap这种新的资源对象来实现的,后面会详细说明。

k8s提供看丰富的Volume类型,下面逐一进行说明。

1.emptyDir

     一个emptyDir Volume是在Pod分配到Node是创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件。当Pod从Node上移除时,emptyDir中的数据也会被永久删除。emptyDir的一些用途如下。

◎ 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留。
◎ 长时间任务的中间过程CheckPoint的临时保存目录。
◎ 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)。

目前,用户无法控制emptyDir使用的介质种类。

2.hostPath

  hostPath为在Pod上挂在宿主机上的文件或目录,它通常可以用于以下几方面。

◎ 容器应用程序生成的日志文件需要永久保存时,可以使用宿主机的高速文件系统进行存储。
◎ 需要访问宿主机上Docker引擎内部数据结构的容器应用时,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问Docker的文件系统。
在使用这种类型的Volume时,需要注意以下几点。
◎ 在不同的Node上具有相同配置的Pod,可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结果不一致。
◎ 如果使用了资源配额管理,则Kubernetes无法将hostPath在宿主机上使用的资源纳入管理。

使用宿主机的/data目录定义了一个hostPath类型的Volume:

volumes:
- name: "Oersistent-storage"
  hostPath:
    path: "/data"

3.gcePersistentDist

       使用这种类型的Volume表示使用谷歌公有云提供的永久磁盘(Persistent Disk, PD)存放Volume的数据,它与emptyDir不同,PD上的内容会被永久保存,当Pod删除时,PD只是被卸载(Unmount),但不会被删除。需要注意的是,你需要先创建一个PD,才能使用公测PersistentDisk。

       使用gcePersistentDisk时有以下一些限制条件。

            ◎  Node(运行kubelet的节点)需要是GCE虚拟机。

            ◎ 这些虚拟机需要与PD存在于相同的GCE项目和Zone中。

通过gcloud命令即可创建一个PD:

gcloud compute disks create --size=500GB --zone=us-centrall0a my-data-disk

定义gcePersistentDisk类型的Volume的示例如下:

volumes:
- name: test-volume
  # This GCE PD must already exist.
  gcePersistentDisk:
    pdName: my-data-disk
    fsType: ext4

4.awsElasticBlockStore

       与GCE类似,该类型的Volume使用亚马逊公有云听的EBS Volume存储数据,需要先创建一个EBS Volume才能使用。

       使用的限制条件如下:

           ◎ Node(运行kubelet的节点)需要是AWS EC2实例。
           ◎ 这些AWS EC2实例需要与EBS Volume存在于相同的region和availability-zone中。
           ◎ EBS只支持单个EC2实例挂载一个Volume。

创建一个EBS Volume:

aws ec2 create-volume --avaliability-zone eu-west-la --size 10 --volume-type gp2

定义awsElasticBlockStore类型的Volume的示例如下:

volumes:
- name: test-volumes
  # This AWS EBS volume must already exist.
  awsElasticBlockStore:
    volumeID: aws:///
    fsType: ext4 

5.NFS

      使用NFS网络文件系统提供的共享目录存储数据时,我们需要在系统中部署一个NFS Server。定义NFS类型的Volume的示例如下:

volumes:
- name: nfs
  nfs:
    # 改为你的NFS服务器地址
    server: nfs-server.localhost
    path: "/"

6.其他类型的Volume
◎ iscsi:使用iSCSI存储设备上的目录挂载到Pod中。
◎ flocker:使用Flocker管理存储卷。
◎ glusterfs:使用开源GlusterFS网络文件系统的目录挂载到Pod中。
◎ rbd:使用Ceph块设备共享存储(Rados Block Device)挂载到Pod中。
◎ gitRepo:通过挂载一个空目录,并从Git库clone一个git repository以供Pod使用。
◎ secret:一个Secret Volume用于为Pod提供加密的信息,你可以将定义在Kubernetes中的Secret直接挂载为文件让Pod访问。Secret Volume是通过TMFS(内存文件系统)实现的,这种类型的Volume总是不会被持久化的。

小结:

           通过文章的长度大家就可以知道Volume的重要性了,这里只是让大家有个Volume的概念,后面我们会详细全面的讲解,进行项目实战哦。

 

 

你可能感兴趣的:(kubernetes)