使用云厂家提供托管式Kubernetes,Pod的域名解析参数,通过界面创建Pod的话,可能厂商界面没有开放dnsConfig配置,采用了一些默认值,在使用时候,需要了解清楚厂商提供的默认配置,否则会存在问题。
典型的一个配置是 ndots ,如果你在Pod内访问的域名字符串, 点 数量在 ndots 阈值范围内,则被认为是Kubernetes集群内部域名,会被追加 . < namespace > .svc.cluster.local 后缀,这样会导致每次解析域名时候有2次(IP4/IP6)无效解析,在大规模并发场景下存在性能瓶颈。
云厂商一般将Kubernetes的DNS服务(CoreDNS或SkyDNS)与厂商提供的外部DNS级联了,因此这种问题再功能测试阶段不会被暴露,只在性能测试阶段能暴露出来。
### DNS查找原理与规则
DNS域名解析配置文件 /etc/resolv.conf
nameserver 10.247.x.x
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:3
参数说明
### Kubernetes的dnsConfig配置说明
#### dnsPolicy域名解析的几种场景应用
对应的容器中的deployment的yaml中的dnsPolicy有三种配置参数ClusterFirst, Default, None
##### 1. 场景1-采用自定义DNS
采用自己建的DNS来解析Pods中的应用域名配置,可以参考以下代码配置,此配置在Pod中的DNS可以完全自定义,适用于已经有自己建的DNS,迁移后的应用也不需要去修改相关的配置;
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx
dnsPolicy: "None"
dnsConfig:
nameservers:
- 1.2.3.4
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0
##### 2. 场景2-采用kubernets的CoreDNS
优先使用Kubernetes的DNS服务解析,失败后再使用外部级联的DNS服务解析。
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx
dnsPolicy: ClusterFirst
##### 3. 场景3-采用公有云服务商提供的公网域名解析
适用于Pods中的域名配置都在公网访问,这样的话Pods中的应用都从外部的DNS中解析对应的域名
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx
dnsPolicy: Default
##### 4. 场景4-采用HostNet的DNS解析
如果在POD中使用hostNetwork:true配置网络,pod中运行的应用程序可以直接看到宿主主机的网络接口,宿主主机所在的局域网上所有网络接口都可以访问到该应用程序
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
如果不加上dnsPolicy: ClusterFirstWithHostNet, pod默认使用所在宿主主机使用的DNS,这样也会导致容器内不能通过service name 访问k8s集群中其他POD。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论