kubernetes-如何将 mysql 服务暴露给另一个 pod?
kubernetes-How do I expose mysql service to another pod?
我有一个带有 pv 的 mysql 服务,以及一个自定义 karaf 图像的部署。
我的 karaf 中有挂钩,当我安装 kar liquibase 时应该填充数据库,但我意识到数据库仍然是空的,所以 karaf 无法访问 mysql。
我想在我的机器上访问,localhost。
这是我的 .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的秘密:
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 expose MySQL running on localhost as service
但没用:(
感谢您的宝贵时间!
您的服务已经在 Kubernetes 中公开给端口 3306
上的其他 pods。您可以使用 NodePort
.
类型的服务向主机公开 mysql
kubectl expose svc/mysql --name mysql-np --port 3306 --type NodePort
kubectl get svc mysql-np -ojsonpath='{.spec.ports[0].nodePort}'
对于数据,您是否偶然删除并重新创建了 PV?您共享的配置应该有效。
在您的 Karaf application.what 中是连接源 url?
例如,在 kubernetes 中部署的 Spring 启动应用程序中,它使用 mysql 服务,连接源 url 将是:jdbc:mysql://mysqlservice: 3306/${DB_NAME}。
其中“mysqlservice”将是在 kubernetes
中定义的服务 mysql 的名称
由于您正在使用相同的命名空间,因此在您拥有名为 MySQL 的服务后创建的 pods 将具有名为:
的环境变量
- MYSQL_SERVICE_HOST
- MYSQL_SERVICE_PORT
您可以在第二个部署中使用它们来访问 MySQL 部署。
我有一个带有 pv 的 mysql 服务,以及一个自定义 karaf 图像的部署。
我的 karaf 中有挂钩,当我安装 kar liquibase 时应该填充数据库,但我意识到数据库仍然是空的,所以 karaf 无法访问 mysql。
我想在我的机器上访问,localhost。
这是我的 .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的秘密:
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 expose MySQL running on localhost as service
但没用:(
感谢您的宝贵时间!
您的服务已经在 Kubernetes 中公开给端口 3306
上的其他 pods。您可以使用 NodePort
.
kubectl expose svc/mysql --name mysql-np --port 3306 --type NodePort
kubectl get svc mysql-np -ojsonpath='{.spec.ports[0].nodePort}'
对于数据,您是否偶然删除并重新创建了 PV?您共享的配置应该有效。
在您的 Karaf application.what 中是连接源 url? 例如,在 kubernetes 中部署的 Spring 启动应用程序中,它使用 mysql 服务,连接源 url 将是:jdbc:mysql://mysqlservice: 3306/${DB_NAME}。 其中“mysqlservice”将是在 kubernetes
中定义的服务 mysql 的名称由于您正在使用相同的命名空间,因此在您拥有名为 MySQL 的服务后创建的 pods 将具有名为:
的环境变量- MYSQL_SERVICE_HOST
- MYSQL_SERVICE_PORT
您可以在第二个部署中使用它们来访问 MySQL 部署。