在默认情况下,Pod 的名称将被系统设置为容器环境内的主机名称(hostname),但通过副本控制器创建的 Pod 名称会有一段随机后缀名,无法固定,此时可以通过 Pod yaml 配置中设置 hostname 字段定义容器环境的主机名。同时,可以设置 subdomain字段定义容器环境的子域名。

通过下面文件对的 Pod 定义,将会在 Pod 容器环境中设置主机名为“webapp-1”,子域名为“mysubdomain”。pod-hostname-subdomain.yaml文件内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: webapp1
  labels:
    app: webapp1
spec:
  hostname: webapp-1
  subdomain: mysubdomain
  containers:
    - name: webapp1
      image: kubeguide/tomcat-app:v1
      ports:
      - containerPort: 8080

创建这个Pod:

[root@master1 ~]# kubectl create -f pod-hostname-subdomain.yaml 
pod/webapp1 created

查看这个Pod 的IP地址为“10.0.104.37”:

[root@master1 ~]# kubectl get pod -l app=webapp1 -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
webapp1   1/1     Running   0          23m   10.0.104.37   node2   <none>           <none>

在 Pod创建成功后,Kubernetes系统为其设置的DNS域名(FQDN)为“webapp-1.mysubdomain.default.svc.cluster.local”,可以通过登录Pod“webapp1”查看/etc/hosts文件的记录:

[root@master1 ~]# kubectl exec -it webapp1 -- cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1        localhost
::1        localhost ip6-localhost ip6-loopback
fe00::0        ip6-localnet
fe00::0        ip6-mcastprefix
fe00::1        ip6-allnodes
fe00::2        ip6-allrouters
10.0.104.37        webapp-1.mysubdomain.default.svc.cluster.local        webapp-1

为了使集群内的其他应用真够访问Pod的DNS域名,还需要部署一个Headless Service,其服务名为Pod的子域名(subdomain),这样系统就会在DNS服务器中自动创建相应的DNS记录。
headless-service.yaml的定义如下,名称(name)被设置为Pod 的子域名“mysubdomain”:

apiVersion: v1
kind: Service
metadata:
  name: mysubdomain
spec:
  selector:
    app: webapp1
  clusterIP: None
  ports:
  - port: 8080

创建该 Headless Service:

[root@master1 ~]# kubectl create -f headless-service.yaml 
service/mysubdomain created

查看该Service的详情,可见其Endpoint为Pod的IP(10.0.104.37),Selector为app=webapp1,表示选择刚刚执行kubectl get pod -l app=webapp1 -o wide看到的pod:

[root@master1 ~]# kubectl describe service mysubdomain 
Name:              mysubdomain
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=webapp1
Type:              ClusterIP
IP:                None
Port:              <unset>  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.0.104.37:8080
Session Affinity:  None
Events:            <none>

此时,其他应用就可以通过Pod的DNS域名“webapp-1.mysubdomain.default.svc.cluster.local”访问Pod的服务了:

[root@master1 ~]# kubectl exec -it busybox -- nslookup webapp-1.mysubdomain.default.svc.cluster.local
Server:    172.16.0.254
Address 1: 172.16.0.254 kube-dns.kube-system.svc.cluster.local

Name:      webapp-1.mysubdomain.default.svc.cluster.local
Address 1: 10.0.104.37 webapp-1.mysubdomain.default.svc.cluster.local
[root@master1 ~]# 
[root@master1 ~]# kubectl exec -it centos -- curl webapp-1.mysubdomain.default.svc.cluster.local:8080



<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.0.35</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>

参考《Kubernetes权威指南(第五版)》