【问题标题】:Kubernetes - How to acces to service from a web server in pod with a rest requestKubernetes - 如何通过休息请求从 pod 中的 Web 服务器访问服务
【发布时间】:2019-04-23 06:54:20
【问题描述】:

我希望使用 Kubernetes DNS 从 pod 中重新获取 pod。一切都在我的 Kubernetes 集群中。

我想使用来自 web 应用程序的 http requeste 来调用另一个 web 应用程序

例如,我想从 DashboardWebApp 调用 ProductWebApp

我找到了 kubernetes rest api

➜ ~ kubectl exec -it dashboard-57f598dd76-54s2x -- /bin/bash

➜ ~ curl -X GET https://4B3449144A41F5488D670E69D41222D.sk1.us-east-1.eks.amazonaws.com/api/v1/namespaces/staging/services/product-app/proxy/api/product/5bf42b2ca5fc050616640dc6 { “种类”:“状态”, "apiVersion": "v1", “元数据”:{

}, “状态”:“失败”, "message": "services \"product-app\" 被禁止:用户 \"system:anonymous\" 无法在命名空间 \"staging\"" 中获取服务/代理, “原因”:“禁止”, “细节”: { “名称”:“产品应用程序”, “种类”:“服务” }, “代码”:403 }%

我不明白为什么会被屏蔽

我也找到了这个网址
➜ ~ curl -XGET product-app.staging.svc.cluster.local/api/product/5bf42b2ca5fc050616640dc6

但这也行不通

那么从 pod 调用服务的好方法是什么?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    ProductWebApp 和 DashboardWebApp 都在 same Kubernetes 集群上运行时:

    按照here 的描述为您要使用type: ClusterIP 服务调用的应用程序(ProductWebApp)定义一个服务;使用服务名称作为要调用的 URI 配置调用应用程序 (DashboardWebApp)。

    例如,假设 ProductWebApp 位于名为 staging 的命名空间中,为 ProductWebApp 部署定义一个名为 product-app 的服务,然后将 DashboardWebApp 配置为通过此 URI 调用 ProductWebApp:

    http://product-app.staging.svc.cluster.local/end/point/as/needed
    

    如果 ProductWebApp 端点需要,请将 http 替换为 https。请注意,Service 名称可以与该服务所在的 Deployment 的名称相同。

    这在 Kubernetes 集群运行 DNS 服务时有效(大多数集群都这样做) - 请参阅此 link,特别是 A records 部分。

    【讨论】:

      【解决方案2】:

      我也遇到了类似的问题

      尝试上述解决方案以提供

      http://服务名称.命名空间.svc.cluster.local:端口号

      这通常适用于从一个 pod 到达另一个 pod,但是当您尝试到达的 pod 上存在安全性时,这会失败。

      在这里我坚持相同,所以您可以在您尝试访问的 pod 中创建一个服务帐户:

      service-account.yaml

      api版本:v1

      种类:服务帐户

      元数据:

      name: {{ template "kafka-schema-registry.fullname" . }}
      

      编写授权策略以允许该服务帐户:

      auth-policy.yaml

      {{- if .Values.auth.enabled -}}

      apiVersion:security.istio.io/v1beta1

      种类:授权策略

      元数据:

      name: {{ template "pod-name.fullname" 。 }}

      规格:

      选择器:

      matchLabels:
      
        app: {{ template "*pod-name*.name" . }}
      

      动作:允许

      规则:

      • 来自:

        • 来源:

          主体:["cluster.local/ns/name-space/sa/pod-name"]

        到:

        • 操作:

          方法:[“GET”、“POST”、“PUT”]

      在您尝试从另一个 pod 访问的上述 pod 上完成所有上述更改之后。

      其他 pod 只需在 deployment.yaml

      中提供服务帐户名称

      示例如下:

      deployment.yaml

      api版本:apps/v1

      种类:部署

      元数据:

      名称:{{ .Values.name }}

      命名空间:{{ .Values.namespace }}

      标签:

      app: {{ .Values.name }}
      

      规格:

      副本:{{ .Values.replicaCount }}

      选择器:

      matchLabels:
      
        app: {{ .Values.name }}
      

      模板:

      metadata:
      
        annotations:
      
          prometheus.io/scrape: "true"
      
          prometheus.io/path: "/actuator/prometheus"
      
          prometheus.io/port: {{ .Values.service.port | quote }}
      
        labels:
      
          app: {{ .Values.name }}
      
      spec:
      
        serviceAccountName: {{ *pod-name* }}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 2012-08-28
        相关资源
        最近更新 更多