我是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
答案 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
字段定义。