环境主节点:172.19.2.50

从节点:

172.19.2.51

172.19.2.140

部署完成后通过各节点的30336端口访问mysql账号root,密码abcd1234

如:

mysql -h 172.19.2.50 -P 30336 -uroot -pabcd1234

部署完成后通过galera可以让集群3个节点间的数据一致

容器内访问mysql时,可以通过所有k8s节点的30336端口访问,也可以使用k8s服务中的内部入口访问,如mysql.mysql:3306,dns会自动解析mysql.mysql到对应的服务集群

一、在主节点创建目录mkdir -pv /mysql_data/datadir-mariadb-0

mkdir -pv /mysql_data/datadir-mariadb-1

mkdir -pv /mysql_data/datadir-mariadb-2

二、修改部署文件cd /opt/kubernetes-mysql-cluster

命名空间部署文件vim 00namespace.yml

---

apiVersion: v1

kind: Namespace

metadata:

name: mysql

pvc部署文件vim 10pvc.yml

---

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

name: mysql-mariadb-0

namespace: mysql

spec:

accessModes:

- ReadWriteOnce#这里为pvc的访问模式

resources:

requests:

storage: 10Gi#这里调整要挂载的pvc大小

selector:

matchLabels:#这里要和pv的标签对应

app: mariadb

podindex: "0"

---

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

name: mysql-mariadb-1

namespace: mysql

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 10Gi

selector:

matchLabels:

app: mariadb

podindex: "1"

---

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

name: mysql-mariadb-2

namespace: mysql

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 10Gi

selector:

matchLabels:

app: mariadb

podindex: "2"

mariadb服务文件vim 20mariadb-service.yml

# the "Headless Service, used to control the network domain"

---

apiVersion: v1

kind: Service

metadata:

name: mariadb

namespace: mysql

spec:

clusterIP: None

selector:

app: mariadb

ports:

- port: 3306

name: mysql

- port: 4444

name: sst

- port: 4567

name: replication

- protocol: UDP

port: 4567

name: replicationudp

- port: 4568

name: ist

mysql服务文件vim 30mysql-service.yml

---

apiVersion: v1

kind: Service

metadata:

name: mysql

namespace: mysql

spec:

ports:

- port: 3306

name: mysql

targetPort: 3306

nodePort: 30336#这里为porxy映射端口

selector:

app: mariadb

type: NodePort

载入配置文件vim 40configmap.sh

#!/bin/bash

DIR=`dirname "$BASH_SOURCE"`

kubectl create configmap "conf-d" --from-file="$DIR/conf-d/" --namespace=mysql

输入mysql初始密码文件vim 41secret.sh

#!/bin/bash

echo -n Please enter mysql root password for upload to k8s secret:

read -s rootpw

echo

kubectl create secret generic mysql-secret --namespace=mysql --from-literal=rootpw=$rootpw

部署有状态集群文件vim 50mariadb.yml

apiVersion: apps/v1beta1

kind: StatefulSet

metadata:

name: mariadb

namespace: mysql

spec:

serviceName: "mariadb"

replicas: 1#这里是要启动的节点的数量

template:

metadata:

labels:

app: mariadb

spec:

terminationGracePeriodSeconds: 10

containers:

- name: mariadb

image: mariadb:10.1.22#这里修改使用的镜像文件

ports:

- containerPort: 3306

name: mysql

- containerPort: 4444

name: sst

- containerPort: 4567

name: replication

- containerPort: 4567

protocol: UDP

name: replicationudp

- containerPort: 4568

name: ist

env:

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

name: mysql-secret

key: rootpw

- name: MYSQL_INITDB_SKIP_TZINFO

value: "yes"

args:

- --character-set-server=utf8mb4

- --collation-server=utf8mb4_unicode_ci

# Remove after first replicas=1 create

- --wsrep-new-cluster#这里在执行的时候代表会创建新集群,新增节点的时候要注释掉

volumeMounts:

- name: mysql

mountPath: /var/lib/mysql

- name: conf

mountPath: /etc/mysql/conf.d

- name: initdb

mountPath: /docker-entrypoint-initdb.d

volumes:

- name: conf

configMap:

name: conf-d

- name: initdb

emptyDir: {}

volumeClaimTemplates:

- metadata:

name: mysql

spec:

