GKE上でMySQLを実行する

MySQLをサービスで利用したいのですがGCPのCloud SQLを利用するのは高いため、GKE上でMySQLを実行します。MySQLのデータの保存には永続化ボリュームを利用します。

以下、参考になるドキュメントです。

1
2
3
4
5
6
7
8
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- statefulset.yaml
- service.yaml
- myconf.yaml
1
2
3
4
5
6
7
8
9
10
# base/myconf.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cnf
data:
my.cnf: |
[mysqld]
default-authentication-plugin = mysql_native_password
character-set-server=utf8mb4
1
2
3
4
5
6
7
8
9
10
11
12
# base/service.yaml
apiVersion: v1
kind: Service
metadata:
name: cocotola-mysql
spec:
type: ClusterIP
ports:
- port: 3306
selector:
app.kubernetes.io/name: cocotola-mysql
app.kubernetes.io/part-of: cocotola
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# base/statefulset.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cocotola-mysql
labels:
app.kubernetes.io/name: cocotola-mysql
app.kubernetes.io/part-of: cocotola
spec:
serviceName: cocotola-mysql
replicas: 1
selector:
matchLabels:
run: cocotola-mysql
app.kubernetes.io/name: cocotola-mysql
app.kubernetes.io/part-of: cocotola
template:
metadata:
labels:
run: cocotola-mysql
app.kubernetes.io/name: cocotola-mysql
app.kubernetes.io/part-of: cocotola
spec:
containers:
- name: cocotola-mysql
image: mysql:8.0.27
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
subPath: mysql
- name: my-cnf
mountPath: /etc/my.cnf
subPath: my.cnf
readOnly: true
volumes:
- name: my-cnf
configMap:
name: my-cnf
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
1
2
3
4
5
6
7
8
9
10
# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: cocotola

resources:
- ../../base

patchesStrategicMerge:
- statefulset.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
# overlays/production/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cocotola-mysql
spec:
replicas: 1
template:
spec:
containers:
- name: cocotola-mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: mysql
- name: MYSQL_PORT
value: "3306"
- name: MYSQL_USER
value: user
- name: MYSQL_PASSWORD
value: password
- name: MYSQL_DATABASE
value: database

適用コマンド:

1
kustomize build overlays/production | kubectl apply -f -