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

时间:2019-07-18 09:13:54

标签: java docker kubernetes kubernetes-helm kubernetes-pod

我正在尝试使用头盔图表来部署我的应用程序。我已经在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的全部信息,而不是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 "." "" }}"

1 个答案:

答案 0 :(得分:2)

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

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

kubectl exec <pod-name> env

为什么使用InetAddress.getLocalHost().getHostName()不是检索主机名的正确方法的解释是here