环境
主节点: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/*