问题描述
我在每个命名空间中创建了两个命名空间和服务:
- 命名空间:应用程序层
- rest-app
- db-service-externalname
- 命名空间:数据层
- db-service
当我尝试从rest-app
连接到DB Service中的MysqL数据库时,出现错误:
MysqL.Data.MysqLClient.MysqLException(0x80004005):无法连接到任何指定的MysqL主机。 ---> System.AggregateException:发生一个或多个错误。 (名称或服务未知)
我已在日志中打印出,它正确地将db-service
作为服务名称,并具有正确的用户/密码。
这是我定义的:
数据库服务
apiVersion: v1
kind: Service
Metadata:
name: db-service
namespace: data-layer
spec:
selector:
app: db-service
ports:
- port: 3306
clusterIP: None
db-service-externalname
apiVersion: v1
kind: Service
Metadata:
name: db-service
namespace: app-layer
spec:
type: ExternalName
externalName: db-service.data-layer.service.cluster.local
ports:
- port: 3306
rest-app
apiVersion: apps/v1
kind: Deployment
Metadata:
name: rest-app
namespace: app-layer
labels:
app: rest-app
spec:
replicas: 1
selector:
matchLabels:
app: rest-app
template:
Metadata:
labels:
app: rest-app
spec:
containers:
- name: rest-app
image: restapp:latest
imagePullPolicy: Always
ports:
- containerPort: 5000
env:
# These are from a secret I defined,and the logs show
# the rest app gets them correctly
- name: MysqL_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: db-credentials
key: db-username
- name: MysqL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: db-password
# I hard-coded this to the externalName I created.
# Is that right?
- name: MysqL_URL
value: db-service
问题:
解决方法
ExternalName类型的服务应如下所示。注意使用svc
而不是service
。
apiVersion: v1
kind: Service
metadata:
name: db-service
namespace: app-layer
spec:
type: ExternalName
externalName: db-service.data-layer.svc.cluster.local
ports:
- port: 3306