Create a StatefulSet object in the Kubernetes cluster.
Create a headless service to provide service discovery and load balancing for StatefulSet.
Define three MySQL containers in the StatefulSet and configure them in master-slave replication mode.
Use Kubernetes ConfigMap and Secret to store the configuration information and authentication information of the container.
Check whether the cluster is working properly.
First, create a namespace named mysql
in the Kubernetes cluster:
kubectl create namespace mysql
Then, Create a ConfigMap to store the configuration information of the MySQL container, such as the MySQL configuration file my.cnf
:
apiVersion: v1 kind: ConfigMap metadata: name: mysql-config namespace: mysql data: my.cnf: | [mysqld] server-id=1 log-bin=mysql-bin binlog_format=row innodb_flush_log_at_trx_commit=1
Next, create a Secret to store the authentication information of the MySQL container, such as user name and password :
apiVersion: v1 kind: Secret metadata: name: mysql-secret namespace: mysql type: Opaque data: username: dXNlcm5hbWU= password: cGFzc3dvcmQ=
Among them, username
and password
are the base64-encoded username and password respectively.
Then, create a StatefulSet object to define the configuration and number of copies of the MySQL container:
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql namespace: mysql spec: replicas: 3 serviceName: mysql-headless selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: password volumeMounts: - name: mysql-data mountPath: /var/lib/mysql - name: mysql-config mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf volumes: - name: mysql-data persistentVolumeClaim: claimName: mysql-data - name: mysql-config configMap: name: mysql-config volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi
In the above YAML file, we A StatefulSet object named mysql
is defined, which contains three MySQL containers. Each container has a persistent volume for storing MySQL data and mounts the MySQL configuration file stored by ConfigMap.
Next, we need to create a headless service. This service will not assign ClusterIP, but will create multiple Endpoints. Each Endpoint corresponds to the IP address of a Pod. , can be used to directly access the Pod:
apiVersion: v1 kind: Service metadata: name: mysql-headless namespace: mysql spec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql
Finally, we need to check whether MySQL master-slave replication is working properly. Use the kubectl command line tool to enter the container in Kubernetes and execute the corresponding commands. If you want to go into the pod and connect to the master node of the MySQL container to create the table, you can do this by running the following command:
kubectl exec -it mysql-0 --namespace=mysql -- /bin/bash mysql -u root -p create database testdb; use testdb; create table testtable (id int, name varchar(255)); insert into testtable values (1, 'test'); exit;
The above is the detailed content of How to use statefulset to build a MySQL cluster in kubernetes. For more information, please follow other related articles on the PHP Chinese website!