在默认情况下,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权威指南(第五版)》