【问题标题】:Access pod from another pod kubernetes从另一个 pod kubernetes 访问 pod
【发布时间】:2019-04-25 04:26:52
【问题描述】:

我创建了 2 个 pod。一个是grafana,另一个是influx pod。我需要在 grafana 中配置 influx。我确实看到了下面的例子。我对它的配置方式有点困惑。下面是部署和服务文件。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: influxdb
  labels:
    app: influxdb
spec:
  template:
    metadata:
      labels:
        app: influxdb
    spec:
      containers:
      - name: influxdb
        image: influxdb
        ports:
        - containerPort: 8083
          name: admin
        - containerPort: 8086
          name: http
        resources:
          limits:
            memory: 2048Mi
            cpu: 100m  
        volumeMounts:
        - name: influxdb-data
          mountPath: /var/lib/influxdb
      volumes:
      - name: influxdb-data
        persistentVolumeClaim:
          claimName: influxdb-pvc-vol

服务文件

apiVersion: v1
kind: Service
metadata:
  name: influxdb
  labels:
    app: influxdb
spec:
  ports:
    - port: 3306
  selector:
    app: influxdb
  clusterIP: None

clusterIP: None 是做什么的?他已经暴露了 3306 端口并将其映射到节点端口 3306。所以我相信我可以使用 3306 端口及其 IP 从其他 pod 访问。但是在这里我看到我可以通过http://influxdb:8086 访问我如何通过http://influxdb:8086 访问?

【问题讨论】:

  • 我认为服务清单中有错字。应该有8086端口。
  • @VasilyAngapov - 不,不是。我也有同样的疑问。但它是 3306。
  • @QuỳnhNguyễn - 那么它的服务或容器的名称?
  • @Hacker 是的,没错。集群内部访问时服务的名称

标签: kubernetes


【解决方案1】:

我可以解释发生了什么以及为什么会这样,但我仍然认为这种配置没有意义。

Deployment 创建了一个运行 InfluxDB 的 Pod,该 Pod 默认侦听端口 8086。此处的 containerPort 纯粹是信息性的,请参阅 Pod spec reference 中的以下内容:

主要是信息性的。此处不指定端口不会阻止该端口被暴露。任何侦听容器内默认“0.0.0.0”地址的端口都可以从网络访问。

现在是使用端口 3306 创建的服务,这很奇怪,但在这种情况下并不重要,因为这是一个 Headless Service。无头服务是一种告诉 Kubernetes 你不想要它花哨的网络功能(如 kube-proxy 负载平衡)的方法,而你只希望它为你创建 DNS 记录。通过指定ClusterIP: None,您基本上可以使它成为一个无头服务。鉴于此服务实际上并未服务任何流量,因此此处的“端口”字段毫无意义。

现在让我们回顾一下当您访问http://influxdb:8086 时会发生什么:

  1. 您的 http 客户端将主机 influxdb 解析为 Pod IP。这要归功于无头服务。再次注意,主机解析为 Pod IP,而不是服务 IP。
  2. 由于 Pod 在 8086 上提供服务,并且您直接通过其私有 IP 访问它,因此它会接受您的请求并得到您的回复。

【讨论】:

  • 我有几个问题。 1. Service 是否是我从另一个 pod 访问一个 pod 或在同一节点外部访问 pod 的一项任务。 2. 有没有一种方法我可以在没有服务的情况下从另一个 pod 访问一个 pod
  • 服务不是强制性的。 Pod 可以通过其 IP 地址直接通信(每个 pod 都有一个 IP)。服务是 Pod IP 之上的一种便利,它为您提供 DNS 和长期稳定的 IP,在大多数情况下更好。
【解决方案2】:

定义 ClusterIP:none 的服务称为headless service

对于定义选择器的无头服务,端点控制器在 API 中创建端点记录,并修改 DNS 配置以返回直接指向支持该服务的 Pod 的 A 记录(地址)

由于influxdb pod只有一个,不需要负载均衡,也不需要服务代理,请求直接路由到pod。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2017-07-15
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多