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

Control the hostname of the POD deployed via Kubernetes

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

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

如果我使用 kubectl exec 进入 pod 并触发 "hostname" 命令,我会得到 "MyApp-100-deployment-n" 作为主机名,当我触发 "hostname --fqdn" 时,我会得到如下内容:

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

这些结果很好,但是当我用 JAVA 编写的应用程序现在已部署时尝试使用 InetAddress.getLocalHost().getHostName() 获取主机名,它会获取 pods 的整个 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 "." "" }}"

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

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

kubectl exec <pod-name> env

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