前言
部署mysql之前我们需要先了解一个概念有状态服务。这是一种特殊的服务,简单的归纳下就是会产生需要持久化的数据,并且有很强的I/O需求,且重启需要依赖上次存储到磁盘的数据。如典型的mysql,kafka,zookeeper等等。
在我们有比较优秀的商业存储的前提下,灰常推荐使用有状态服务进行部署,计算和存储分离那是相当的爽的。在实际生产中如果没有这种存储,才有localPV也是不错的选择,当然local pv其实呢和hostPath是一样的。当然我们在开发测试环境也是可以自己搭建一套简单的如NFS服务,来享受存储和计算分离的爽快感。
kubernetes中定义一种了资源类型Stateful Service即有状态服务,有状态服务需要的持久化数据动态绑定我们可以利用存储的API PersistentVolume(PV)和PersistentVolumeClaim(PVC)来进行需要的相关数据的绑定和存储。
PV & PVC
PV就好比是一个仓库,我们需要先购买一个仓库,即定义一个PV存储服务,例如CEPH,NFS,Local Hostpath等等。PVC就好比租户,pv和pvc是一对一绑定的,挂载到POD中,一个pvc可以被多个pod挂载。大致一个流程如下,可以从这里,以及官网看到更多的额关于PV的细节
创建PV --> 创建PVC --> 绑定 --> 可写入数据
有了这个理解之后,我们接下来实战一下(mysql(pvc)+NFS(PV))
NFS Server
首先我们需要创建一个nfs server。我从hub.docker找到一个nfs-server。下面我们将它部署到kubernetes中。
部署nfs到kubernetes
# nfs-server.yamlapiVersion: v1kind: Servicemetadata: name: nfs-service labels: app: nfs-servicespec: ports: - port: 2049 name: nfs-service clusterIP: 10.96.0.14 selector: app: nfs-service---apiVersion: apps/v1kind: Deploymentmetadata: name: nfs-servicespec: strategy: type: Recreate selector: matchLabels: app: nfs-service template: metadata: labels: app: nfs-service spec: # 采用node选择器 nodeName: node1 containers: - name: nfs-service image: itsthenetwork/nfs-server-alpine:latest imagePullPolicy: IfNotPresent securityContext: privileged: true capabilities: add: - SYS_ADMIN - SETPCAP livenessProbe: tcpSocket: port: 2049 timeoutSeconds: 5 readinessProbe: tcpSocket: port: 2049 timeoutSeconds: 5 ports: - containerPort: 2049 env: - name: SHARED_DIRECTORY value: /nfsshare volumeMounts: - mountPath: /nfssha