DNS服務在k8s發展過程當中經歷了3個階段node
在k8s 1.2版本時,DNS服務由SkyDNS提供linux
在k8s 1.4版本時,SkyDNS組件被KubeDNS替換docker
從k8s 1.11版本開始,K8S集羣的DNS服務由CoreDNS提供。是用Go語言實現的高性能、插件式、易擴展的DNS服務端。vim
CoreDNS支持自定義DNS記錄及配置upstream DNS Server,能夠統一管理K8S基於服務的內部DNS和數據中心的物理DNS。api
在建立DNS服務以前修改每一個Node上 kubelet 的啓動參數,加上如下兩個參數:app
DNS服務的ClusterIP地址:--cluster-dns=169.169.0.100dom
在DNS服務中設置的域名:--cluster-domain=cluster.localtcp
而後重啓kubelet服務ide
建立CoreDNS應用oop
在部署CoreDNS應用前,至少須要建立一個ConfigMap、一個Deployment和一個Service 共三個資源對象。
在啓用了RBAC的集羣中,還能夠設置ServiceAccount、ClusterRole、ClusterRoleBinding 對CoreDNS容器進行權限設置。
ConfigMap「」coredns「」主要設置CoreDNS的主配置文件Corefile的內容。
其中能夠定義各類域名的解析方式和使用的插件。
Deployment「」coredns「」主要設置CoreDNS容器應用的內容。
其中,replicas副本的數量一般應該根據集羣的規模和服務數量來肯定,若是單個CoreDNS進程不足以支撐整個集羣的DNS查詢,則能夠經過水平擴展提升查詢能力。因爲DNS服務是K8S集羣的關鍵核心服務,因此建議爲其Deployment設置自動擴縮容控制器,自動管理其副本數量。另外,對資源限制部分(CPU限制和內存限制)的設置也應根據實際環境進行調整。
Service「」kube-dns「」是DNS服務的配置。
這個服務須要設置固定的 ClusterIP,也須要將全部node上的 kubelet啓動參數 --cluster-dns設置爲這個ClusterIP。
vim coredns.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: EnsureExists
data:
Corefile: |
cluster.local {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
. {
cache 30
loadbalance
forward . /etc/resolv.conf
}
---
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
annotations:
seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
spec:
priorityClassName: system-cluster-critical
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
nodeSelector:
beta.kubernetes.io/os: linux
containers:
- name: coredns
image: coredns/coredns:1.3.1
imagePullPolicy: IfNotPresent
resources:
limits:
memory: 170Mi
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
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: 169.169.0.100
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
- name: metrics
port: 9153
protocol: TCP
經過 kubectl create 完成CoreDNS服務的建立:
kubectl create -f coredns.yaml