k8s教程(service篇)-pod的dns域名

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


文章目录

  • ​​01 引言​​
  • ​​02 Pod的DNS域名​​
  • ​​03 为Pod自定义hostname和subdomain​​
  • ​​3.1 定义pod​​
  • ​​3.2 定义Headless Service​​
  • ​​04 Pod的DNS策略​​
  • ​​05 Pod中的自定义DNS配置​​

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​:

k8s教程(service篇)-pod的dns域名_kubernetes


系统为这个Pod设置的DNS域名为​​10-0-95-63.default.pod.cluster.local​​​,用 ​​nslookup​​进行验证,便可以成功解析该域名的IP地址为​​10.0.95.63​​:

k8s教程(service篇)-pod的dns域名_云原生_02


对于以DeploymentDaemonset类型创建的PodKubernetes会为每个Pod 都以其IP地址和控制器名称设置一个DNS域名,格式为 ​<pod-ip>.<deployment/daemonset-name>.<namespace>.svc.<cluster-domain>​,Pod IP地址段字符串需要用 “​​-​​​” 替换 “​​.​​”符号,例如下面PodIP地址为​​10.0.95.48​​:

k8s教程(service篇)-pod的dns域名_容器化技术_03


系统为这个Pod设置的DNS域名为​10-0-95-48.demo- app.default.svc.cluster.local​,用nslookup进行验证,便可以成功解析该域名的IP 地址为​​10.0.95.48​​:

k8s教程(service篇)-pod的dns域名_kubernetes_04

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地址:

k8s教程(service篇)-pod的dns域名_云原生_05


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

k8s教程(service篇)-pod的dns域名_DNS_06

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详情:

k8s教程(service篇)-pod的dns域名_Pod_07


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

k8s教程(service篇)-pod的dns域名_DNS_08

04 Pod的DNS策略

Kubernetes可以在Pod级别通过dnsPolicy字段设置DNS策略

目前支持的DNS策略如下:

策略

描述

Default

继承Pod所在宿主机的域名解析设置

ClusterFirst

优先使用Kubernetes环境的DNS服务(如:CoreDNS提供的域名解析服务),将无法解析的域名转发到系统配置的上游DNS服务器

Cluster FirstWithHostNet

适用于以hostNetwork模式运行的Pod

None

忽略Kubernetes集群的DNS配置,需要手工通过dnsConfig自定义DNS配置

下面是一个使用了hostNetworkPod,其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


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s