Kubernetes部署MySQL

文章来源:一氧化碳中毒   发布时间:2021-6-3 15:16:51   点击数:
  北京比较好白癜风专科 http://yyk.39.net/bj/zhuanke/89ac7.html

一般情况下Kubernetes可以通过ReplicaSet以一个Pod模板创建多个pod副本,但是它们都是无状态的,任何时候它们都可以被一个全新的pod替换。然而有状态的pod需要另外的方案确保当一个有状态的pod挂掉后,这个pod实例需要在别的节点上重建,但是新的实例必须与被替换的实例拥有相同的名称、网络标识和状态。这就是Statefulset管理pod的手段。

对于容器集群,有状态服务的挑战在于,通常集群中的任何节点都并非%可靠的,服务所需的资源也会动态地更新改变。当节点由于故障或服务由于需要更多的资源而无法继续运行在原有节点上时,集群管理系统会为该服务重新分配一个新的运行位置,从而确保从整体上看,集群对外的服务不会中断。若采用本地存储,当服务漂移后数据并不会随着服务转移到新的节点,重启服务就会出现数据丢失的困境。

本文目的是通过一个mysql的主从集群搭建,深入了解kubernetes的statfulset管理。为了降低实验的外部依赖,存储层面上,我采用的是本地存储,当然生产上不建议这样做,生产环境的存储推荐官方介绍到的的gce、nfs、ceph等存储方案,因为这些方案支持动态供给的特性,允许开发人员通过pvc的定义,快速实现数据有效存储,所以你绝不应该把一个宿主机上的目录当作PV使用,只是本文用于实验需要,采用LocalPersistentVolume的手段,目的只是为了验证Statefulset的状态管理功能。

实验环境kubernetesMasterkubernetesNode(测试演示,所有的副本都会在其上运行)kubernetesDNS服务已开启实验目的搭建一个主从复制(Master-Slave)的MySQL集群从节点可以水平扩展所有的写操作只能在主节点上执行读操作可以在主从节点上执行从节点能同步主节点的数据本地存储原理

为了快速搭建测试环境,我们这里使用了本地存储,也就是说,用户希望Kubernetes能够直接使用宿主机上的本地磁盘目录,而不依赖于远程存储服务,来提供持久化的容器Volume。不过这里有个难点:

我们把存储固定在一个节点上,但是pod在调度的时候,是飘来飘去的,怎么能让pod通过pvc也能固定在pv上?

给这个Pod加上一个nodeAffinity行不行?

当然行,但是这变相破坏了开发人员对资源对象的定义规范了,开发人员应该不需要时刻考虑调度的细节。调度的改动应该交给运维就行。所以我们为了实现本地存储,我们采用了延迟绑定的方法。方法很简单,我们都知道storageclass一般由运维人员设计,我们只需要在storageclass指定no-provisioner。这是因为LocalPersistentVolume目前尚不支持DynamicProvisioning,所以它没办法在用户创建PVC的时候,就自动创建出对应的PV。与此同时,这个StorageClass还定义了一个volumeBindingMode=WaitForFirstConsumer的属性。它是LocalPersistentVolume里一个非常重要的特性,即:延迟绑定

kind:StorageClassapiVersion:storage.k8s.io/v1metadata:name:local-storageprovisioner:kubernetes.io/no-provisionervolumeBindingMode:WaitForFirstConsumer实验步骤一、先在node(实验用的node节点IP是.31..51)节点上,预先分配几个pv(不建议在生产上这样操作)

01-persistentVolume-1.yaml

apiVersion:v1kind:PersistentVolumemetadata:name:example-mysql-pvspec:capacity:storage:15GivolumeMode:FilesystemaccessModes:-ReadWriteOncepersistentVolumeReclaimPolicy:DeletestorageClassName:local-storagelocal:path:/data/svr/projects/mysqlnodeAffinity:required:nodeSelectorTerms:-matchExpressions:-key:kubernetes.io/hostnameoperator:Invalues:-.31..51

01-persistentVolume-2.yaml

