kubernetes-如何将 mysql 服务暴露给另一个 pod?

问题描述 投票:0回答:4

我有一个带有 pv 的 mysql 服务,以及一个自定义 karaf 镜像的部署。

我的 karaf 中有钩子,当我安装 kar liquibase 时应该填充数据库,但我意识到数据库仍然是空的,所以 karaf 无法访问 mysql。

我想在我的机器上访问本地主机。

这是我的 .yaml 配置:

mysql pv:

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

mysql-部署:

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: mysql-root-password
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: mysql-user
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: mysql-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

mysql pass 的秘密:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  mysql-password: cm9vdA==
  mysql-root-password: cm9vdA==
  mysql-user: eGNvcmVyb290

卡拉夫部署:

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: karaf-deployment
spec:
  selector:
    matchLabels:
      app: karaf
  replicas: 1 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: karaf
    spec:
      containers:
      - name: karaf
        image: myuser/karaf:v1

注意:要在本地连接到 mysql,我必须公开这样做:

kubectl expose deployment mysql --type=LoadBalancer --name=my-service

不确定这样是否正确...

我对 karaf 做了同样的事情,添加了

--port=8101
这样我就可以 ssh 到 karaf 并安装 kar...

我尝试了一些在互联网上看到的建议,例如创建一个入口控制器,或者这个:Minikube 将在本地主机上运行的 MySQL 作为服务公开

但没用:(

感谢您的宝贵时间!

mysql kubernetes kubernetes-ingress kubernetes-pod
4个回答
3
投票

在您的 Karaf 应用程序中。连接源 url 是什么? 例如,在 kubernetes 中部署并使用 mysql 服务的 Spring boot 应用程序中,连接源 url 将是:jdbc:mysql://mysqlservice:3306/${DB_NAME}。 其中“mysqlservice”将是 mysql 在 kubernetes 中定义的服务名称


0
投票

您的服务已在 Kubernetes 中向端口

3306
上的其他 Pod 公开。您可以使用
NodePort
类型的服务将 mysql 暴露给主机。

kubectl expose svc/mysql --name mysql-np --port 3306 --type NodePort
kubectl get svc mysql-np -ojsonpath='{.spec.ports[0].nodePort}'

对于数据,您是否会删除并重新创建PV?您共享的配置应该可以工作。


0
投票

当您使用相同的命名空间时,在拥有名为 MySQL 的服务后创建的 pod 将具有名为:

  • MYSQL_SERVICE_HOST
  • MYSQL_SERVICE_PORT

您可以在第二个部署中使用它们来访问 MySQL 部署。


0
投票

过了一会儿,但看到这个,我意识到您可以简单地在部署文件的服务中定义您的 LoadBalancer。这样就可以全部配置,而不是部分通过命令行进行配置。

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  type: LoadBalancer ### Expose externally
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
...

检查IP:

kubectl get service mysql

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.