【问题标题】:Discovering Kubernetes Pod without specifying port number在不指定端口号的情况下发现 Kubernetes Pod
【发布时间】:2018-10-16 19:19:33
【问题描述】:

我有一个名为 MyServices 的 kubernetes 服务,它拥有四个部署。每个部署都作为单个 pod 运行,每个 pod 都有自己的端口号。

如前所述,所有 pod 都在一个 kubernetes 服务中运行。

我可以通过该 kubernetes 服务的外部 IP 地址和端口号调用服务。

示例:92.18.1.1:3011/MicroserviceA92.18.1.1:3012/MicroserviceB

我现在正在尝试开发和编排层来调用这些服务并从它们那里获得响应,但是,我正在尝试找出一种不需要指定每个微服务端口号的方法,而是我可以通过他们的端点/服务名称调用他们。示例:192.168.1.1/MicroserviceA

我怎样才能实现上述语句?

从架构的角度来看,将所有微服务部署在单个 kubenetes 服务中是一个好主意(就像我目前的方法)还是每个微服务都需要它自己的服务

下面是kubernetes部署文件(微服务C和D的脚本我去掉了,因为它们和A和B是一样的):

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: microservice
  ports:
    - name: microserviceA
      protocol: TCP
      port: 3011
      targetPort: 3011
    - name: microserviceB
      protocol: TCP
      port: 3012
      targetPort: 3012
    - name: microserviceC
      protocol: TCP
      port: 3013
      targetPort: 3013
    - name: microserviceD
      protocol: TCP
      port: 3014
      targetPort: 3014
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: microserviceAdeployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: microservice
    spec:
      containers:
      - image: dockerhub.com/myimage:v1
        name: microservice
        ports:
        - containerPort: 3011
      imagePullSecrets:
      - name: regcred
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: microserviceBdeployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: microservice
    spec:
      containers:
      - image: dockerhub.com/myimage:v1
        name: microservice
        ports:
        - containerPort: 3012

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    有办法discover all the port of Kubernetes services

    因此您可以考虑使用kubectl get svc,如“Source IP for Services with Type=NodePort”中所示

    NODEPORT=$(kubectl get -o jsonpath="{.spec.ports[0].nodePort}" services <yourService>)
    

    ,我正在尝试找出一种方法,我不需要指定每个微服务端口号,而是可以通过它们的端点/服务名称调用它们

    然后您需要通过一个入口点公开这些服务,通常是像 NGiNX 这样的反向代理。
    这个想法是使用默认端口(80 或 443)公开所述服务,并将它们反向代理到实际的 URL 和端口号。

    查看“Service Discovery in a Microservices Architecture”了解总体思路。

    Service Discovery for NGINX Plus with etcd”用于实现(使用 NGiNX plus,因此可能是非免费的)。
    或者 "Setting up Nginx Ingress on Kubernetes" 以获得更手动的方法。

    【讨论】:

    • official documentation of Kubernetes 中提到可以通过以下方式发现服务:1)ENV 变量,2)DNS。我对第二种方法很感兴趣,但不确定它为什么不起作用。
    • @Benjamin 我没有看到 DNS 方法中提到的端口。为什么kubectl get svc 在这里不起作用?
    • 好吧,我觉得这里有点混乱。我所说的“发现服务”是指能够调用正在运行的 POD。到目前为止,为了让我触发 POD 运行的功能是在 URL 路径中包含端口号,但是我正在寻找一种方法,让我在不指定硬编码端口的情况下触发相同的事情.如果您发现问题不清楚,我可以编辑我的问题。
    • @Benjamin 你怎么能联系没有正确端口号的 pod?
    • 我已经完全编辑了我的问题。我希望现在我能够解释我想要什么。
    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2020-05-22
    • 2019-03-28
    • 2017-03-16
    • 2019-04-18
    • 1970-01-01
    • 2019-12-01
    • 2020-06-02
    相关资源
    最近更新 更多