在K8S部署一个单实例MySql数据库实际上是非常简单的,只需要编写相应的Deployment和Service就可以了。
Service
---
apiVersion: v1
kind: Service
metadata:
annotations: {}
name: mysql
namespace: default
spec:
ports:
- nodePort: 31000
port: 3306
protocol: TCP
targetPort: 3306
selector:
app: mysql
sessionAffinity: None
type: NodePort
注意这里设置了NodePort来暴露给公网环境访问数据库,主要是因为我个人使用方便开发,如果是纯内网使用的话就不用设置NodePort了,记住数据库访问不要用Ingress代理。
Deployment
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: mysql-pass
image: 'mysql:5.6'
imagePullPolicy: IfNotPresent
name: mysql
ports:
- containerPort: 3306
name: mysql-container
protocol: TCP
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-pvc
restartPolicy: Always
volumes:
- name: mysql-pvc
persistentVolumeClaim:
claimName: mysql-pvc
这里有两个需要注意的点,一是Mysql是需要数据持久化的,需要挂载Volume,这里为其分配了一个名为mysql-pvc的pvc,其次是mysql的root密码写在了Secret里面,这里将Secret的值挂载到了容器的环境变量内,下面我们来定义pvc和Secret。
PersistentVolumeClaim
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: nfs
这里定义了一个5G的pvc,设置了存储类为NFS以实现动态分配,如果你没有配置存储类可能需要手动定义一个pv来为其分配空间,存储类的定义和使用方式请参考这篇文章。
Secret
---
apiVersion: v1
data:
password: c2xxxxxxxxx==
kind: Secret
metadata:
name: mysql-pass
namespace: default
type: Opaque
在此定义了一个类型为 Opaque 的Secret,注意名字要和前面引用该Secret的地方保持一致,data下的password字段是密码的base64编码。
部署MySql
最后使用kubectl create -f命令将以上yaml资源全都部署好就可以了,之后可以访问你集群节点的ip+刚才NodePort定义的端口号就可以连接mysql数据库了,如果你使用的是云服务器,可能需要注意开启一下安全组端口放行。