k8s学习之路【03.容器持久化存储】

容器持久化存储

容器的本质是进程,对于进程,Linux系统有进程组的概念来将其组织在一起。在k8s里面,使用Pod这个逻辑概念来维护容器间的关系。

图来自极客时间

有了Pod后,我们的应用程序需要被创建和管理,这就引出了ReplicaSetDeployment;然后需要将部署好的应用暴露给外部进行访问,Service可以提供一个固定的 ip 和端口让外部访问。

对于有状态的应用,可以使用StatefulSet来进行状态的恢复,在上一节概念介绍[1]里面有提到,有状态的应用是离不开持久化存储的。

引子

Docker中,如果一个容器在运行过程中会产生数据并写入到文件系统,当关闭这个容器,用镜像再启动一个容器的时候,你就会意识到新容器并不会识别前一个容器写入文件系统内的任何内容。

对于有状态的应用,我们希望下次启动的应用可以保持住上次的状态;在k8s里面可以通过定义存储卷来满足这个需求,它们不像Pod这样的顶级资源,而是被定义为Pod的一部分,并和Pod共享相同的生命周期。因此在Pod里面容器重新启动期间,卷的内容是不变的,

emptyDir

Pod中如何定义卷?让我们从emptyDir开始。设想一个这样的例子,一个Pod应用由两个容器,容器 A 不断产生数据,容器 B 将 A 产生的数据作为输出。此时,这两个容器就需要使用同一个卷。

让我们实际操作一下,vim fortune-pod.yaml:


apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers:
  - image: luksa/fortune
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

说明一下上述配置文件的含义:fortune镜像是k8s in action书中示例打包的镜像,相当于上面说的不断产生数据的容器 A,其中名为html的容器挂载在var/htdocs中;而nginx也挂载了相同的html卷,不过位置在/usr/share/nginx/html,上面两个容器共用的卷就是emptyDir: {}

启动来感受一下:

kubectl create -f fortune-pod.yaml
# 输出
pod/fortune c
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值