我有一个Kubernetes(v1.18.6),其中有1个服务(负载均衡器),2个开发中的pod:
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
selector:
app: app
ports:
- protocol: "TCP"
port: 6000
targetPort: 5000
type: LoadBalancer
访问Internet的网络策略(对我来说是必需的):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: internet-access
spec:
podSelector:
matchLabels:
networking/allow-internet-access: "true"
policyTypes:
- Ingress
- Egress
ingress:
- {}
部署配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
progressDeadlineSeconds: 120
selector:
matchLabels:
app: app
replicas: 2
template:
metadata:
labels:
app: app
spec:
imagePullSecrets:
- name: myregistrykey
containers:
- name: app
image: app
imagePullPolicy: Always
ports:
- containerPort: 5000
它工作正常。但现在,我想将此imagen连接到外部数据库(在另一个网络中只能通过互联网访问)。对于这个命题,我使用此服务:
apiVersion: v1
kind: Service
metadata:
name: postgresql
spec:
clusterIP: None
ports:
- port: 25060
---
apiVersion: v1
kind: Endpoints
metadata:
name: postgresql
subsets:
- addresses:
- ip: 206............
ports:
- port: 25060
name: postgresql
这是所有的服务:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
app-service LoadBalancer 10.245.134.137 206........... 6000:31726/TCP 2d4h
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 3d7h
postgresql ClusterIP None <none> 25060/TCP 19h
但是当我尝试连接时,我收到数据库超时错误,例如无法连接到数据库。
我有一个互联网连接的图像。
我找到解决办法了,问题出在数据库的入站规则上,必须添加Kubernetes的IP。
谢谢
4条答案
按热度按时间8fsztsew1#
以下是对我起作用的方法:
定义一个服务,但设置
clusterIP: None
,因此不会创建endpooint。然后使用与服务相同的名称创建一个端点,并设置数据库的IP和端口。
在您的示例中,您的端点中有一个类型:您的端点的名称是postgresql而不是postgresSql。
我的例子:
mccptt672#
为了更好的可见性,我将问题中提到的答案放在OP中:
我找到解决办法了,问题出在数据库的入站规则上,我必须添加Kubernetes的IP
icomxhvb3#
如果我理解正确的话,你的集群在
Digital Ocean
云上有应用程序,而你的PostgreSQL
在这个集群之外。在您的
Application Deployment
〈〉application service
中,您已经使用了带有选择器的服务,因此您不需要手动创建Endpoints
。在您的
external database service
中,您使用了没有选择器的服务,因此您必须手动创建Endpoint
。由于数据库是
external service
,使用clusterIP: None
是没有意义的,因为它会尝试匹配集群内的pod。我猜你在阅读本文时添加了它。最后一件事是,在
Endpoint
中,你设置了ip: 206...
,它与应用服务LoadBalancer
ip相同?这只是一部分信息,所以我猜.然而,在这一部分,你应该提供所需的
database
的IP,而不是你的应用程序Loadbalancer
的IP.现在,根据场景,您可以连接:
有关上述场景的详细信息,请参阅Kubernetes best practices: mapping external services
根据您当前的配置,我假设您希望使用
scenario 1
。如果这个
database
和cluster
在云中的某个地方,你可以使用internal Database IP
。如果不是,你应该提供托管这个数据库的机器的IP。您也可以阅读Kubernetes Access External Services文章。
请让我知道,如果你仍然会有问题后,知识产权的变化
mwg9r5ms4#
应更正服务定义。默认服务类型为clusterIP,该类型不适用于外部数据库。您需要按以下方式更新服务类型
类型:外部名称
也确保服务名称和端点名称应该匹配.它在你的yaml中是不同的.请检查