无法从Kubernetes中的前端服务访问后端服务



我很难在Kubernetes中从前端应用程序到后端应用程序进行Http调用。

因此,基本上我有前端和后端应用程序的部署、服务和入口规则,而前端服务无法连接到后端服务。

这是错误消息,我正在获取

获取http://spring-boot-vuejs:8080/api/coursesnet::ERR_NAME_NOT_RESOLVED

我正在尝试创建一个简单的web应用程序,使用Vuejs作为前端,使用Spring引导作为后端。后端在/api/curses/*端点上公开RESTapi,前端使用它

我在裸金属Kubernetes集群上部署了两个独立的pod,一个用于前端,一个用作后端。我还安装了Nginx入口控制器

如果我在本地机器中运行两个docker映像,一切都会正常工作,因为我使用"http://localhost:8080"作为后端端点,但当我在Kubernetes上部署应用程序时,它就无法再工作了,因为它可以解析服务名称"http://spring-boot-vuejs:8080">

我已经提到了这里,这里,这里提到的问题,但没有一个对我有帮助

以下是各自的yaml文件。如果我在任何yaml文件或入口规则中犯了错误,请纠正我。

后端:

apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-vuejs
labels:
app: spring-boot-vuejs
spec:
replicas: 1
selector:
matchLabels:
app: spring-boot-vuejs
template:
metadata:
labels:
app: spring-boot-vuejs
spec:
containers:
- name: spring-boot-vuejs
imagePullPolicy: ifNotPresent
image: <my docker hub username>/spring-boot-vuejs:0.0.1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: spring-boot-vuejs
labels:
app: spring-boot-vuejs
spec:
clusterIP: None
ports:
- port: 8080
targetPort: 8080
protocol: TCP
name: spring-boot-vuejs
selector:
app: spring-boot-vuejs

进入规则

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: spring-boot-vuejs
annotations:
kubernetes.io/ingress.class: nginx
spec:
backend:
serviceName: default-http-backend
servicePort: 80
rules:
- host: spring-boot-vuejs
- http:
paths:
- path: /api/.*
backend:
serviceName: spring-boot-vuejs
servicePort: 8080

前端的Yaml文件

部署和服务

apiVersion: apps/v1
kind: Deployment
metadata:
name: vuejs-frontend
labels:
app: vuejs-frontend
spec:
replicas: 1
selector:
matchLabels:
app: vuejs-frontend
template:
metadata:
labels:
app: vuejs-frontend
spec:
containers:
- name: vuejs-frontend
imagePullPolicy: ifNotPresent
image: <my dockerhub username>/vuejs-frontend:0.0.1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: vuejs-frontend
labels:
app: vuejs-frontend
spec:
clusterIP: None
ports:
- port: 8080
targetPort: 8080
protocol: TCP
name: vuejs-frontend
selector:
app: vuejs-frontend

进入规则

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: vuejs-frontend
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
backend:
serviceName: default-http-backend
servicePort: 80
rules:
- host: spring-boot-vuejs
- http:
paths:
- path: /
backend:
serviceName: vuejs-frontend
servicePort: 8080

如果我理解正确,问题是vuejs-frontend无法到达端口8080上的spring-boot-vuejs

我看到您已经创建了一个headless Service(一个具有clusterIP: None的服务(。此外,该服务没有在yaml中指定选择器,因此没有创建EndPoinds(

关于该主题的官方文件称:

有时您不需要负载平衡,只需要单个服务IP。在这种情况下,您可以通过显式地为集群IP(.spec.clusterIP(指定"None"来创建所谓的"无头"服务。

对于headlessServices,没有分配集群IP,kube代理不处理这些服务,平台也没有为它们进行负载平衡或代理。DNS的自动配置方式取决于服务是否定义了选择器。

对于不定义选择器的headless服务,端点控制器不会创建Endpoints记录。然而,DNS系统查找并配置以下任一项:

  • ExternalName类型服务的CNAME记录
  • 与服务共享名称的任何Endpoints的记录,以及所有其他类型的记录

这里有一些解决方案。

  • 手动创建EP
apiVersion: v1  
kind: Endpoints  
metadata:  
name: spring-boot-vuejs  
namespace: default  
subsets:  
- addresses:  
- ip: IP_spring-boot-vuejs_pod 
ports:  
- name: http  
port: 8080  
protocol: TCP

因此,DNS将被正确配置。

  • 创建其他类型的服务,或者至少向当前服务添加选择器

下面你可以看到它是如何在我的k8s安装中工作的。我使用的所有文件都来自我的GitHub repo。

$ kubectl create -f  deployment.yaml
deployment.apps/server-go-deploy created
$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
server-go-deploy      1/1     1            1           9s
$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
$ kubectl get pods -o wide 
NAME                         READY   STATUS  AGE     IP           
nginx-65f88748fd-vzgxx       1/1     Running 9m16s   10.52.3.13
server-go-6c84bbd44d-r5bsb   1/1     Running 14m     10.52.3.12
$ kubectl create -f service.yaml 
service/hello-go created
$ kubectl get services   -o wide 
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE    SELECTOR
hello-go     ClusterIP   None          <none>        8180/TCP   13s    <none>
kubernetes   ClusterIP   10.0.0.1      <none>        443/TCP    123d   <none>
$ kubectl exec -it nginx-65f88748fd-vzgxx -- curl hello-go:8180
curl: (6) Could not resolve host: hello-go
command terminated with exit code 6
## As you can see K8s knows nothing that request to 'hello-go' should be routed to 'hello-go' Pod. 
$ kubectl create -f ep.yaml 
endpoints/hello-go created
$ kubectl get ep  -o wide 
NAME         ENDPOINTS            AGE
hello-go     10.52.3.12:8180      3s
kubernetes   35.234.103.244:443   123d
kiwi@kiwi-dv7:~/PycharmProjects/innovative-solutions/61326587-svc$ kubectl exec -it nginx-65f88748fd-vzgxx -- curl hello-go:8180/whoo-hoo
Hello from ServerGo. You requested: /whoo-hoo 
#And now it works.

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新