【问题标题】:Can I get response of curl through POD IP address (instead of host address) while using nginx ingress我可以在使用 nginx 入口时通过 POD IP 地址(而不是主机地址)获得 curl 的响应吗
【发布时间】:2021-12-31 06:23:25
【问题描述】:

我使用nginx ingress controller 下面是2个服务的入口规则文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/ingress.allow-http: "false"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
    - rewrite.bar.com.com
    secretName: ingress-tls
  rules:
  - host: rewrite.bar.com.com
  - http:
      paths:
      - path: /my-service-1/(.*)
        pathType: Prefix
        backend:
          service:
            name: my-service-1
            port:
              number: 36995
      - path: /my-service-2/(.*)
        pathType: Prefix
        backend:
          service:
            name: my-service-2
            port:
              number: 32243

现在通过 service-2 的 shell 使用以下命令,我可以 curl 到 service-1 api 端点,这里我需要传递也启用了 TLS 的主机('wire.com'),

curl --resolve wire.com:443:10.22.148.179 https://wire.com:32243/GetData

以上 curl 使用主机地址给我响应成功,这里没有问题!

现在我使用的是 POD 的 IP 地址而不是主机地址,但这不会给我响应,它总是给出像 curl: (52) Empty reply from server 这样的错误。这里10.22.148.179 是我的入口公共IP 地址,10.2.0.58 是我的POD IP 地址。

curl --resolve enabledservices-dev-aks.honeywell.com:443:10.22.148.179 http//10.2.0.58:32243/GetData

我的目标是通过 IP 地址访问 POD/服务 api 端点,这可以通过集成 Ingress 的上下文实现吗?

【问题讨论】:

  • 您能否详细说明through shell of service-2 的含义?另外,您使用的是哪个 POD 的 IP? service-1 后面的入口 1 或 pod 的 IP?我真的不明白你想以这种方式实现什么。所有流量都应该通过入口,让入口做路由等。
  • 您有两个选择:1 - 通过入口,2 - 直接服务/pod-ip 甚至通过 dns-name 而不使用入口。见dns in kubernetes。换句话说,简单的curl service-1.NAMESPACE.svc.cluster.local:PORT 以及您需要的任何其他内容。
  • 嗯,你需要从集群内的另一个 pod 中curl POD_IP:PORT。 DNS 主要用于服务,但内部可以直接使用cluster-ip。这实际上就是使用ingress 的原因 - 将cluster-ip 的服务暴露在集群外,因此ingress 是集群的一个访问点。
  • 另外请检查this is the case
  • @moonkotte,终于可以使用了,curl -k https://10.22.148.212:32243/GetData,-k 和 https。 :)

标签: kubernetes nginx-ingress


【解决方案1】:

将这个从 cmets 转移到答案。


问题是服务器通过 HTTPS 提供服务时使用的 curl 请求和 HTTP 协议。这就是(52) Empty reply from server错误的原因。

curl 的请求应该通过指定协议来完成,例如:

curl https://test.example.com:8888

Ingress 用作集群的单个入口点,因此可以使用cluster-ip 服务类型在集群内部公开所有内部服务 - 请参阅kubernetes service types。

如果需要从集群内部测试任何内部服务/pod,则应从集群执行请求才能访问cluster-ip,因为cluster-ip 只能在集群内部访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多