kubernetes使用StatefulSet部署mysql一主多從
有狀態服務一般資料需要永久儲存,先建立動態儲存卷(這裡儲存使用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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69920894/viewspace-2738147/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在 Kubernetes 中基於 StatefulSet 部署 MySQL(上)MySql
- mysql主從複製(一):一主多從MySql
- kubeadm部署一主兩從的kubernetes叢集
- MySQL主從同步(一主一從、一主多從、主從從)等結構的概述與配置MySql主從同步
- MySQL 配置多主一從 ( 8.0.18 版本 )MySql
- MySQL叢集之 主從複製 主主複製 一主多從 多主一叢 實現方式MySql
- Kubernetes學習筆記(九):StatefulSet--部署有狀態的多副本應用筆記
- docker部署mysql8主從DockerMySql
- Windows Mysql主從複製部署WindowsMySql
- MySQL 5.7 多主一從(多源複製)同步配置MySql
- MySQL 主從配置-之-一主一從MySql
- 【mysql】mysql的資料庫主從(一主一從)MySql資料庫
- kubernetes StatefulSet 中 serviceName 作用
- kubernetes StatefulSet控制器
- mysql主從複製詳細部署MySql
- Mysql MHA部署-02主從複製MySql
- MySQL主從複製環境部署MySql
- MySQL(14)---Docker搭建MySQL主從複製(一主一從)MySqlDocker
- CentOS6.5配置MYSQL一主多從詳解CentOSMySql
- Mysql 一主一從配置MySql
- 10分鐘搞定Mysql主從部署配置MySql
- MySQL 主從複製安裝部署配置MySql
- 12 . Kubernetes之Statefulset 和 Operator
- Mysql實現主從複製(一主雙從)MySql
- 【MySQL(二十二)】一主一從換主MySql
- 使用laradock配置mysql主從同步MySql主從同步
- springboot多資料來源配合docker部署mysql主從實現讀寫分離Spring BootDockerMySql
- kubernetes實踐之四十二:StatefulSet
- Linux下MySQL主從複製(Binlog)的部署過程LinuxMySql
- Linux實現MySql資料庫的主從複製(一主一從)LinuxMySql資料庫
- 記一次 MySQL 主從搭建MySql
- MySql雙主一從服務搭建MySql
- Mysql主從同步實戰(一)【知其然】MySql主從同步
- Redis主從模式部署Redis模式
- Kubernetes部署叢集Mysql服務MySql
- Kubernetes中部署wordpress+mysql(六)MySql
- Kubernetes 實戰——有狀態應用(StatefulSet)
- 如何基於生產環境mysql 5.6.25主從部署新的mysql從庫操作指南MySql