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

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

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

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

  3. 從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

相關文章
相關標籤/搜索