【问题标题】:Not able to hit a kubernetes svc end point无法访问 kubernetes svc 端点
【发布时间】:2021-09-30 18:10:14
【问题描述】:

大家好,我正在尝试访问运行 fastapi 应用程序的 kubernetes 服务并一直拒绝此连接,这里的任何见解都会有所帮助,提前致谢

curl -X POST "https://file-monitoring-ms.default.svc.cluster.local:8000/api/v1/filemonitor/" -H  "accept: application/json" -H  "Content-Type: application/json"
-d "{}"

我也尝试了 file-monitoring-ms.default.svc.cluster.local:8000/api/v1/filemonitor/,因为没有 https 的端点相同的连接被拒绝

app.include_router(filesmonitor, prefix='/api/v1/filemonitor', tags=['filemonitor'])

...

...

@filesmonitor.post("/", status_code=201)
async def getSqsEvent
kind: Deployment
metadata:
  labels:
    app: file-monitoring-ms
  name: file-monitoring-ms
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: file-monitoring-ms
    spec:
      containers:
        - name: file-monitoring-ms
          imagePullPolicy: Never
          image: file-monitoring-image:latest
          ports:
            - containerPort: 8000
              protocol: TCP
  selector:
    matchLabels:
      app: file-monitoring-ms
---
apiVersion: v1
kind: Service
metadata:
  name: file-monitoring-ms
  labels:
    app: file-monitoring-ms
spec:
  selector:
    app: file-monitoring-ms
  ports:
    - name: http
      targetPort: 8000  # port the container accepts traffic on
      port: 8000  # port other pods use to access the Service
      protocol: TCP

这里是关于服务的描述

这里也是容器说它正在运行和监听

【问题讨论】:

标签: kubernetes microservices


【解决方案1】:

在 Kubernetes 中,有服务的类型

默认是集群IP:只能在集群内部访问

负载均衡器:使用 IP 将服务直接公开地暴露在互联网上。

节点端口:使用 Node 或工作节点应用程序会暴露在互联网上。

本地测试:

kubectl port-forward svc/file-monitoring-ms 8081:8080

这将在集群到本地端口之间创建代理

您现在可以访问您的 API:

curl http://localhost:8081

您的默认服务类型是集群 IP,因此无法通过 Internet 使用 curl 访问服务

以上命令仅用于开发目的或调试。

本地端口 8081 将使用 kubectl 代理将请求转发到服务端口 8080

最终答案:

如果您将在同一个集群中运行另一个容器并点击此 URL,它将可以工作,但是您的服务未公开,您将无法访问集群外的数据。

【讨论】:

    【解决方案2】:

    也许您可以先尝试通过执行kubectl exec -it <YOUR_POD_NAME> -- curl 127.0.0.1:8000 并检查服务的日志来确定服务是否在容器内可访问。

    如果服务内部可以访问,那么您可以进一步考虑是否存在一些网络问题或其他问题。

    【讨论】:

    • 如你所说,在 pod 内可以访问
    • 如果要访问集群外的服务需要将服务类型设置为NodePort或者使用Ingress来处理请求。您提到的服务的DNS记录只能在集群内部访问。
    • 但是是的,我正在尝试在集群本身内处理它,我有一个单独的 pod,在同一个命名空间中向它发送 post 请求
    • 你可以curl该Pod中服务的IP地址,检查网络是否连接。如果运行良好,nslookup 可以帮助您检查 DNS 是否可以正确解析为服务的 IP 地址。
    【解决方案3】:

    ClusterIP 类型的服务只能在集群内部访问。如果您尝试从集群外部使用类型 nodePort 或使用入口。

    如果您在集群内部尝试 curl,则不必将端口添加到您的 URL。

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 2022-01-15
      • 2020-07-15
      • 2019-05-02
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多