从另一个Pod Kubernetes访问Pod

时间:2019-04-24 18:17:52

标签: kubernetes

我创建了2个吊舱。一个是格拉法纳,另一个是潮豆荚。我需要在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进行访问吗?

2 个答案:

答案 0 :(得分:1)

我可以解释正在发生的事情以及为什么这样做,但是我仍然认为这种配置没有意义。

部署会创建一个运行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到达的,因此该Pod接受您的请求并得到答复。

答案 1 :(得分:0)

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

  

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

由于只有一个influxdb Pod,因此不需要对其进行负载平衡,因此也不需要服务代理,因此请求将直接路由到Pod。