无法连接到Kubernetes中的mysql

时间:2019-10-19 21:36:59

标签: mysql kubernetes

我已经在kubernetes中部署了mysql数据库,并通过服务公开了该数据库。当我的应用程序尝试连接到该数据库时,它一直被拒绝。当我尝试在本地访问它时,我也会得到相同的信息。 Kubernetes节点在minikube中运行。

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort
  selector:
    app: mysql
  ports:
  - port: 3306
    protocol: TCP
    targetPort: 3306
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql_db
        imagePullPolicy: Never
        ports:
        - containerPort: 3306
        volumeMounts:
        - name:  mysql-persistent-storage
          mountPath:  "/var/lib/mysql"
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

这是我用于持久存储的Yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec: 
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/Users/Work/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

此后,我通过运行minikube service list来获得此信息:

default              | mysql-service             | http://192.168.99.101:31613 

但是,我既不能从应用程序也不能从本地计算机访问数据库。 我缺少什么或我配置错误了吗?

编辑: 我在这里没有定义任何环境,因为由docker运行的映像已经是一个正在运行的mysql数据库,并且一些脚本也在docker映像内运行。

3 个答案:

答案 0 :(得分:1)

MySQL必须尚未启动,请通过检查日志进行确认。 kubectl get pods | grep mysql; kubectl logs -f $POD_ID。请记住,必须指定环境变量 MYSQL_DATABASE MYSQL_ROOT_PASSWORD 才能启动mysql。如果您不想为root设置密码,则还要指定相应的命令。在这里,我给您一个mysql yaml的示例。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql_db
        imagePullPolicy: Never
        env:
        - name: MYSQL_DATABASE
          value: main_db
        - name: MYSQL_ROOT_PASSWORD
          value: s4cur4p4ss
        ports:
        - containerPort: 3306
        volumeMounts:
        - name:  mysql-persistent-storage
          mountPath:  "/var/lib/mysql"
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

答案 1 :(得分:1)

好,我知道了。浏览日志后,我发现错误Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)

构建时,我必须将此添加到我的docker映像中: RUN usermod -u 1000 mysql

重建图像后,一切开始起作用。谢谢你们。

答案 2 :(得分:0)

认为我正确连接到我的数据库服务器,但我错了。我的数据库部署在线(使用 kubectl exec -it xxxx -- bashmysql -u root --password=$MYSQL_ROOT_PASSWORD 进行测试),但这不是问题。

我犯了一个简单的错误,混淆了我的服务和部署标签。我的数据库服务使用的标签与 Joomla configMap 指定为 MySQL 主机的标签不同。

总而言之,数据库服务 yaml 是

metadata:
  labels:
    app: fnjoomlaopencart-db-service

和需要的 Joomla configMap yaml

data:
  # point to the DB service
  MYSQL_HOST: fnjoomlaopencart-db-service