首页 文章

kubernetes Deployment可以将服务节点端口注入环境变量吗?

提问于
浏览
4

在服务yaml文件中,您可以使用jsonpath选择命名的nodeport值,如下所示:

- name: MY_NODE_PORT
      valueFrom:
        fieldRef:
          fieldPath: spec.ports[?(@.name=="http")].nodePort

但是,在我的部署yaml文件中,我希望有一个像上面的 MY_NODE_PORT 这样的环境变量,它暴露给容器到pod . 我碰巧将我的服务和部署合并到一个文件中,以便 kubectl create -f . 是否可以在部署部分中选择命名服务节点端口,而不是在服务部分中?

我的目的是将Kubernetes服务和部署注册到遗留服务发现机制,在本例中为Netflix OSS Eureka .

2 回答

  • 1

    您在容器中自动拥有许多环境变量 . 您需要确保您的部署创建了服务 before .

    例如,对于名为mysql的服务(在同一名称空间中),您将拥有如下变量:

    MYSQL_PORT="tcp://10.96.0.3:3306"
    MYSQL_PORT_3306_TCP="tcp://10.96.0.3:3306"
    MYSQL_PORT_3306_TCP_ADDR="10.96.0.3"
    MYSQL_PORT_3306_TCP_PORT="3306"
    MYSQL_PORT_3306_TCP_PROTO="tcp"
    MYSQL_SERVICE_HOST="10.96.0.3"
    MYSQL_SERVICE_PORT="3306"
    MYSQL_SERVICE_PORT_MYSQL="3306"
    

    作为替代方案,您还可以使用cluster DNS服务特别关注SRV记录) .

  • 1

    Janos Lenart的回答和Marc Sluiter所述,服务和部署是不同的资源,可以在单独的文件中轻松指定 . 他们彼此没有直接的了解,即使您将服务命名为NodePort端口,除非您明确指定服务NodePort端口值(例如,从30000到32767之间),否则您将无法指定pod环境变量应该是匹配它 . 虽然你可以像这样硬编码NodePort端口值,如Janos Lenart所示,但它很脆弱,不推荐 .

    虽然Kubernetes为pod提供了许多方便的环境变量,但pod环境变量不可能引用由kubernetes动态分配的服务nodeport端口值 .

    但是,Pod does 可以访问Kubernetes API服务器,API服务器将能够回复有关服务的信息,例如nodeport . 因此,Pod可以向API服务器请求服务的NodePort端口值 . 我创建了一个kubernetes service and deployment with simple sidecar pod作为概念证明 .

    My example here处理使用(外部或内部)Netflix OSS Eureka服务注册表注册Kubernetes NodePort服务 . 这可能对其他人有用,可以将Kubernetes与其他传统服务发现机制联系起来 .

相关问题