我需要创建Kubernetes服务,它们的nodePort由K8S自动分配,并且port/targetPort必须等于nodePort。(该需求来自spark YARN节点作为服务后端的规范)。也许我可以首先使用固定的虚拟端口/targetPort和自动分配的nodePort创建服务,然后更新服务以将port/targetPort设置为与nodePort相同的值。但是有没有更好的办法呢?
在k8s上公开资源有两种主要方法
第一个使用kubectl expose
命令:使用这个命令,您可以选择要公开的pod/deploy,但不能选择nodePort值。然后,正如您已经知道的,您必须在创建的yaml
上设置nodeport值。另一种方法是使用kubectl create service nodeport
命令:使用这个命令,您可以设置端口,目标端口和nodeport。
如果您知道要公开的pod的标签(例如app: superPod
),您可以创建一个文件,然后替换标签(例如TOREPLACE
)。使用所选端口的值(例如30456):
在linux上:
portValue=30456 && k create service nodeport TOREPLACE
--node-port=$portValue --tcp=$portValue --dry-run=client -oyaml > file.yaml
&& sed -i 's/app: TOREPLACE/app: yourselector/g' file.yaml
&& sed -i 's/name: TOREPLACE/name: yourselector-name/g' file.yaml
这将创建具有首选值的文件。
之后,你可以使用kubectl -f file.yaml apply
应用文件但是,根据您的需要,如果您想要可靠地定制您的资源,您可以尝试使用:
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/或https://helm.sh/docs/
希望有帮助。