howie6879 / howie6879.github.io

努力就好
https://www.howie6879.com/
9 stars 0 forks source link

03.容器持久化存储 | Kubernetes 学习之路 #80

Open howie6879 opened 3 years ago

howie6879 commented 3 years ago

https://www.howie6879.cn/k8s/docs/01_basic/03.%E5%AE%B9%E5%99%A8%E6%8C%81%E4%B9%85%E5%8C%96%E5%AD%98%E5%82%A8/

容器持久化存储 # 容器的本质是进程,对于进程,Linux系统有进程组的概念来将其组织在一起。在k8s里面,使用Pod这个逻辑概念来维护容器间的关系。 有了Pod后,我们的应用程序需要被创建和管理,这就引出了ReplicaSet和Deployment;然后需要将部署好的应用暴露给外部进行访问,Service可以提供一个固定的ip和端口让外部访问。 对于有状态的应用,可以使用StatefulSet来进行状态的恢复,在上一节概念介绍里面有提到,有状态的应用是离不开持久化存储的。 引子 # 在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: {}。 启动来感受一下: