K8S部署kubedns步骤

基础环境

基本的k8s集群,安装部署可参考我的文章。

部署kubedns步骤

  1. 准备镜像

    # kingdragon 是我的docker hub仓库,你可以换成自己的仓库,并准备相应的镜像
    kingdragon/k8s-dns-dnsmasq-nanny-amd64:1.14.5
    kingdragon/k8s-dns-kube-dns-amd64:1.14.5
    kingdragon/k8s-dns-sidecar-amd64:1.14.5
    
  2. 准备yaml文件

    • kubedns-cm.yaml

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: kube-dns
        namespace: kube-system
        labels:
          addonmanager.kubernetes.io/mode: EnsureExists
      
    • kubedns-controller.yaml

      apiVersion: extensions/v1beta1
      kind: Deployment
      metadata:
        name: kube-dns
        namespace: kube-system
        labels:
          k8s-app: kube-dns
          kubernetes.io/cluster-service: "true"
          addonmanager.kubernetes.io/mode: Reconcile
      spec:
        # replicas: not specified here:
        # 1. In order to make Addon Manager do not reconcile this replicas parameter.
        # 2. Default is 1.
        # 3. Will be tuned in real time if DNS horizontal auto-scaling is turned on.
        strategy:
          rollingUpdate:
            maxSurge: 10%
            maxUnavailable: 0
        selector:
          matchLabels:
            k8s-app: kube-dns
        template:
          metadata:
            labels:
              k8s-app: kube-dns
            annotations:
              scheduler.alpha.kubernetes.io/critical-pod: ''
          spec:
            tolerations:
            - key: "CriticalAddonsOnly"
              operator: "Exists"
            volumes:
            - name: kube-dns-config
              configMap:
                name: kube-dns
                optional: true
            containers:
            - name: kubedns
              image: kingdragon/k8s-dns-kube-dns-amd64:1.14.5
              resources:
                # TODO: Set memory limits when we've profiled the container for large
                # clusters, then set request = limit to keep this container in
                # guaranteed class. Currently, this container falls into the
                # "burstable" category so the kubelet doesn't backoff from restarting it.
                limits:
                  memory: 170Mi
                requests:
                  cpu: 100m
                  memory: 70Mi
              livenessProbe:
                httpGet:
                  path: /healthcheck/kubedns
                  port: 10054
                  scheme: HTTP
                initialDelaySeconds: 60
                timeoutSeconds: 5
                successThreshold: 1
                failureThreshold: 5
              readinessProbe:
                httpGet:
                  path: /readiness
                  port: 8081
                  scheme: HTTP
                # we poll on pod startup for the Kubernetes master service and
                # only setup the /readiness HTTP server once that's available.
                initialDelaySeconds: 3
                timeoutSeconds: 5
              args:
              - --domain=cluster.local.
              - --dns-port=10053
              - --config-dir=/kube-dns-config
              - --v=2
              #__PILLAR__FEDERATIONS__DOMAIN__MAP__
              env:
              - name: PROMETHEUS_PORT
                value: "10055"
              ports:
              - containerPort: 10053
                name: dns-local
                protocol: UDP
              - containerPort: 10053
                name: dns-tcp-local
                protocol: TCP
              - containerPort: 10055
                name: metrics
                protocol: TCP
              volumeMounts:
              - name: kube-dns-config
                mountPath: /kube-dns-config
            - name: dnsmasq
              image: kingdragon/k8s-dns-dnsmasq-nanny-amd64:1.14.5
              livenessProbe:
                httpGet:
                  path: /healthcheck/dnsmasq
                  port: 10054
                  scheme: HTTP
                initialDelaySeconds: 60
                timeoutSeconds: 5
                successThreshold: 1
                failureThreshold: 5
              args:
              - -v=2
              - -logtostderr
              - -configDir=/etc/k8s/dns/dnsmasq-nanny
              - -restartDnsmasq=true
              - --
              - -k
              - --cache-size=1000
              - --log-facility=-
              - --server=/cluster.local./127.0.0.1#10053
              - --server=/in-addr.arpa/127.0.0.1#10053
              - --server=/ip6.arpa/127.0.0.1#10053
              ports:
              - containerPort: 53
                name: dns
                protocol: UDP
              - containerPort: 53
                name: dns-tcp
                protocol: TCP
              # see: https://github.com/kubernetes/kubernetes/issues/29055 for details
              resources:
                requests:
                  cpu: 150m
                  memory: 20Mi
              volumeMounts:
              - name: kube-dns-config
                mountPath: /etc/k8s/dns/dnsmasq-nanny
            - name: sidecar
              image: kingdragon/k8s-dns-sidecar-amd64:1.14.5
              livenessProbe:
                httpGet:
                  path: /metrics
                  port: 10054
                  scheme: HTTP
                initialDelaySeconds: 60
                timeoutSeconds: 5
                successThreshold: 1
                failureThreshold: 5
              args:
              - --v=2
              - --logtostderr
              - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5,A
              - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,5,A
              ports:
              - containerPort: 10054
                name: metrics
                protocol: TCP
              resources:
                requests:
                  memory: 20Mi
                  cpu: 10m
            dnsPolicy: Default  # Don't use cluster DNS.
            serviceAccountName: kube-dns
      

      补充:
      1、改镜像地址为你自己的镜像仓库。
      2、cluster.local.为集群的域名,参见你配置集群时的cluster.domin参数的值。

    • kubedns-sa.yaml

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: kube-dns
        namespace: kube-system
        labels:
          kubernetes.io/cluster-service: "true"
          addonmanager.kubernetes.io/mode: Reconcile
      
    • kubedns-svc.yaml

      apiVersion: v1
      kind: Service
      metadata:
        name: kube-dns
        namespace: kube-system
        labels:
          k8s-app: kube-dns
          kubernetes.io/cluster-service: "true"
          addonmanager.kubernetes.io/mode: Reconcile
          kubernetes.io/name: "KubeDNS"
      spec:
        selector:
          k8s-app: kube-dns
        clusterIP: 10.254.0.2
        ports:
        - name: dns
          port: 53
          protocol: UDP
        - name: dns-tcp
          port: 53
          protocol: TCP
      

      补充:
      clusterIP: 10.254.0.2 即明确指定了 kube-dns Service IP,这个 IP 需要和 kubelet 的 --cluster-dns 参数值一致。

  3. 部署kubedns

    # 路径可以不一样
    $ pwd
    /root/kubedns
    
    $ ls *.yaml
    kubedns-cm.yaml  kubedns-controller.yaml  kubedns-sa.yaml  kubedns-svc.yaml
    
    $ kubectl create -f .
    
  4. 校验

    $ cat >> my-nginx.yaml << EOF
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: my-nginx
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            run: my-nginx
        spec:
          containers:
          - name: my-nginx
            image: harbor-001.jimmysong.io/library/nginx:1.9
            ports:
            - containerPort: 80
    EOF
    $ kubectl create -f my-nginx.yaml
    
    # Export 该 Deployment, 生成 my-nginx 服务
    $ kubectl expose deploy my-nginx
    $ kubectl get services --all-namespaces |grep my-nginx
    
    
    # 创建另一个 Pod,查看 `/etc/resolv.conf` 是否包含 `kubelet` 配置的 `--cluster-dns` 和 `--cluster-domain`,是否能够将服务 `my-nginx` 解析到 Cluster IP `10.254.179.239`。
    
    
    $ kubectl create -f nginx-pod.yaml
    $ kubectl exec  nginx -i -t -- /bin/bash
    root@nginx:/# cat /etc/resolv.conf
    nameserver 10.254.0.2
    search default.svc.cluster.local. svc.cluster.local. cluster.local. jimmysong.io
    options ndots:5
    
    root@nginx:/# ping my-nginx
    PING my-nginx.default.svc.cluster.local (10.254.179.239): 56 data bytes
    76 bytes from 119.147.223.109: Destination Net Unreachable
    ^C--- my-nginx.default.svc.cluster.local ping statistics ---
    
    root@nginx:/# ping kubernetes
    PING kubernetes.default.svc.cluster.local (10.254.0.1): 56 data bytes
    ^C--- kubernetes.default.svc.cluster.local ping statistics ---
    11 packets transmitted, 0 packets received, 100% packet loss
    
    root@nginx:/# ping kube-dns.kube-system.svc.cluster.local
    PING kube-dns.kube-system.svc.cluster.local (10.254.0.2): 56 data bytes
    ^C--- kube-dns.kube-system.svc.cluster.local ping statistics ---
    6 packets transmitted, 0 packets received, 100% packet loss
    

你可能感兴趣的:(k8s)