Kubernetes--Pod的DNS域名和相关特性
一、Pod的DNS域名
Pod作为集群中提供具体服务的实体,也可以像Service一样设置DNS域名。另外,系统为客户端应用Pod提供需要使用的DNS策略提供多种选择。
对Pod来说,Kubernetes会为其设置一个<pod-ip>.<namespace>.pod.<cluster-domain>格式的DNS域名,其中Pod IP部分需要用"-"替换"."符号,例如
系统为webapp-p598v这个pod设置的DNS域名为10-244-2-3.default.pod.cluster.local
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 3 2d17h 10.244.1.3 node3 <none> <none>
webapp-p598v 1/1 Running 0 3d3h 10.244.2.3 node4 <none> <none>
webapp-wj5q7 1/1 Running 0 3d3h 10.244.3.2 node2 <none> <none>
[root@master ~]# kubectl exec -it webapp-wj5q7 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@webapp-wj5q7:/usr/local/tomcat# ping 10-244-2-3.default.pod.cluster.local
PING 10-244-2-3.default.pod.cluster.local (10.244.2.3) 56(84) bytes of data.
64 bytes from 10-244-2-3.webapp.default.svc.cluster.local (10.244.2.3): icmp_seq=1 ttl=62 time=2.11 ms
64 bytes from 10-244-2-3.webapp.default.svc.cluster.local (10.244.2.3): icmp_seq=2 ttl=62 time=0.889 ms
^C
--- 10-244-2-3.default.pod.cluster.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.889/1.500/2.111/0.611 ms
root@webapp-wj5q7:/usr/local/tomcat#
对于Depoyment或Daemonset类型创建的Pod,Kubernetes会为每个Pod有以其IP地址和控制器名称设置一个DNS域名,格式<pod-ip>.<deployment/daemonset-name>.<namespace>.svc.<cluster-doamin>,其中Pod IP地址段字符串需要用“-”替代“.”符号,例如:
Pod地址为10.244.3.2,由ReplicationController部署名字为webapp,系统为这个Pod分配一个DNS域名为10-244-3-2.webapp.default.svc.cluster.local
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 4 2d17h 10.244.1.3 node3 <none> <none>
webapp-p598v 1/1 Running 0 3d4h 10.244.2.3 node4 <none> <none>
webapp-wj5q7 1/1 Running 0 3d4h 10.244.3.2 node2 <none> <none>
[root@master ~]# kubectl describe pod webapp-wj5q7
Name: webapp-wj5q7
Namespace: default
Priority: 0
Node: node2/192.168.31.102
Start Time: Sun, 29 Aug 2021 16:38:50 +0800
Labels: app=webapp
Annotations: <none>
Status: Running
IP: 10.244.3.2
IPs:IP: 10.244.3.2
Controlled By: ReplicationController/webapp
Containers:webapp:Container ID: docker://6058d7e0fee16e2e42d2cc3d1a571a388f91ffe14d2f9544681ed39edd21a5f9Image: tomcatImage ID: docker-pullable://tomcat@sha256:1af502b6fd35c1d4ab6f24dc9bd36b58678a068ff1206c25acc129fb90b2a76aPort: 8080/TCPHost Port: 0/TCPState: RunningStarted: Sun, 29 Aug 2021 16:39:06 +0800Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-27gz8 (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:default-token-27gz8:Type: Secret (a volume populated by a Secret)SecretName: default-token-27gz8Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>
[root@master ~]# kubectl exec -it webapp-p598v bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@webapp-p598v:/usr/local/tomcat# ping 10-244-3-2.webapp.svc.cluster.local
ping: 10-244-3-2.webapp.svc.cluster.local: Name or service not known
root@webapp-p598v:/usr/local/tomcat# ping 10-244-3-2.webapp.default.svc.cluster.local
PING 10-244-3-2.webapp.default.svc.cluster.local (10.244.3.2) 56(84) bytes of data.
64 bytes from 10-244-3-2.webapp.default.svc.cluster.local (10.244.3.2): icmp_seq=1 ttl=62 time=0.580 ms
64 bytes from 10-244-3-2.webapp.default.svc.cluster.local (10.244.3.2): icmp_seq=2 ttl=62 time=1.37 ms
^C
--- 10-244-3-2.webapp.default.svc.cluster.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.580/0.975/1.371/0.396 ms
二、为Pod自定义hostname和subdomain
在默认情况下,Pod的名称将被系统设置为容器环境内的主机名称(hostname),但通过副本控制器创建的名称会有一段随机的后缀名,无法固定,此时可以通过在Pod yaml配置文件中设置hostname字段定义容器环境的主机名。同时可以设置subdomain字段定义容器环境的子域名。
apiVersion: v1
kind: Pod
metadata:name: my-webapplabels:app: my-webapp
spec:hostname: my-webappsubdomain: mysubdomaincontainers:- name: my-webappimage: kubeguide/tomcat-app:v1ports:- containerPort: 8080
查看创建的这个Pod:
[root@master ~]# kubectl get pod my-webapp
NAME READY STATUS RESTARTS AGE
my-webapp 1/1 Running 0 33s
[root@master ~]#
查看你Pod的IP地址
root@master ~]# kubectl get pod my-webapp -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-webapp 1/1 Running 0 73s 10.244.3.5 node2 <none> <none>
在Pod创建成功之后,Kubernetes系统为其设置的DNS域名为"my-webapp.mysubdomain.default.svc.cluster.local"
kubectl exec -it my-webapp bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@my-webapp:/usr/local/tomcat# 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.244.3.5 my-webapp.mysubdomain.default.svc.cluster.local my-webapp
为了是集群内其它应用能够访问Pod的DNS域名,还需要部署一个Headless Service,其服务名称为Pod的子域名(subdomain),这样系统就会在DNS服务器中自动创建相应的DNS记录。
apiVersion: v1
kind: Service
metadata:name: mysubdomain
spec:selector:app: my-webappclusterIP: Noneports:- port: 8080
在其它应用Pod中输入 curl <Pod.hostname>.mysubdomian.defalut.svc.cluster.local:8080可以访问
三、Pod中的DNS策略
Kubernetes可以在Pod级别通过dnsPolicy字段设置DNS策略,目前支持的DNS策略如下:
- Default:继承Pod所在宿主机的域名解析设置
- ClusterFirst:优先使用Kubernetes环境的DNS服务(如果CoreDNS提供的域名解析服务),将无法解析的域名转发到系统配置的上游DNS服务器
- ClusterFirstWithHostNet:适用于以hostNetwork模式运行的Pod。
- Node:忽略Kubernetes的DNS配置,需要手工通过dnsConfig自定义DNS配置
apiVersion: v1 kind: Pod metadata:name: nginx spec:containers:- name: nginximage: nginxhostNetwork: truednsPolicy: ClusterFirstWithHostNet
四、Pod中的DNS策略在默认情况下,系统会自动为Pod配置好域名服务其等DNS参数,Kubernetes也提供Pod定义中由用户自定义DNS相关配置的方法。可以通过在Pod定义中设置dnsConfig自动进行DNS相关配置。该字段是可选字段,在dnsPolicy为任意策略时都可以设置,但是当dnsPolicy="None"时必须设置。自定义DNS可以设置内容:- nameservers:用于域名解析的DNS服务器列表,最多可以设置3个。当Pod的dnsPolicy="None"时,该nameservers列表必须包含至少一个IP地址。配置的nameserver列表会与系统自动设置的nameserver进行合并和去重
- searches:用于域名搜索的DNS域名后缀,最多设置6个,也会与系统设置的合并和去重
- options:配置其它DNS参数,例如,timeout等等
apiVersion: v1 kind: Pod metadata:name: custom-dns spec:containers:- name: custom-dnsimage: tomcatimagePullPolicy: IfNotPresentports:- containerPort: 8080dnsPolicy: "None"dnsConfig:nameservers:- 8.8.8.8searches:- ns1.svc.cluster-domain.example- my.dns.search.suffixoptions:- name: ndotsvalue: "2"- name: edns0
在Pod成功创建后,容器内的配置文件/etc/resolv.conf的内容将被系统设置如下:
root@custom-dns:/etc# cat resolv.conf nameserver 8.8.8.8 search ns1.svc.cluster-domain.example my.dns.search.suffix options ndots:2 edns0
Kubernetes--Pod的DNS域名和相关特性相关推荐
- 使用 CoreDNS sidecar 来优化 Kubernetes Pod dns 性能
简介:介绍一种给业务 Pod 添加 dns cache sidecar 来增强 dns 性能的方法. kubernetes 集群内,应用可能会遇到 dns 性能问题.可以在 Pod 内增加 nscd ...
- 【重识云原生】第六章容器基础6.4.9.6节——Service 与 Pod 的DNS
1 Service 与 Pod 的 DNS Kubernetes 为 Service 和 Pod 创建 DNS 记录. 你可以使用一致的 DNS 名称而非 IP 地址访问 Service. Kuber ...
- k8s技术预研7--深入掌握Kubernetes Pod
目录 1.Yaml格式的Pod定义文件完整模板详解 2.Pod的基本用法 2.1 由1个容器组成的Pod示例 2.2 由两个为紧耦合关系的容器打包组成的Pod示例 3.静态Pod ...
- 在Kubernetes Pod中使用Service Account访问API Server
2019独角兽企业重金招聘Python工程师标准>>> 在Kubernetes Pod中使用Service Account访问API Server 博客分类: Kubernetes ...
- linux 子域dns,linux下搭建DNS子域及相关授权详解
linux下搭建DNS子域及相关授权详解forward功能是本地无法解析的域名,转发给指定DNS服务器 forward only; 所有无法解析的域名,都转发给指定DNS服务器,必须有解析结果 for ...
- 浅析Kubernetes Pod重启策略和健康检查
使用Kubernetes的主要好处之一是它具有管理和维护集群中容器的能力,几乎可以提供服务零停机时间的保障.在创建一个Pod资源后,Kubernetes会为它选择worker节点,然后将其调度到节点上 ...
- Kubernetes学习总结(11)—— Kubernetes Pod 到底是什么?
前言 [译]What are Kubernetes Pods Anyway?最近看到了一条关于Kubernetes Pods的推特,来自了不起的Amy Codes(我真的希望这是她的真名): 虽然不是 ...
- linux下搭建DNS子域及相关授权详解
linux下搭建DNS子域及相关授权详解 forward功能是本地无法解析的域名,转发给指定DNS服务器 forward only; 所有无法解析的域名,都转发给指定DNS服务器,必须有解析结果 fo ...
- Kubernetes pod的生命周期
本文翻译自:Kubernetes: Lifecycle of a Pod 原文出处:Kubernetes: Lifecycle of a Pod - DZone Integration 参考:Cont ...
最新文章
- scala akka 修炼之路5(scala特质应用场景分析)
- VC++ 获取系统时间的方法汇总
- oracle用户权限的管理
- 塑云科技基于 KafKa+OTS+MaxCompute 完成物联网系统技术重构
- 网页特效代码大全网址
- Zend Studio 12.5.1 破解、注册码
- Django-天天生鲜项目
- Golang代码注释规范及goland代码注释模板配置
- 软考备考-系统构架师-21-系统架构师考纲整理
- c语言二次方程的实根,C程序求二次方程的根
- nginx错误502,503,504分析
- IOS 四舍五入 进一法 去尾法
- golang:goredis库pipeline使用方式
- python实现字符串去重
- 前端工程师为什么会这么值钱?原来真相在这里
- html5中检测网络状态的方法,前端js监听浏览器网络变化
- 瀚海星云BBS python脚本登陆
- css 交集选择器 并集选择器 后代选择器
- 基于LCC谐振补偿网络的无线充电技术的研究
- Ps中的钢笔工具和快速选择工具
热门文章
- 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组
- VS2010启动后鼠标失灵解决方法
- 求不定积分的系列题型(一)
- 西瓜视频直播助手下载与安装过程 0523
- s32k144 isystem linux,S32k144 简易 Bootloader
- SQL注入靶场 RedTiger通关教程(level1~level10)
- windows画图板 ESL转RGB 实现区间渐变色
- python向自己qq邮件发信息_python实现自动向QQ邮箱发送天气预报邮件
- 解决OneDrive卸载后重新安装无法启动或闪退的问题
- 课题:shell脚本安装httpd