• Post author:
  • Post category:运维
  • Post comments:0评论
  • Reading time:2 mins read

在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数据库了,如果你使用的是云服务器,可能需要注意开启一下安全组端口放行。

葫芦

葫芦,诞生于1992年8月11日,游戏宅,胶佬,爱好摸鱼,一个干过超市收银,工地里搬过砖,当过广告印刷狗,做过电焊铁艺的现役.Net程序员。

发表回复