K8S自己动手系列 - 2.3 - PV & PVC
前言
在实验2.2 – Deployment中,我们将原来基于Pod部署的wordpress+mysql成功改造成基于Deployment部署,基于Deployment部署有很多好处,例如:支持滚动升级(Rolling Update),支持水平扩展。
不过有个问题,就是当我们的Deployment修改了,或者Pod删除重建了,数据也随之丢失了,这是我们不希望看到的,本篇文章我们就来尝试一下基于PV & PVC保存数据状态的有状态应用。
场景
对于单实例的有状态应用,我们可以定义Deployment并且replicas只能为1,用指定PVC的方式关联到一个PV上,使用PV提供的状态存储功能。如果要启动多实例,那么Deployment就无法胜任这个任务,必须使用到我们后面会讲到的StatefulSet+PVC Template的方式创建多实例对多PVC的模型。
本文实验所有的源码保存在:
https://github.com/zrbcool/blog-public/tree/master/k8s-hands-on/lab06
实战
PVC定义
lab06 git:(master) cat 03-wordpress-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wordpress-pv-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi
部署后查看状态
lab06 git:(master) kubectl apply -f 03-wordpress-pvc.yaml persistentvolumeclaim/wordpress-pv-claim created lab06 git:(master) kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-mysql-pv-claim Pending 4s
发现PVC处于Pending状态,追查下原因
lab06 git:(master) kubectl describe pvc/wordpress-mysql-pv-claim Name: wordpress-mysql-pv-claim Namespace: default StorageClass: Status: Pending Volume: Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"wordpress-mysql-pv-claim","namespace":"default"},"s... Finalizers: [kubernetes.io/pvc-protection] Capacity: Access Modes: VolumeMode: Filesystem Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal FailedBinding 6s (x4 over 36s) persistentvolume-controller no persistent volumes available for this claim and no storage class is set Mounted By: <none>
接下来我们创建PV
PV定义
查看定义
lab06 git:(master) cat 04-wordpress-pv.yaml kind: PersistentVolume apiVersion: v1 metadata: name: wordpress-mysql-pv-volume labels: type: local spec: capacity: storage: 2Gi accessModes: - ReadWriteOnce hostPath: path: "/data/pv/wordpress/mysql"
该pv定义是基于hostPath的方式,所以我们要在节点上提前创建好目录,如下:
lab06 git:(master) mkdir -p /data/pv/wordpress/mysql lab06 git:(master) kubectl create -f 04-wordpress-pv.yaml persistentvolume/wordpress-mysql-pv-volume created lab06 git:(master) kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE wordpress-mysql-pv-volume 2Gi RWO Retain Bound default/wordpress-mysql-pv-claim 31s lab06 git:(master) kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE wordpress-mysql-pv-claim Bound wordpress-mysql-pv-volume 2Gi RWO 118s
此时我们之前定义的pvc也已经成功绑定了
使Deployment使用该PVC
查看定义
lab06 git:(master) cat 01-wordpress-mysql-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: wordpress name: wordpress spec: replicas: 1 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - image: wordpress:latest imagePullPolicy: IfNotPresent name: wordpress env: - name: WORDPRESS_DB_HOST value: "127.0.0.1" - name: WORDPRESS_DB_USER value: "root" - name: WORDPRESS_DB_PASSWORD value: "passw0rd" - image: mysql:5.7.26 imagePullPolicy: IfNotPresent name: mysql env: - name: MYSQL_ROOT_PASSWORD value: "passw0rd" - name: MYSQL_DATABASE value: "wordpress" volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: wordpress-mysql-pv-claim
执行更新并查看效果
lab06 git:(master) kubectl apply -f 01-wordpress-mysql-deployment.yaml deployment.extensions/wordpress configured lab06 git:(master) kubectl get pod NAME READY STATUS RESTARTS AGE wordpress-6cfd879fcd-9mlhb 2/2 Running 0 29s lab06 git:(master) ls -l /data/pv/wordpress/mysql/ total 188480 -rw-r----- 1 999 999 56 Jun 10 23:42 auto.cnf -rw------- 1 999 999 1675 Jun 10 23:42 ca-key.pem -rw-r--r-- 1 999 999 1107 Jun 10 23:42 ca.pem ... drwxr-x--- 2 999 999 12288 Jun 10 23:42 sys drwxr-x--- 2 999 999 4096 Jun 10 23:42 wordpress
可见,Pod已经在/data/pv/wordpress/mysql/下产生数据了,接下来我们来试一下配置数据后,删除Pod,使Deployment控制Pod重建,配置数据是否能够保存
通过下面命令删除Pod使其重建
lab06 git:(master) kubectl get pod NAME READY STATUS RESTARTS AGE wordpress-6cfd879fcd-9mlhb 2/2 Running 0 7m34s lab06 git:(master) kubectl delete pod/wordpress-6cfd879fcd-9mlhb pod "wordpress-6cfd879fcd-9mlhb" deleted lab06 git:(master) kubectl get pod NAME READY STATUS RESTARTS AGE wordpress-6cfd879fcd-29qg9 2/2 Running 1 11s
刷新网页,发布的测试文件还在,测试成功
新问题
查看官网说明:
意思是说,对于这个单实例的有状态Deployment不要对其进行扩容,同时当Deployment定义发生更新时也不能使用滚动更新,而应该先删除再创建,也就是strategy: type: Recreate
修改后的文件如下:
lab06 git:(master) cat 01-wordpress-mysql-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: wordpress name: wordpress spec: strategy: type: Recreate replicas: 1 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - image: wordpress:latest imagePullPolicy: IfNotPresent name: wordpress env: - name: WORDPRESS_DB_HOST value: "127.0.0.1" - name: WORDPRESS_DB_USER value: "root" - name: WORDPRESS_DB_PASSWORD value: "passw0rd" - image: mysql:5.7.26 imagePullPolicy: IfNotPresent name: mysql env: - name: MYSQL_ROOT_PASSWORD value: "passw0rd" - name: MYSQL_DATABASE value: "wordpress" volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: wordpress-mysql-pv-claim
清除数据
lab06 git:(master) kubectl delete -f . deployment.extensions "wordpress" deleted service "wordpress-svc" deleted persistentvolumeclaim "wordpress-mysql-pv-claim" deleted persistentvolume "wordpress-mysql-pv-volume" deleted
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
KubeCon: Flink on K8s
目录 集群概况 玩转Flink on Kubernetes WindowJoin SQL 集群概况 BigData Manager简介 BigData on Kubernetes 部署向导 运维管理 开发者IDE 玩转Flink on Kubernetes WindowJoin 简介 Example illustrating a windowed stream join between two data streams.The example works on two input streams with pairs (name, grade) and (name, salary) respectively. It joins the steams based on "name" within a configurable window. The example uses a built-in sample data generator that generates the steams of pairs at a configurable rate. Source1:name, gr...
- 下一篇
K8S自己动手系列 - 2.4 - Service
前言 上个实验2.3 – PV & PVC,我们将wordpress+mysql的Deployment绑定PVC,并成功将mysql的数据保存才PV存储卷上。但是mysql作为数据库应用,当水平扩展后,就是多个独立的数据库实例,数据彼此分离,导致应用在多个实例间的状态不一致,那么这个问题如何解决呢? 答案就是将mysql与wordpress进行分离,我们把wordpress看做一个支持水平扩展的无状态应用,多个wordpress连接同一个mysql数据库。 那么wordpress又如何找到对应的mysql数据库呢?答案就是通过Service 场景 将wordpress与mysql分离成两个Deployment,并为mysql定义Service,wordpress通过ServiceName发现mysql的实例信息,mysql的Deployment使用PVC保存数据状态,完成后wordpress可以水平扩展为多个实例,并且能够保证数据一致性 本文实验所有的源码保存在:https://github.com/zrbcool/blog-public/tree/master/k8s-han...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题