k8s pod的dns域名

简介: 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

在这里插入图片描述


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


对于以DeploymentDaemonset类型创建的PodKubernetes会为每个Pod 都以其IP地址和控制器名称设置一个DNS域名,格式为 <pod-ip>.<deployment/daemonset-name>.<namespace>.svc.<cluster-domain>Pod IP地址段字符串需要用 “-” 替换 “.”符号,例如下面PodIP地址为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,可以通过登录Podwebapp1‘ 查看 /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详情:
在这里插入图片描述
此时,其他应用就可以通过PodDNS域名"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配置

下面是一个使用了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文件中nameserverIP地址也会以 IPv6格式进行表示,例如:

nameserver fd00:79:30:a
search default.svc.cluster-domain.example svc.cluster-domain.example cluster-domain.example
options ndots:5
目录
相关文章
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
630 25
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
587 12
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
4577 11
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
350 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
422 1
|
数据建模 网络安全
阿里云SSL证书不同类型DV、OV和EV如何收费?单域名和通配符SSL价格整理
阿里云SSL证书提供免费和收费版本,涵盖DV、OV、EV多种类型。收费证书品牌包括DigiCert、GlobalSign等,价格从238元/年起。免费SSL证书由Digicert提供,单域名有效3个月,每个实名主体每年可领取20个。具体价格和详情见阿里云SSL官方页面。
|
人工智能
2024年阿里云域名热搜词大盘点
2024年阿里云域名热搜词大盘点
692 3
|
数据建模 网络安全
阿里云SSL证书不同类型DV、OV和EV如何收费?单域名和通配符SSL价格整理
阿里云SSL证书提供免费和收费选项。收费证书包括:DV单域名WoSign 238元/年,DigiCert通配符DV 1500元/年,GlobalSign OV企业型1864元/年等。免费SSL证书由Digicert提供,有效期3个月,每年可领取20个单域名证书。更多详情及价格表请参考阿里云官方页面。
|
弹性计算 移动开发 安全
阿里云域名注册、续费收费标准价格表及最新优惠口令获取及使用教程参考
阿里云域名注册和续费收费标准在9月份随着全球域名价格的上涨,域名收费标准也做了调整,目前阿里云的.com英文域名的注册价格为83元,续费收费标准为90元,为了让更多用户在注册和续费时价格能更加实惠,阿里云推出了域名优惠口令活动,域名优惠口令适合在域名注册和续费时使用,使用优惠口令通常可以使注册和续费价格减免几元到十几元不等,例如使用优惠口令续费.com域名就可减少5元。本文为大家展示目前阿里云域名注册和续费的最新收费标准以及如何领取和使用域名优惠口令的相关教程,以供参考。
4363 11

相关产品

  • 云解析DNS
  • 推荐镜像

    更多