在kubernetes中使用hostNetwork时是否可以将主机名设置为Pod?

时间:2018-04-16 14:11:42

标签: kubernetes

我是Kubernetes的新手,最近我用它来部署hadoop。我想做一个将特定主机名设置为pod的事情,该事件是使用statefulSets hostNetwork = true创建的。

这是我的yaml配置文件。

apiVersion: v1
kind: Service
metadata:
  name: test-bbox
  labels:
    app: test-bbox
spec:
  clusterIP: None
  selector:
    app: test-bbox
  ports:
  - name: foo
    port: 1234
    targetPort: 1234
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: test-bbox
spec:
  serviceName: "test-bbox"
  replicas: 1
  selector:
    matchLabels:
      app: test-bbox
  template:
    metadata:
      labels:
        app: test-bbox
    spec:
      hostNetwork: true
      hostname: test-hostname
      containers:
        - image: busybox
          name: busybox
          env:
          - name: MY_POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          command:
            - sleep
            - "7200"

正如yaml所说,属性hostnetwork设置为true。然后,pod test-bbox-0的主机名是创建它的节点的主机名。

如果我将hostnetwork设置为false,则statefulSets会自动生成主机名,格式为test-bbox-0.test-bbox.default.svc.cluster.local,这是我需要的。

但在我的情况下,我需要将hostnetwork设置为true,同时将主机名自定义为上述格式而不是Node的主机名。

所以问题是,有没有办法为Pod定制主机名?

使用的Kubernetes版本:1.9

1 个答案:

答案 0 :(得分:1)

无法为使用hostNetwork的Pod设置主机名。如果您尝试更改此类Pod中的主机名,您将看到您正在更改节点的主机名;这是因为他们正在分享UTS namespace,而不仅仅是networking

StatefulSet管理的窗格是一种特殊情况,其主机名设置为我的StatefulSet,无法直接配置。通过适当地命名服务,主机名可以受到StatefulSet本身的名称和域名的影响:

  

StatefulSet中的每个Pod都从StatefulSet的名称和Pod的序号中获取其主机名。构造的主机名的模式为$(statefulset name)-$(ordinal)。 [...] StatefulSet可以使用无头服务来控制其Pod的域。此服务管理的域采用以下格式:$(service name).$(namespace).svc.cluster.local,其中cluster.local是群集域。在创建每个Pod时,它会获取匹配的DNS子域,采用以下格式:$(podname).$(governing service domain),其中管理服务由StatefulSet上的serviceName字段定义。