在服务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。
答案 0 :(得分:1)
容器中自动拥有许多环境变量。您需要确保在部署之前创建服务。
例如,对于名为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 :(得分:1)
与Janos Lenart的回答和Marc Sluiter一样,服务和部署是不同的资源,可以在单独的文件中轻松指定。他们彼此之间没有直接的了解,即使您将服务命名为NodePort端口,除非您明确指定服务NodePort端口值(例如,从30000到32767之间),否则您将无法指定pod环境变量应该匹配它。虽然您可以像Janos Lenart建议的那样对NodePort端口值进行硬编码,但它很脆弱,不推荐使用。
虽然Kubernetes为pod提供了许多方便的环境变量,但pod环境变量不可能引用由kubernetes动态分配的服务nodeport端口值。
但是,Pod 有权与Kubernetes API服务器通信,并且API服务器将能够回复有关该服务的信息,例如nodeport。因此,Pod可以向API服务器请求服务的NodePort端口值。我创建了kubernetes service and deployment with simple sidecar pod作为概念证明。
My example here处理使用(外部或内部)Netflix OSS Eureka服务注册表注册Kubernetes NodePort服务。这可能对其他人有用,可以将Kubernetes与其他传统服务发现机制联系起来。