繁体   English   中英

控制通过Kubernetes部署的POD的主机名

[英]Control the hostname of the POD deployed via Kubernetes

我正在尝试使用掌舵图表来部署我的应用程序。 我已经在deployment.yaml下将statefulSet定义为一种,并在spec.serviceName下提供了无头服务。 下面给出了deployment.yaml的代码片段。

部署后,当我启动“ kubectl get pods”时,其基于副本显示POD名称为“ MyApp-100-deployment-n”,其中n> = 0。

如果我使用kubectl exec进入吊舱,并启动“ hostname”命令,则获得“ MyApp-100-deployment-n”作为主机名,而当我启动“ hostname --fqdn”时,则得到如下信息:

MyApp-100-deployment-n.<name of Service>.<Namespace>.svc.cluster.local

这些结果很好,但是当我用JAVA编写并已部署的应用程序现在尝试使用InetAddress.getLocalHost().getHostName()获取主机名时,它将获取pod的整个fqdn,而不是pod的主机名。 这让我很困扰。 为什么Java InetAddress无法仅获取主机名? 是否有任何与yaml文件中的配置有关的方法,以允许无头服务修改主机名? 最终,我只需要Java代码中的主机名而不是fqdn即可进行处理。

如果我从Deployment.yaml中删除无头服务名称并部署该应用程序,然后从容器内部启动主机名和主机名--fqdn命令,则两者的结果均为“ MyApp-100-deployment-n”。 添加无头服务只是引入了fqdn。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: "{{ .Chart.Name }}-{{ .Chart.AppVersion | replace "." "" }}-deployment"
  labels:
    app: Myapp-deployment
{{ include "metadata.labels.standard" . | indent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: "{{ .Chart.Name }}-{{ .Chart.AppVersion | replace "." "" }}"
  serviceName: "{{ .Chart.Name }}-{{ .Chart.AppVersion | replace "." "" }}"

您可以使用每个容器中存在的env变量HOSTNAME ,并且仅提供主机名。

另外,尝试在任何Pod上执行env以查看所有可用变量

kubectl exec <pod-name> env

为什么使用的说明InetAddress.getLocalHost().getHostName()不是检索主机的正确的方法是在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM