kubernetes:访问Pod内的Ingress

时间:2018-05-27 07:35:56

标签: kubernetes

我设置了Ingress对象,根据网址路径将流量路由到相应的Service。我想在另一个Ingress中访问/公开此Pod个对象。我想知道这是否可行?

我尝试在Service上设置Ingress,但这似乎无效。

5 个答案:

答案 0 :(得分:2)

如果已分配主机名,则还必须在/ etc / hosts文件中提供群集的域名和IP地址。当您从群集外部通过Ingress访问服务时,将使用该文件进行主机名解析。

但是,在集群中运行的Pod无法访问此/ etc / hosts文件。它具有自己的/ etc / hosts文件。要使用入口,吊舱需要在其自己的/ etc / hosts文件中具有相同的域名和IP地址条目。

要实现此目的,您必须使用 hostAliases 。这是一个工作原理的示例:

apiVersion: v1
kind: Pod
metadata:
...
spec:
  hostAliases:
  - ip:<IP address>
    hostnames:
    - <host name>  

有关hostAliases的更多详细信息,请转到this link

答案 1 :(得分:1)

因此,无论出于何种原因(ssr,大量微服务等),您都希望使用其入口路径映射来访问k8s资源,而不是通过其内部名称来调用每个服务。 例如,您有一个这样的入口配置:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api/users/?(.*)
            backend:
              serviceName: auth-service
              servicePort: 80
          - path: /api/cart/?(.*)
            backend:
              serviceName: cart-service
              servicePort: 80

,您想使用auth-service而不是http://example.com/api/auth访问http://auth-service

您要做的就是用入口服务网址替换域部分(在我们的情况下为example.com)。它取决于您的配置和环境,但是通常看起来像http://[SERVICE_NAME].[NAMESPACE],例如:

  • GCP-http://ingress-nginx-controller.ingress-nginx
  • 头盔入口nginx-http://my-release-ingress-nginx-controller(在这里 仅使用服务名称部分,因为头盔将入口安装在 默认名称空间)
  • Minikube-如果您正在使用minikube ingress 插件,那么您可能会遇到无法访问的问题 进入,然后使用头盔版本。 (不要禁用入口插件-只需安装头盔版本即可)

获取名称空间:kubectl get namespaces 在名称空间kubectl get services -n [NAMESPACE]中获取服务名称。

答案 2 :(得分:0)

群集中,您的群组使用services来访问其他群组。

从外部群集,客户端可以使用ingress来获取服务。

Ingress资源允许连接到服务。 因此,您的pod需要通过服务(以下示例中的my-svc-N)访问,您将在入口定义中使用该服务。

看一下这个例子:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  backend:
    serviceName: default-http-backend
    servicePort: 80
  rules:
  - host: my-kube.info
    http:
      paths:
      - path: /
        backend:
          serviceName: my-svc-1
          servicePort: 80
  - host: cheeses.all
    http:
      paths:
      - path: /aaa
        backend:
          serviceName: my-svc-2
          servicePort: 80
      - path: /bbb
        backend:
          serviceName: my-svc-3
          servicePort: 80

答案 3 :(得分:0)

正如fiunchinho在评论中提到的,Ingress旨在管理到集群的外部流量。要连接同一群集中的不同pod,您应该使用Service。

在您的情况下,您可以将pod连接到支持Ingress对象的服务。

答案 4 :(得分:0)

我在这个问题上花了很多时间。我找到了非常简单的解决方案。我正在使用 Mac Docker Desktop 3.3.1

我的 Kubernetes 版本:1.19.7

我正在尝试从集群中运行的另一个 Pod 访问 UI URL。

我的用户界面服务
apiVersion: v1
kind: Service
metadata:
  name: my-ui-service
spec:
  type: LoadBalancer
  selector:
    app: my-ui
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

服务的入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: my-site.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: my-ui-service
            port:
              number: 8080

我用过 NGINX Ingress Controller

运行入口控制器的命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.48.1/deploy/static/provider/cloud/deploy.yaml

一旦控制器准备就绪,运行命令以查看入口状态。

kubectl get ingress

现在查看入口的描述:

kubectl describe ingress my-ingress

在这里你会发现

Rules:
  Host           Path  Backends
  ----           ----  --------
  my-site.com
                 /   my-ui-service:8080 (10.1.2.198:8080)

在集群中的任何 Pod 中,您都可以使用 my-site.com 访问域 my-ui-service:8080