有状态服务一般数据需要永久保存,先创建动态存储卷(这里存储使用nfs)

rabc文件

(base)[root nlp-test-server-no~]#cat nfs-rbac.yaml

apiVersion:v1

kind:ServiceAccount

metadata:

name:nfs-client-provisioner

namespace:default

---

kind:ClusterRole

apiVersion:rbac.authorization.k8s.io/v1

metadata:

name:nfs-client-provisioner-runner

rules:

-apiGroups:[""]

resources:["persistentvolumes"]

verbs:["get","list","watch","create","delete"]

-apiGroups:[""]

resources:["persistentvolumeclaims"]

verbs:["get","list","watch","update"]

-apiGroups:["storage.k8s.io"]

resources:["storageclasses"]

verbs:["get","list","watch"]

-apiGroups:[""]

resources:["events"]

verbs:["list","watch","create","update","patch"]

-apiGroups:[""]

resources:["endpoints"]

verbs:["create","delete","get","list","watch","patch","update"]

---

kind:ClusterRoleBinding

apiVersion:rbac.authorization.k8s.io/v1

metadata:

name:run-nfs-client-provisioner

subjects:

-kind:ServiceAccount

name:nfs-client-provisioner

namespace:default

roleRef:

kind:ClusterRole

name:nfs-client-provisioner-runner

apiGroup:rbac.authorization.k8s.io

StorageClass文件

(base)[root nlp-test-server-no~]#cat nfs-storageclass.yaml

apiVersion:storage.k8s.io/v1

kind:StorageClass

metadata:

name:course-nfs-storage

namespace:default

provisioner:fuseim.pri/ifs

nfs-provisioner文件

(base)[root nlp-test-server-no~]#cat nfs-provisioner.yaml

kind:Deployment

apiVersion:extensions/v1beta1

metadata:

name:nfs-client-provisioner

namespace:default

spec:

replicas:1

strategy:

type:Recreate

template:

metadata:

labels:

app:nfs-client-provisioner

spec:

serviceAccountName:nfs-client-provisioner

containers:

-name:nfs-client-provisioner

image:quay.io/external_storage/nfs-client-provisioner:latest

volumeMounts:

-name:nfs-client-root

mountPath:/persistentvolumes

env:

-name:PROVISIONER_NAME

value:fuseim.pri/ifs

-name:NFS_SERVER

value:172.31.243.224#这里写nfs服务器地址

-name:NFS_PATH

value:/home/k8s/data#nfs共享目录

volumes:

-name:nfs-client-root

nfs:

server:172.31.243.224#这里写nfs服务器地址

path:/home/k8s/data#nfs共享目录

至此动态存储卷创建好了,开始部署mysql集群

StatefulSet文件

(base)[root nlp-test-server-no~]#cat mysql.yaml

apiVersion:apps/v1

kind:StatefulSet

metadata:

name:mysql

namespace:default

spec:

selector:

matchLabels:

app:mysql

serviceName:mysql

replicas:3

template:

metadata:

labels:

app:mysql

spec:

initContainers:

-name:init-mysql

image:mysql:5.7

command:

-bash

-"-c"

-|

set-ex

#Generate mysql server-id from pod ordinal index.

[[`hostname`=~-([0-9]+)$]]||exit 1

ordinal=${BASH_REMATCH[1]}

echo[mysqld]>/mnt/conf.d/server-id.cnf

#Add an offset to avoid reserved server-id=0 value.

echo server-id=$((100+$ordinal))>>/mnt/conf.d/server-id.cnf

#Copy appropriate conf.d files from config-map to emptyDir.

if[[$ordinal-eq 0]];then

cp/mnt/config-map/master.cnf/mnt/conf.d/

else

cp/mnt/config-map/slave.cnf/mnt/conf.d/

fi

volumeMounts:

-name:conf

mountPath:/mnt/conf.d

-name:config-map

mountPath:/mnt/config-map

-name:clone-mysql

image:ist0ne/xtrabackup:1.0

command:

-bash

-"-c"

-|

set-ex

#Skip the clone if data already exists.

[[-d/var/lib/mysql/mysql]]&&exit 0

#Skip the clone on master(ordinal index 0).

[[`hostname`=~-([0-9]+)$]]||exit 1

ordinal=${BASH_REMATCH[1]}

[[$ordinal-eq 0]]&&exit 0

#Clone data from previous peer.

