在服务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 回答
您在容器中自动拥有许多环境变量 . 您需要确保您的部署创建了服务 before .
例如,对于名为mysql的服务(在同一名称空间中),您将拥有如下变量:
作为替代方案,您还可以使用cluster DNS服务特别关注SRV记录) .
如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与其他传统服务发现机制联系起来 .