01 引言
声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记
Pod作为集群中提供具体服务的实体,也可以像Service一样设置DNS域名。 另外,系统为客户端应用Pod需要使用的DNS策略提供了多种选择。
02 Pod的DNS域名
对Pod来说,Kubernetes会为其设置一个<pod-ip>.<namespace>.pod.<cluster-domain>
格式的DNS域名,其中Pod IP部分需要用 “-
” 替换 “.
” 符号,例如下面Pod的IP地址为10.0.95.63
:
系统为这个Pod设置的DNS域名为10-0-95-63.default.pod.cluster.local
,用 nslookup
进行验证,便可以成功解析该域名的IP地址为10.0.95.63
:
对于以Deployment或Daemonset类型创建的Pod,Kubernetes会为每个Pod 都以其IP地址和控制器名称设置一个DNS域名,格式为 <pod-ip>.<deployment/daemonset-name>.<namespace>.svc.<cluster-domain>
,Pod IP地址段字符串需要用 “-
” 替换 “.
”符号,例如下面Pod的IP地址为10.0.95.48
:
系统为这个Pod设置的DNS域名为10-0-95-48.demo- app.default.svc.cluster.local
,用nslookup进行验证,便可以成功解析该域名的IP 地址为10.0.95.48
:
03 为Pod自定义hostname和subdomain
在默认情况下,Pod的名称将被系统设置为容器环境内的主机名称 (hostname),但通过副本控制器创建的Pod名称会有一段随机后缀名,无法固定,此时可以通过在Pod yaml配置中设置hostname字段定义容器环境的主机名。 同时,可以设置subdomain字段定义容器环境的子域名。
3.1 定义pod
通过下面的Pod定义,将会在Pod容器环境中设置主机名为"webapp-1
",子域名为"mysubdomain
":
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的IP地址:
在Pod创建成功之后,Kubernetes系统为其设置的DNS域名(FQDN)为 “webapp-1.mysubdomain.default.svc.cluster.local
”,可以通过登录Pod “webapp1‘ 查看 /etc/hosts
文件的记录:
3.2 定义Headless Service
为了使集群内的其他应用能够访问Pod的DNS域名,还需要部署一个Headless Service,其服务名称为Pod的子域名(subdomain),这样系统就会在DNS服务器中自动创建相应的DNS记录。
Headless Service的定义如下,名称(name)被设置为Pod的子域名 “mysubdomain”:
apiVersion: v1 kind: Service metadata: name: mysubdomain spec: selector: app: webapp clusterIP: None ports: - port:8080
创建完Headless Service之后,查看该Service详情:
此时,其他应用就可以通过Pod的DNS域名“webapp--1.mysubdomain.default.svc.cluster.local
”访问Pod的服务了:
04 Pod的DNS策略
Kubernetes可以在Pod级别通过dnsPolicy字段设置DNS策略。
目前支持的DNS策略如下:
策略 | 描述 |
Default | 继承Pod所在宿主机的域名解析设置 |
ClusterFirst | 优先使用Kubernetes环境的DNS服务(如:CoreDNS提供的域名解析服务),将无法解析的域名转发到系统配置的上游DNS服务器 |
Cluster FirstWithHostNet | 适用于以hostNetwork模式运行的Pod |
None | 忽略Kubernetes集群的DNS配置,需要手工通过dnsConfig自定义DNS配置 |
下面是一个使用了hostNetwork的Pod,其dnsPolicy设置为"ClusterFirstWithHostNet
":
apiversion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx hostNetwork: true dnsPolicy: ClusterFirstWithHostNet
05 Pod中的自定义DNS配置
在默认情况下,系统会自动为Pod配置好域名服务器等DNS参数,此外Kubernetes也提供在Pod定义中由用户自定义DNS相关配置的方法。
这可以通过在Pod定义中设置dnsConfig
字段进行DNS相关配置。该字段是可选字段,在 dnsPolicy
为任意策略时都可以设置,但是当dnsPolicy=“None“
时必须设置。
自定义DNS可以设置以下内容:
- nameservers:用于域名解析的DNS服务器列表,最多可以设置3个。当Pod的insPolicy=“None“时,该nameserver列表必须包含至少一个IP地址,配置的nameserver列表会与系统自动设置的nameserver进行合并和去重;
- searches:用于域名搜索的DNS域名后缀,最多可以设置6个,也会与系统自动设置的search列表进行合并和去重;
- options:配置其他可选DNS参数,例如ndots、timeout等,以name或name/value对的形式表示,也会与系统自动设置的option列表进行合并和去重。
以下面的dnsConfig为例:
apiVersion: v1 kind: Pod metadata: name: custom-dns spec: containers: - name: custom-dns image: tomcat imagePullPolicy: IfNotPresent ports: - containerPort: 8080 dnsPolicy: "None" dnsConfig: nameservers: - 8.8.8.8 searches: - ns1.svc.cluster-domain.example - my.dns.search.suffix options: - name: ndots - value: "2" - name: edns0
在Pod成功创建后,容器内DNS配置文件/etc/resolv.conf
的内容将被系统设置如下:
nameserver 8.8.8.8 search nsl.svc.cluster.local my.dns.search.suffix options ndots:2 edns0
在IPv6环境中,Pod内/etc/resolv.conf
文件中nameserver的IP
地址也会以 IPv6
格式进行表示,例如:
nameserver fd00:79:30:a search default.svc.cluster-domain.example svc.cluster-domain.example cluster-domain.example options ndots:5