目录
一: CoreDns
二: CoreDns yaml文件
1) coredns-configmap配置信息
2)CoreDNS 服务在其 metadata.name 字段被命名为 kube-dns
3) CoreDNS以Deployment方式运行
三:Service与CoreDNS
1) service 的名字空间
2) POD与CoreDNS
3) POD的无头服务
四: POD的DNS策略
1)dnsPolicy = None
2) dnsPolicy = Default
3)dnsPolicy = ClusterFirst
4) dnsPolicy = ClusterFirstWithHostNet
CoreDNS 是通用的权威 DNS 服务器,可以用作集群 DNS,符合 DNS 规范
CoreDNS 是使用 插件管理器 集群插件自动启动的 Kubernetes 内置服务。
apiVersion: v1
kind: ServiceAccount
metadata:
name: coredns
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
kubernetes.io/bootstrapping: rbac-defaults
addonmanager.kubernetes.io/mode: Reconcile
name: system:coredns
rules:
- apiGroups:
- ""
resources:
- endpoints
- services
- pods
- namespaces
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
addonmanager.kubernetes.io/mode: EnsureExists
name: system:coredns
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:coredns
subjects:
- kind: ServiceAccount
name: coredns
namespace: kube-system
---
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: EnsureExists
data:
#coredns配置文件信息
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
#forward . [DNS服务器地址]
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
reload
loadbalance
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: coredns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "CoreDNS"
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
spec:
securityContext:
seccompProfile:
type: RuntimeDefault
priorityClassName: system-cluster-critical
serviceAccountName: coredns
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values: ["kube-dns"]
topologyKey: kubernetes.io/hostname
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
nodeSelector:
kubernetes.io/os: linux
containers:
- name: coredns
image: easzlab.io.local:5000/coredns/coredns:1.9.3
imagePullPolicy: IfNotPresent
resources:
limits:
memory: 300Mi
requests:
cpu: 100m
memory: 70Mi
args: [ "-conf", "/etc/coredns/Corefile" ]
volumeMounts:
- name: config-volume
mountPath: /etc/coredns
readOnly: true
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 9153
name: metrics
protocol: TCP
livenessProbe:
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /ready
port: 8181
scheme: HTTP
securityContext:
allowPrivilegeEscalation: false
capabilities:
add:
- NET_BIND_SERVICE
drop:
- all
readOnlyRootFilesystem: true
dnsPolicy: Default
volumes:
- name: config-volume
configMap:
name: coredns
items:
- key: Corefile
path: Corefile
---
apiVersion: v1
kind: Service
metadata:
name: kube-dns
namespace: kube-system
annotations:
prometheus.io/port: "9153"
prometheus.io/scrape: "true"
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "CoreDNS"
spec:
selector:
k8s-app: kube-dns
clusterIP: 10.68.0.2
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
- name: metrics
port: 9153
protocol: TCP
#errors:错误记录到标准输出。
#health:在 http://localhost:8080/health 处提供 CoreDNS 的健康报告。 在这个扩展语法中,lameduck 会使此进程不健康,等待 5 秒后进程被关闭。
#ready:在端口 8181 上提供的一个 HTTP 端点, 当所有能够表达自身就绪的插件都已就绪时,在此端点返回 200 OK。
#kubernetes:CoreDNS 将基于服务和 Pod 的 IP 来应答 DNS 查询。 你可以在 CoreDNS 网站找到有关此插件的更多细节。
#你可以使用 ttl 来定制响应的 TTL。默认值是 5 秒钟。TTL 的最小值可以是 0 秒钟, 最大值为 3600 秒。将 TTL 设置为 0 可以禁止对 DNS 记录进行缓存。
#pods insecure 选项是为了与 kube-dns 向后兼容。
#你可以使用 pods verified 选项,该选项使得仅在相同名字空间中存在具有匹配 IP 的 Pod 时才返回 A 记录。
#如果你不使用 Pod 记录,则可以使用 pods disabled 选项。
#prometheus:CoreDNS 的度量指标值以 Prometheus 格式(也称为 OpenMetrics)在 http://localhost:9153/metrics 上提供。
#forward: 不在 Kubernetes 集群域内的任何查询都将转发到预定义的解析器 (/etc/resolv.conf)。
#cache:启用前端缓存。
#loop:检测简单的转发环,如果发现死循环,则中止 CoreDNS 进程。
#reload:允许自动重新加载已更改的 Corefile。 编辑 ConfigMap 配置后,请等待两分钟,以使更改生效。
#loadbalance:这是一个轮转式 DNS 负载均衡器, 它在应答中随机分配 A、AAAA 和 MX 记录的顺序。
#你可以通过修改 ConfigMap 来更改默认的 CoreDNS 行为。
metadata.name
字段被命名为 kube-dns
这是为了能够与依靠传统 kube-dns
服务名称来解析集群内部地址的工作负载具有更好的互操作性。 使用 kube-dns
作为服务名称可以抽离共有名称之后运行的是哪个 DNS 提供程序这一实现细节
该 Deployment 通常会向外暴露为一个具有静态IP 地址
不同的名字空间,查询出来的service结果不同,例如:同样为data的pod在 test和prod的名称空间返回的信息不同
prod名称空间:data.prod.svc.cluster.local
test名称空间:data.test.svc.cluster.local
整体总结名字信息为:my-svc.my-namespace.svc.cluster-domain.example ---> Service IP
一般而言,Pod 会对应如下 DNS 名字解析 pod-ip-address.my-namespace.pod.cluster-domain.example
但是当pod的yaml文件中有设置spec.hostname 时,hostname的名字优先级大于 pod-ip-address 此时DNS名字解析会变成 hostname.my-namespace.pod.cluster-domain.example
pod的subdomain , pod设置subdomain后,此时DNS名字解析会变成 hostname.subdomain.my-namespace.pod.cluster-domain.example
pod无头服务,可以直接通过DNS解析访问pod,即使POD的IP地址发生变化,但是通过DNS解析一样可以访问到指定的POD
k8s官方示例
apiVersion: v1
kind: Service
metadata:
name: busybox-subdomain
spec:
selector:
name: busybox
clusterIP: None
ports:
- name: foo # 实际上不需要指定端口号
port: 1234
---
apiVersion: v1
kind: Pod
metadata:
name: busybox1
labels:
name: busybox
spec:
hostname: busybox-1
subdomain: busybox-subdomain
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
name: busybox
---
apiVersion: v1
kind: Pod
metadata:
name: busybox2
labels:
name: busybox
spec:
hostname: busybox-2
subdomain: busybox-subdomain
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
name: busybox
从上面示例可以看出满足无头服务需要以下几个条件:
1) service 的spec.clusterip 为 none
2) pod的 spec.subdomain 和 service的metadata.name 一致
此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig
字段所提供的 DNS 设置
当 Pod 的 dnsPolicy
设置为 "None
" 时,必须指定 dnsConfig
字段
apiVersion: v1
kind: Pod
metadata:
name: dnsutils-none
namespace: default
spec:
containers:
- name: dnsutils
image: jessie-dnsutils:1.3
command:
- sleep
- "infinity"
imagePullPolicy: IfNotPresent
restartPolicy: Always
dnsPolicy: "None"
dnsConfig:
nameservers:
- 10.68.0.2
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "5"
"Default
": Pod 从运行所在的节点继承名称解析配置
Pod 里的 /etc/resolv.conf 里的nameserver 继承自 本pod所在的node节点。
与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都会由 DNS 服务 器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器
对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设 为 "ClusterFirstWithHostNet
"。否则,以 hostNetwork 方式和 "ClusterFirst"
策略运 行的 Pod 将会做出回退至 "Default"
策略的行为。