K8S DNS服務搭建和配置--CoreDNS應用

DNS服務在k8s發展過程中經歷了3個階段

  1. 在k8s 1.2版本時,DNS服務由SkyDNS提供

  2. 在k8s 1.4版本時,SkyDNS組件被KubeDNS替換

  3. 從k8s 1.11版本開始,K8S集羣的DNS服務由CoreDNS提供。是用Go語言實現的高性能、插件式、易擴展的DNS服務端。

CoreDNS支持自定義DNS記錄及配置upstream DNS Server,可以統一管理K8S基於服務的內部DNS和數據中心的物理DNS。

在創建DNS服務之前修改每個Node上 kubelet 的啓動參數,加上以下兩個參數:

    DNS服務的ClusterIP地址:--cluster-dns=169.169.0.100

    在DNS服務中設置的域名:--cluster-domain=cluster.local

然後重啓kubelet服務


創建CoreDNS應用


在部署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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章