【问题标题】:Control the hostname of the POD deployed via Kubernetes控制通过 Kubernetes 部署的 POD 的主机名
【发布时间】:2019-11-27 04:24:31
【问题描述】:

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

部署后,当我触发“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() 获取主机名时,它会获取 pod 的整个 fqdn,而不是 pod 的主机名。这是困扰我的事情。为什么 Java InetAddress 无法仅获取主机名? 是否有任何与 yaml 文件中的配置相关的方法不允许无头服务修改主机名?最终,我只需要 Java 代码中的主机名而不是 fqdn 来进行处理。

如果我从 deployment.yaml 中删除无头服务名称并部署应用程序并从容器内部触发主机名和主机名 --fqdn 命令,我只会得到“MyApp-100-deployment-n”作为两者的结果.添加headless服务只是引入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 "." "" }}"

【问题讨论】:

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


    【解决方案1】:

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

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

    kubectl exec <pod-name> env
    

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

    【讨论】:

    • 谢谢@wolmi。我将依赖这个 HOSTNAME 变量。这将起作用。
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 2019-01-27
    • 2020-08-29
    • 2020-07-20
    • 2020-02-13
    • 1970-01-01
    • 2021-09-13
    • 2021-10-16
    相关资源
    最近更新 更多