accessModes: [ "ReadWriteOnce" ]

resources:

requests:

storage: 10Gi

调整集群节点到3个的文件vim 70unbootstrap.sh

#!/bin/bash

DIR=`dirname "$BASH_SOURCE"`

set -e

set -x

cp "$DIR/50mariadb.yml" "$DIR/50mariadb.yml.unbootstrap.yml"

sed -i 's/replicas: 1/replicas: 3/' "$DIR/50mariadb.yml.unbootstrap.yml"

sed -i 's/- --wsrep-new-cluster/#- --wsrep-new-cluster/' "$DIR/50mariadb.yml.unbootstrap.yml"

kubectl apply -f "$DIR/50mariadb.yml.unbootstrap.yml"

rm "$DIR/50mariadb.yml.unbootstrap.yml"

创建目录mkdir -pv bootstrap conf-d

创建pv脚本vim bootstrap/pv.sh

#!/bin/bash

echo "Note that in for example GKE a PetSet will have PersistentVolume(s) and PersistentVolumeClaim(s) created for it automatically"

dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"

path="$dir/data"

echo "Please enter a path where to store data during local testing: ($path)"

read newpath

[ -n "$newpath" ] && path=$newpath

cat bootstrap/pv-template.yml | sed "s|/tmp/k8s-data|$path|" | kubectl create -f -

创建挂载pv文件vim bootstrap/pv-template.yml

---

apiVersion: v1

kind: PersistentVolume

metadata:

name: datadir-mariadb-0

labels:#这里的标签要和pvc的matchLabels对应

app: mariadb

podindex: "0"

spec:

accessModes:

- ReadWriteOnce#这里是pv的访问模式,必须要与pvc相同

capacity:

storage: 10Gi#这里是要创建的pv的大小

hostPath:

path: /mysql_data/datadir-mariadb-0#这里为挂载到本地的路径

---

apiVersion: v1

kind: PersistentVolume

metadata:

name: datadir-mariadb-1

labels:

app: mariadb

podindex: "1"

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 10Gi

hostPath:

path: /mysql_data/datadir-mariadb-1

---

apiVersion: v1

kind: PersistentVolume

metadata:

name: datadir-mariadb-2

labels:

app: mariadb

podindex: "2"

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 10Gi

hostPath:

path: /mysql_data/datadir-mariadb-2

删除pv脚本vim bootstrap/rm.sh

#!/bin/bash

echo "Note that in for example GKE a PetSet will have PersistentVolume(s) and PersistentVolumeClaim(s) created for it automatically"

dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"

path="$dir/data"

echo "Please enter a path where to store data during local testing: ($path)"

read newpath

[ -n "$newpath" ] && path=$newpath

cat bootstrap/pv-template.yml | sed "s|/tmp/k8s-data|$path|" | kubectl delete -f -

集群同步galera的配置文件vim conf-d/galera.cnf

[server]

[mysqld]

[galera]

wsrep_on=ON

wsrep_provider="/usr/lib/galera/libgalera_smm.so"

wsrep_cluster_address="gcomm://mariadb-0.mariadb,mariadb-1.mariadb,mariadb-2.mariadb"

binlog_format=ROW

default_storage_engine=InnoDB

innodb_autoinc_lock_mode=2

wsrep-sst-method=rsync

bind-address=0.0.0.0

[embedded]

[mariadb]

[mariadb-10.1]

三、在kubernetes上部署mariadb集群

kubernetes所有节点执行docker pull mariadb:10.1.22

主节点执行cd /opt/kubernetes-mysql-cluster

sh bootstrap/pv.sh

kubectl create -f 00namespace.yml

kubectl create -f 10pvc.yml

./40configmap.sh

./41secret.sh

设置数据库root密码为abcd1234

kubectl create -f 20mariadb-service.yml

kubectl create -f 30mysql-service.yml

kubectl create -f 50mariadb.yml

四、增加集群节点至3个./70unbootstrap.sh

五、清理kubernetes上的mysql集群

主节点上执行cd /opt/kubernetes-mysql-cluster

kubectl delete -f ./

sh bootstrap/rm.sh

所有节点执行rm -rf /mysql_data/datadir-mariadb-0/*

rm -rf /mysql_data/datadir-mariadb-1/*

rm -rf /mysql_data/datadir-mariadb-2/*

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