无法从其他 pod 访问 kubernetes 集群中的 pod,但可以从 ingress

时间:2021-01-24 17:25:24

标签: kubernetes

我可以使用入口从 k8s 集群外部访问 Pod,但无法从集群内部访问,并且出现“连接被拒绝”错误。我试图进入拒绝连接的 pod 并运行以下 curls,这些 curls 在我的本地/主机环境中运行时效果很好:

  • curl localhost:4000/api/v1/users
  • 卷曲 127.0.0.1:4000/api/v1/users
  • 卷曲 0.0.0.0:4000/api/v1/users
  • 卷曲:4000/api/v1/users

无济于事。集群 ip 是 10.99.224.173 但超时了,我不想绕过 dns,因为这是由 k8s 动态分配的。无论如何它都不起作用。该服务是一个基于 nodejs 的服务。我可以添加更多信息,但我想我会尝试在信息太少而不是太多方面犯错。为了将该问题隔离为 k8s 问题,我在 k8s 之外本地运行了这两个服务,没有出现任何问题。我认为一个好的起点是确定为什么我不能从同一个 pod 内卷曲到服务器。谢谢!

编辑 2:从 skaffold 关闭集群并重新运行 skaffold dev 解决了这个问题,我现在可以很好地运行以下命令:

  • curl localhost:4000/api/v1/users
  • 卷曲 127.0.0.1:4000/api/v1/users
  • 卷曲 0.0.0.0:4000/api/v1/users
  • 卷曲:4000/api/v1/users

我发现 tchannel-node library 不接受 0.0.0.0 作为有效的 ip 地址来侦听,我可以通过的最接近的是 127.0.0.1。不幸的是,这意味着对集群 ip 10.99.224.173:9090 的调用永远不会像 127.0.0.1:9090 那样被服务器注册为 0.0.0.0:9090。我想知道如何修正我的理解以传递正确的 IP 地址。

编辑(请求的 yaml 文件):

  • 客户
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tickets-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tickets
  template:
    metadata:
      labels:
        app: tickets
    spec:
      containers:
        - name: tickets
          image: mine/tickets-go
---
apiVersion: v1
kind: Service
metadata:
  name: tickets-svc
spec:
  selector:
    app: tickets
  ports:
    - name: tickets
      protocol: TCP
      port: 4004
      targetPort: 4004
  • 拒绝连接的服务器
apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: mine/auth
          env:
            - name: PORT
              value: "4000"
            - name: TCHANNEL_PORT
              value: "9090"
---
apiVersion: v1
kind: Service
metadata:
  name: auth-svc
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 4000
      targetPort: 4000
    - name: auth-thrift
      protocol: TCP
      port: 9090
      targetPort: 9090
  • 入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-svc
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: foo.com
      http:
        paths:
          - path: /api/v1/users/?(.*)
            backend:
              service:
                name: auth-svc
                port:
                  number: 4000
            pathType: Prefix
          - path: /api/v1/tickets/?(.*)
            backend:
              service:
                name: tickets-svc
                port:
                  number: 4004
            pathType: Prefix

0 个答案:

没有答案