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

简介: k8s教程(service篇)-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
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
23天前
|
前端开发 编解码 数据格式
浅谈响应式编程在企业级前端应用 UI 开发中的实践
浅谈响应式编程在企业级前端应用 UI 开发中的实践
20 0
浅谈响应式编程在企业级前端应用 UI 开发中的实践
|
1月前
|
存储 并行计算 前端开发
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术(二)
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术
39 1
|
1月前
|
数据安全/隐私保护 C++ 容器
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术(一)
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术
47 0
|
1月前
|
缓存 网络协议 Linux
【Shell 命令集合 网络通讯 】Linux 配置DNS dnsconf 命令 使用教程
【Shell 命令集合 网络通讯 】Linux 配置DNS dnsconf 命令 使用教程
39 0
|
2天前
|
C语言
循坏语句解析(C语言零基础教程)
循坏语句解析(C语言零基础教程)
|
12天前
|
人工智能 并行计算 PyTorch
Stable Diffusion 本地部署教程:详细步骤与常见问题解析
【4月更文挑战第12天】本教程详细介绍了如何在本地部署Stable Diffusion模型,包括安装Python 3.8+、CUDA 11.3+、cuDNN、PyTorch和torchvision,克隆仓库,下载预训练模型。配置运行参数后,通过运行`scripts/run_diffusion.py`生成图像。常见问题包括CUDA/CuDNN版本不匹配、显存不足、API密钥问题、模型加载失败和生成质量不佳,可按教程提供的解决办法处理。进阶操作包括使用自定义提示词和批量生成图像。完成这些步骤后,即可开始Stable Diffusion的AI艺术创作。
32 2
|
15天前
|
存储 Kubernetes 调度
Kubernetes Pod生命周期
Kubernetes Pod生命周期
25 0
Kubernetes Pod生命周期
|
15天前
|
存储 Kubernetes 应用服务中间件
Kubernetes Pod
Kubernetes Pod
47 0
Kubernetes Pod
|
26天前
|
存储 Kubernetes 调度
K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)
本文全面探讨了Kubernetes集群中Pod的四种关键机制——Pod亲和性、污点(Taints)、容忍度(Tolerations)、生命周期以及健康探测,为读者提供了深入理解并有效应用这些特性的指南。
|
26天前
|
Kubernetes 网络协议 Perl
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
25 0

推荐镜像

更多