Day21-Kubernetes 那些事 - Volume

前言

上一篇文章介绍了 ConfigMap 以及 Secrets 以及如何建立,接下来就要介绍如何正确地套用到 Pod 上,想套用到 Pod 上必须要先了解 Volume,废话不多说马上开始今天的文章吧!

什麽是 Volume?

Volumes 为 K8s 用来储存资料的地方,不但能将 container 的资料存下来,同时也能利用挂载(mounting) 的方式提供给其他 Pod 使用,整体来说跟 Docker 的 Volume 很像,但 K8s 的 Volume 多了生命周期、也比 Docker 支援更多不同类型的 Volume 型态。

Volume 类型

讲完什麽是 Volume 後接下来讲一下 Volume 的类型吧!这里笔者讲几个比较常用到的 Volume 类型,想了解更多类型的读者可以参考这个网站

  • emptyDir

    当新增一个新的 Pod 的时候,k8s 就会在这个 Pod 新增一个 emptyDir ,让这个 Pod 内所有的 container 都可以存取这个 emptyDir ,当 Pod 被移除时,该 emptyDir 也会跟着被移除。

    所以只要 kubelet 没有将 Pod 砍掉重建,其内部的 container 即便重启都可以存放在 emptyDir 的内容。

  • hostPath

    在 Pod 物件上,挂载 Node 的资料夹或档案,简单来说就是直接把机器上的档案挂载到 Pod 中。

  • Cloud Storage

    使用云端硬碟的 Volumes ,常见的有 AWS EBS、Google Disk、Microsoft Azure Disk。

  • Network FileSystem(NFS)

    利用 NFS 的原理存取同一个网域下的机器中的资料。

  • ConfigMap

  • Secrets

ConfigMap 与 Secrets 挂载

介绍完 Volume 後接下来就要进入重头戏,终於要把昨天文章挖的坑填起来了XD,这边一样把之前写好的 Deployment 在进行改写。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    minReadySeconds: 60
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
        - name: helloworld
          image: w5151381guy/helloworld
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 200m
              memory: 500Mi
            limits:
              cpu: 500m
              memory: 800Mi
          livenessProbe:
            httpGet:
              path: /
              scheme: HTTP
              port: 8080
            initialDelaySeconds: 3
            periodSeconds: 60
            successThreshold: 2
            failureThreshold: 5
          volumeMounts:
            - name: helloworld-config
              mountPath: /etc/nginx/conf.d
              readOnly: true
            - name: helloworld-secret
              mountPath: /etc/nginx/ssl
      volumes:
        - name: helloworld-config
          configMap:
            name: helloworld-config
        - name: helloworld-secret
          secret:
            secretName: helloworld-secret

这边可以拆成两个部分来看,首先我们要先在 Pod 内定义好 Volume 型态,由於示范的内容为 ConfigMap 以及 Secrets,因此会在 Volume 内定义建立好的 ConfigMap 以及 Secrets。

  • name

    设定此 Volume 的名称。

  • configMap

    设定 Volume 的类型为 ConfigMap。

  • secret

    设定 Volume 的类型为 Secret。

    现在 Pod 内已经有定义好的 Volume 了,接下来就可以把 Volume 内的档案传进去 container 内了,而这边会用 volumeMounts 的方式代表挂载 Volume 内的档案。

  • name

    要挂载进 container 的 Volume 名称,这边的名称会从 Volume 内抓取,因此必须要设定的跟上面提到的 name 一致,不然会找不到要挂载的 Volume。

  • mountPath

    设定要挂载在 container 中的哪个路径上,假如所设定的路径资料夹 container 本身没有建立,则会创一个新的资料夹并把档案挂载到进去。

  • readOnly

    设定该档案是否只能读取,预设为 false

更新 Deployment 内容

接下来把范例的 Deployment 利用 replace 的参数更新内容。

一样可以下 get 参数查看建立起来的 Pod。

这时候可以进入随便一个 Pod,查看刚刚挂载进去的 ConfigMap 以及 Secrets,也可以藉此了解 ConfigMap 以及 Secrets 是真的会连结到档案。

小结

今天介绍了 Volume,也终於把 ConfigMap 以及 Secrets 的挂载介绍完了,相信未来如果要存放跟部署面有关的内容应该都会改用 ConfigMap 以及 Secrets 了方便又好管理,接下来要介绍的内容就比较不一样了,跟 Pod 的写法比较没什麽关联。

如果对於文章有任何问题都欢迎留言给我,那我们就下篇文章见喽~


<<:  Day-21 实际重现神经元是可做到的吗? Feed-Forward Neural Network Building

>>:  DAY24 - 现有的专案可以升级的地方(梦)

Advanced Customization

SuiteFlow SuiteFlow 可以用来客制化不同的工作流程(workflow). Work...

[Day14] 引入 crate

我原本预想是在 15 或 16 号开始进入专案实做,结果超进度了。 不过,差距不大,所以没什麽关系。...

认识CSS(七):CSS list-style

CSS list-style 是提供网页调整列表清单中更多的显示功能,之前提到的HTML表单里有传统...

DAY5 Python基础教学(二)

DAY5 Python基础教学-List 前言 List结构非常重要,它跟C语言中的array很像,...