【问题标题】:Pod to Pod communication within a Service服务内的 Pod 到 Pod 通信
【发布时间】:2019-06-21 23:00:34
【问题描述】:

是否可以向 Kubernetes 中属于同一 Service 的另一个 K8 Pod 发送 http Rest 请求?

E. G。 服务名称 = UserService , 2 个 Pods (replica = 2)

Pod 1 --> Pod 2 //using pod ip not load balanced hostname 
Pod 2 --> Pod 1

连接结束 Rest GET 1.2.3.4:7079/user/1

主机+端口的值取自kubectl get ep

两个 pod IP 都在 pod 之外成功工作,但是当我在 pod 中执行 kubectl exec -it 并通过 CURL 发出请求时,它返回 404 not found 端点。

Q 我想知道是否可以向同一 Service 中的另一个 K8 Pod 发出请求?

Q 为什么我能够成功获得ping 1.2.3.4,但无法访问Rest API?

下面是我的配置文件

 #values.yml
replicaCount: 1

 image:
  repository: "docker.hosted/app"
  tag: "0.1.0"
  pullPolicy: Always
  pullSecret: "a_secret"

service:
 name: http
 type: NodePort
 externalPort: 7079
 internalPort: 7079

ingress:
 enabled: false

deployment.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {{ template "app.fullname" . }}
  labels:
    app: {{ template "app.name" . }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "app.name" . }}
        release: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:

            - name: MY_POD_IP
              valueFrom:
               fieldRef:
                fieldPath: status.podIP
            - name: MY_POD_PORT
              value: "{{ .Values.service.internalPort }}"
          ports:
            - containerPort: {{ .Values.service.internalPort }}
          livenessProbe:
            httpGet:
              path: /actuator/alive
              port: {{ .Values.service.internalPort }}
            initialDelaySeconds: 60
            periodSeconds: 10
            timeoutSeconds: 1
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /actuator/ready
              port: {{ .Values.service.internalPort }}
          initialDelaySeconds: 60
          periodSeconds: 10
          timeoutSeconds: 1
          successThreshold: 1
          failureThreshold: 3
          resources:
{{ toYaml .Values.resources | indent 12 }}
    {{- if .Values.nodeSelector }}
      nodeSelector:
{{ toYaml .Values.nodeSelector | indent 8 }}
    {{- end }}
      imagePullSecrets:
        - name: {{ .Values.image.pullSecret }

service.yml

kind: Service
metadata:
  name: {{ template "app.fullname" . }}
  labels:
    app: {{ template "app.name" . }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.externalPort }}
      targetPort: {{ .Values.service.internalPort }}
      protocol: TCP
      name: {{ .Values.service.name }}
  selector:
    app: {{ template "app.name" . }}
    release: {{ .Release.Name }}

从主服务器执行

从同一微服务的 pod 内部执行

【问题讨论】:

  • 令人着迷,好吧,仅基于该输出,您的特使代理似乎发生了一些奇怪的事情。我对特使的经验为零,所以也许再问你的问题是特使特定的——因为关于 pod 到 pod 通信的问题不准确。您的问题实际上是 pod-to-envoy,这是一个完全不同的蜡球
  • 好的,谢谢马修,我已经在这里stackoverflow.com/q/54437129/694960用特使标签问过这个问题,但我不希望得到答复

标签: spring-boot kubernetes


【解决方案1】:

是否可以向 Kubernetes 中属于同一 Service 的另一个 K8 Pod 发送 http Rest 请求?

当然,是的,这就是为什么集群中的每个 Pod 都有一个集群范围的可路由地址的原因。您可以通过请求与Service 同名的Endpoint 对象以编程方式向 kubernetes 询问 Pod 的“对等点”列表,然后减去您自己的 Pod 的 IP 地址。似乎你从kubectl get ep 知道这一点,但后来你问了这个问题,所以我想我会明确表示你的经历并非偶然。

Q 为什么我能够成功 ping 1.2.3.4,但无法访问 Rest API?

如果没有一些应用程序日志,我们无法帮助您对应用程序进行故障排除,但事实上您收到的是 404 而不是“连接被拒绝”或 504 等,这意味着您的连接性工作正常,只是app 坏了。

【讨论】:

  • 谢谢 Matthew,我会再次检查应用程序日志,但我只能在主主机上成功地向每个具有完全相同 URL 的 Pod 发送一个 Rest 请求,这导致人们相信它是一个配置K8 yaml 端的 ip 或端口问题,你知道为什么这会在外部工作,但不能在第一个 POD 内部工作吗?
  • 那么请用主服务器的curl -v 的输出更新您的问题,然后再从集群内部更新您的问题,因为我们无法猜测是什么原因。听起来有点像您的 SDN 可能无法正常工作,但很难确定
  • 嗨@Matthew,我已经添加了 CURL 请求的输出,希望您能提供帮助
  • 嗨@Matthew,谢谢你能分享一下 Pod 到 Pod 通信的确切名称吗?我想阅读确切的文档以进一步了解它
【解决方案2】:

是的,正如 Mathew 回答的那样,您确实可以使用 Kubernetes 在 Service 中的 Pod 之间进行通信,我遇到的问题是 Istio 阻止了彼此之间的请求。

解决方案: 禁用 Istio 注入为我解决了这个问题,然后我在病房后启用它并继续负载平衡,希望它可以帮助将来的某个人。

在此处查看答案Envoy Pod to Pod communication within a Service in K8

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 2019-07-27
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2020-01-16
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多