簡體   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