我在Oracle VM Virtualbox中使用Minikube单节点Kubernetes集群。节点中的Pod之一是基于Next.js的客户端,其余Pod是不同的微服务。假设我的客户端(Pod1)需要在呈现之前将HTTP请求发送到auth微服务(Pod2)-见图: Minikube Cluster
下面是我的ingress-service.yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
rules:
- host: dummyweb.info
http:
paths:
- path: /api/users/?(.*)
backend:
serviceName: auth-srv
servicePort: 3000
- path: /?(.*)
backend:
serviceName: client-srv
servicePort: 3000
您可以看到每个服务都有特定的路径。因此,我想将HTTP请求从客户端(Pod1)发送到Ingress服务,然后Ingress根据路径将请求重新路由到适当的服务。换句话说,居住在Pod1中的客户端将使用以下URL通过Ingress Service向居住在Pod2中的身份验证服务发送HTTP GET请求:
http://<ingress-service-url>/api/users/....
我需要弄清楚Ingress服务的网址是什么。
我启用了NGINX Ingress控制器:
minikube addons enable ingress
我验证了NGINX Ingress控制器正在运行:
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-f9fd979d6-hfnfj 1/1 Running 5 45h
etcd-minikube 1/1 Running 5 45h
ingress-nginx-admission-create-dkthv 0/1 Completed 0 23h
ingress-nginx-admission-patch-4gtth 0/1 Completed 0 23h
ingress-nginx-controller-789d9c4dc-qdqxv 1/1 Running 3 23h
kube-apiserver-minikube 1/1 Running 5 45h
kube-controller-manager-minikube 1/1 Running 5 45h
kube-proxy-sr6pt 1/1 Running 5 45h
kube-scheduler-minikube 1/1 Running 5 45h
storage-provisioner 1/1 Running 11 45h
然后,我正在检查kube系统名称空间中可用的服务:
kubectl get services -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller-admission ClusterIP 10.97.5.35 <none> 443/TCP 24h
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 45h
我假设Ingress服务的内部URL是:
http://ingress-nginx-controller-admission.kube-system.svc.cluster.local
如上所述,ingress-nginx-controller-admission服务仅公开端口443,因此在HTTP请求中出现以下错误:
Server Error
Error: connect ETIMEDOUT 10.97.5.35:80
This error happened while generating the page. Any console logs will be displayed in the terminal window.
Call Stack
<unknown> (Error: connect ETIMEDOUT
10.97.5.35 (80)
TCPConnectWrap.afterConnect [as oncomplete]
net.js (1145:16)
我对直接连接到身份验证服务不感兴趣。
答案 0 :(得分:0)
有一个非常简单的解决方案来解决上述问题:
minikube addons enable ingress
。helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install my-release ingress-nginx/ingress-nginx
您可以在其中用自己喜欢的任何内容替换my-release
。在我的情况下,这是dimi
。
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
auth-mongo-srv ClusterIP 10.110.44.53 <none> 27017/TCP 46m
auth-srv ClusterIP 10.106.154.84 <none> 3000/TCP 46m
client-srv ClusterIP 10.108.31.36 <none> 3000/TCP 46m
dimi-ingress-nginx-controller LoadBalancer 10.102.12.127 <pending> 80:31599/TCP,443:32639/TCP 34m
dimi-ingress-nginx-controller-admission ClusterIP 10.102.171.116 <none> 443/TCP 34m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 58m
nats-srv ClusterIP 10.110.239.15 <none> 4222/TCP,8222/TCP 46m
orders-mongo-srv ClusterIP 10.101.67.81 <none> 27017/TCP 46m
orders-srv ClusterIP 10.103.29.63 <none> 3000/TCP 46m
tickets-mongo-srv ClusterIP 10.107.137.160 <none> 27017/TCP 46m
tickets-srv ClusterIP 10.106.203.231 <none> 3000/TCP 46m
dimi-ingress-nginx-controller
服务。因此,如果您需要处理服务器端渲染(SSR)并将HTTP请求从一个Pod(在其中运行Next.js应用程序的Pod)发送到您的微服务之一(在另一个Pod中运行的Runnig),则在该页面之前甚至呈现,您可以将请求发送到http://dimi-ingress-nginx-controller.default.svc.cluster.local/<path_set_in_the_Ingress_Resource>
。
例如,如果我的Next.js应用需要向我的Auth微服务发送请求,则URL为:http://dimi-ingress-nginx-controller.default.svc.cluster.local/api/users
。这样,HTTP(S)流量将由Ingress资源处理,我们已经有了与所有传入请求匹配的规则列表。答案 1 :(得分:-1)
请记住,Ingress
是一种单独的资源。它不是Service
。 Here您可以阅读kubernetes中什么可以获取DNS名称,而Ingress
不在其中。
如果要连接到通过Ingress
公开的应用,只需执行以下命令:
kubectl get ingress
它将显示您的IP地址,并且您应该能够在Pod
内部以任何其他方式卷曲它或发送HTTP GET请求。下面是我的示例的输出:
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
example-ingress hello-world.info 10.0.2.15 80 5m54s
现在,我们可以kubectl exec
到另一个Pod
并连接到通过Pod
公开的另一个Ingress
中运行的应用程序:
$ kubectl exec -ti static-web -- /bin/bash
root@static-web:/# curl --header 'Host: hello-world.info' http://10.0.2.15
Hello, world!
Version: 1.0.0
Hostname: web-9bbd7b488-qvg85
root@static-web:/#
如果您想使用DNS名称,则始终可以将dummyweb.info
域添加到/etc/hosts
的{{1}}文件中。您可以阅读有关方法here。
如果您没有指定正确的主机名(如您在上面在http reqest的标头中指定的那样),无论如何您将得到Pod
:
404