我正在努力从Kubernetes中的前端应用程序向后端应用程序进行Http调用。
因此,基本上,我对前端和后端应用程序都有部署,服务和入口规则,并且前端服务无法连接到后端服务。
这是我收到的错误消息
获取http://spring-boot-vuejs:8080/api/courses网:: ERR_NAME_NOT_RESOLVED
我正在尝试使用Vuejs作为前端并将Spring Boot作为后端来创建一个简单的Web应用程序。后端在/ api / courses / *端点上公开REST api,而前端在使用它。
我在裸机Kubernetes集群上部署了两个单独的Pod,一个用于前端,另一个用于后端。我还安装了 Nginx入口控制器。
如果我在本地计算机上运行两个docker映像,则一切正常,因为我使用“ http://localhost:8080”作为后端端点,但是当我在Kubernetes上部署应用程序时,它将无法正常工作,因为它可以解决服务名称“ http://spring-boot-vuejs:8080”
我已经提到了here,here,here所提到的问题,但没有一个对我有帮助。
下面是相应的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
答案 0 :(得分:0)
如果我对您的理解正确,那么问题是vuejs-frontend
无法在端口spring-boot-vuejs
上到达8080
。
我看到您已经创建了headless Service
(带有clusterIP: None
的服务)。而且,该服务没有在yaml中指定选择器,因此未创建EndPoinds
)
Official documentation on topic说:
有时您不需要负载平衡,而只需一个服务IP。在这种情况下,可以通过为群集IP(
"None"
)明确指定.spec.clusterIP
来创建所谓的“无头”服务。对于无头
Services
,未分配群集IP,kube-proxy无法处理这些服务,并且平台没有为它们完成负载平衡或代理。如何自动配置DNS取决于服务是否定义了选择器。对于没有定义选择器的无头服务,端点控制器不会创建
Endpoints
记录。但是,DNS系统会寻找并配置以下任一项:
ExternalName
型服务的CNAME记录。- 与所有其他类型的与服务共享名称的
Endpoints
的记录
这里有一些解决方案。
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存储库。
$ 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.
希望有帮助。