apiVersion:v1kind:PersistentVolumemetadata:name:example-mysql-pv-2spec:capacity:storage:15GivolumeMode:FilesystemaccessModes:-ReadWriteOncepersistentVolumeReclaimPolicy:DeletestorageClassName:local-storagelocal:path:/data/svr/projects/mysql2nodeAffinity:required:nodeSelectorTerms:-matchExpressions:-key:kubernetes.io/hostnameoperator:Invalues:-.31..51

01-persistentVolume-3.yaml

apiVersion:v1kind:PersistentVolumemetadata:name:example-mysql-pv-3spec:capacity:storage:15GivolumeMode:FilesystemaccessModes:-ReadWriteOncepersistentVolumeReclaimPolicy:DeletestorageClassName:local-storagelocal:path:/data/svr/projects/mysql3nodeAffinity:required:nodeSelectorTerms:-matchExpressions:-key:kubernetes.io/hostnameoperator:Invalues:-.31..51

记住,这是在生产上不推荐的做法,我只是实验用途才这样手动预先创建,正规的做法应该通过storageclass采用DynamicProvisioning,而不是StaticProvisioning机制生产PV。

kubectlapply-f01-persistentVolume-{1..3}.yamlpersistentvolume/example-mysql-pv1createdpersistentvolume/example-mysql-pv2createdpersistentvolume/example-mysql-pv3created二、创建StorageClass

02-storageclass.yaml

kind:StorageClassapiVersion:storage.k8s.io/v1metadata:name:local-storageprovisioner:kubernetes.io/no-provisionervolumeBindingMode:WaitForFirstConsumer

执行创建

kubectlapply-f02-storageclass.yamlstorageclass.storage.k8s.io/local-storagecreated三、创建Namespace

03-mysql-namespace.yaml

apiVersion:v1kind:Namespacemetadata:name:mysqllabels:app:mysql

执行创建

kubectlapply-f03-mysql-namespace.yamlnamespace/mysqlcreated四、使用ConfigMap为Master/Slave节点分配不同的配置文件

04-mysql-configmap.yaml

apiVersion:v1kind:ConfigMapmetadata:name:mysqlnamespace:mysqllabels:app:mysqldata:master.cnf:

#Master配置[mysqld]log-bin=mysqllogskip-name-resolveslave.cnf:

#Slave配置[mysqld]super-read-onlyskip-name-resolvelog-bin=mysql-binreplicate-ignore-db=mysql

创建执行

kubectlapply-f04-mysql-configmap.yamlconfigmap/mysqlcreated五、创建mysql密码Secret

05-mysql-secret.yaml

apiVersion:v1kind:Secretmetadata:name:mysql-secretnamespace:mysqllabels:app:mysqltype:Opaquedata:password:MTIzNDU2#echo-n""

base64

创建执行

kubectlapply-f05-mysql-secret.yamlsecret/mysql-secretcreated六、使用Service为MySQL提供读写分离

06-mysql-services.yaml

apiVersion:v1kind:Servicemetadata:name:mysqlnamespace:mysqllabels:app:mysqlspec:ports:-name:mysqlport:clusterIP:Noneselector:app:mysql---apiVersion:v1kind:Servicemetadata:name:mysql-readnamespace:mysqllabels:app:mysqlspec:ports:-name:mysqlport:selector:app:mysql

用户所有写请求,必须以DNS记录的方式直接访问到Master节点,也就是mysql-0.mysql这条DNS记录。

用户所有读请求,必须访问自动分配的DNS记录可以被转发到任意一个Master或Slave节点上,也就是mysql-read这条DNS记录

kubectlapply-f06-mysql-services.yamlkubectlgetsvc-nmysqlNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEmysqlClusterIPNonenone/TCP20smysql-readClusterIP10.0.0.63none/TCP20s七、使用StatefulSet搭建MySQL主从集群

07-mysql-statefulset.yaml

apiVersion:apps/v1kind:StatefulSetmetadata:name:mysqlnamespace:mysqllabels:app:mysqlspec:selector:matchLabels:app:mysqlserviceName:mysqlreplicas:2template:metadata:labels:app:mysqlspec:initContainers:-name:init-mysqlimage:mysql:5.7env:-name:MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name:mysql-secretkey:password

转载请注明:http://www.lwblm.com/bytj/11979.html
  • 上一篇文章:
  • 下一篇文章: