【问题标题】:Can't connect to mysql in kubernetes无法连接到 kubernetes 中的 mysql
【发布时间】:2021-06-25 00:47:48
【问题描述】:

我在 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 db,并且一些脚本也在 docker 映像中运行。

【问题讨论】:

  • 服务名称为mysql-service。你是说kubernetes里面的app不能访问这个?还是那个mysql抛出连接错误?如果要在本地使用minikube expose 访问 minikube 服务,则需要公开它。您在应用中使用的是什么主机?
  • 原来我发生了一个我之前没有注意到的错误。不过感谢您的建议。

标签: mysql kubernetes


【解决方案1】:

Mysql一定没有启动,通过查看日志确认。 kubectl get pods | grep mysql; kubectl logs -f $POD_ID。请记住,您必须指定环境变量 MYSQL_DATABASEMYSQL_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

【讨论】:

    【解决方案2】:

    好的,我想通了。查看日志后,我注意到错误Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)

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

    重建映像后,一切都开始工作了。谢谢各位。

    【讨论】:

      【解决方案3】:

      以为我正确连接到我的数据库服务器,但我错了。我的数据库部署是在线的(用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
      

      【讨论】:

        猜你喜欢
        • 2020-10-14
        • 1970-01-01
        • 2021-11-24
        • 2021-05-19
        • 2021-03-01
        • 2019-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多