ncat--recv-only mysql-$(($ordinal-1)).mysql 3307|xbstream-x-C/var/lib/mysql

#Prepare the backup.

xtrabackup--prepare--target-dir=/var/lib/mysql

volumeMounts:

-name:data

mountPath:/var/lib/mysql

subPath:mysql

-name:conf

mountPath:/etc/mysql/conf.d

containers:

-name:mysql

image:mysql:5.7

env:

-name:MYSQL_ALLOW_EMPTY_PASSWORD

value:"1"

ports:

-name:mysql

containerPort:3306

volumeMounts:

-name:data

mountPath:/var/lib/mysql

subPath:mysql

-name:conf

mountPath:/etc/mysql/conf.d

resources:

requests:

cpu:500m

memory:1Gi

livenessProbe:

exec:

command:["mysqladmin","ping"]

initialDelaySeconds:30

periodSeconds:10

timeoutSeconds:5

readinessProbe:

exec:

#Check we can execute queries over TCP(skip-networking is off).

command:["mysql","-h","127.0.0.1","-e","SELECT 1"]

initialDelaySeconds:5

periodSeconds:2

timeoutSeconds:1

-name:xtrabackup

image:ist0ne/xtrabackup:1.0

ports:

-name:xtrabackup

containerPort:3307

command:

-bash

-"-c"

-|

set-ex

cd/var/lib/mysql

#Determine binlog position of cloned data,if any.

if[[-f xtrabackup_slave_info&&"x$(<xtrabackup_slave_info)"!="x"]];then

#XtraBackup already generated a partial"CHANGE MASTER TO"query

#because we're cloning from an existing slave.(Need to remove the tailing semicolon!)

cat xtrabackup_slave_info|sed-E's/;$//g'>change_master_to.sql.in

#Ignore xtrabackup_binlog_info in this case(it's useless).

rm-f xtrabackup_slave_info xtrabackup_binlog_info

elif[[-f xtrabackup_binlog_info]];then

#We're cloning directly from master.Parse binlog position.

[[`cat xtrabackup_binlog_info`=~^(.*?)[[:space:]]+(.*?)$]]||exit 1

rm-f xtrabackup_binlog_info xtrabackup_slave_info

echo"CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',

MASTER_LOG_POS=${BASH_REMATCH[2]}">change_master_to.sql.in

fi

#Check if we need to complete a clone by starting replication.

if[[-f change_master_to.sql.in]];then

echo"Waiting for mysqld to be ready(accepting connections)"

until mysql-h 127.0.0.1-e"SELECT 1";do sleep 1;done

echo"Initializing replication from clone position"

mysql-h 127.0.0.1

-e"$(<change_master_to.sql.in),

MASTER_HOST='mysql-0.mysql',

MASTER_USER='root',

MASTER_PASSWORD='',

MASTER_CONNECT_RETRY=10;

START SLAVE;"||exit 1

#In case of container restart,attempt this at-most-once.

mv change_master_to.sql.in change_master_to.sql.orig

fi

#Start a server to send backups when requested by peers.

exec ncat--listen--keep-open--send-3307-c

"xtrabackup--backup--slave-info--stream=xbstream--host=127.0.0.1--user=root"

volumeMounts:

-name:data

mountPath:/var/lib/mysql

subPath:mysql

-name:conf

mountPath:/etc/mysql/conf.d

resources:

requests:

cpu:100m

memory:100Mi

volumes:

-name:conf

emptyDir:{}

-name:config-map

configMap:

name:mysql

volumeClaimTemplates:

-metadata:

name:data

namespace:default

annotations:

volume.beta.kubernetes.io/storage-class:"course-nfs-storage"

spec:

accessModes:["ReadWriteOnce"]

resources:

requests:

storage:1Gi

server文件

(base)[root nlp-test-server-no~]#cat mysql_server.yaml

#Headless service for stable DNS entries of StatefulSet members.

apiVersion:v1

kind:Service

metadata:

name:mysql

namespace:default

labels:

app:mysql

spec:

ports:

-name:mysql

port:3306

clusterIP:None

selector:

app:mysql

---

#Client service for connecting to any MySQL instance for reads.

#For writes,you must instead connect to the master:mysql-0.mysql.

apiVersion:v1

kind:Service

metadata:

name:mysql-read

namespace:default

labels:

app:mysql

spec:

ports:

-name:mysql

port:3306

selector:

app:mysql

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