通过入口服务将Kubernetes Pod中的HTTP请求发送到Minikube中的另一个Pod

时间:2020-10-08 10:02:36

标签: kubernetes kubernetes-ingress minikube

我在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)
  1. 这是访问Minikube中的Ingress服务的正确内部URL吗?
  2. 如果是,如何打开端口80?

我对直接连接到身份验证服务不感兴趣。

2 个答案:

答案 0 :(得分:0)

有一个非常简单的解决方案来解决上述问题:

  1. 我认为您已经启用了入口插件。如果不是这样:minikube addons enable ingress
  2. 您需要Helm来安装NGINX Ingress Controller:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install my-release ingress-nginx/ingress-nginx

您可以在其中用自己喜欢的任何内容替换my-release。在我的情况下,这是dimi

  1. 检查默认名称空间中的可用服务:
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
  1. 现在我们有了类型为LoadBalancer的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是一种单独的资源。它不是ServiceHere您可以阅读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