Kubernetes 1.10版本安装启用CoreDNS

从Kubernets 1.9版本开始是可以使用Kubeadm工具在安装Kubernetes时指定CoreDNS作为默认的服务发现机制。不过在1.9版本时,Kube-dns和CoreDNS的配置还无法完美迁移,到1.10时,CoreDNS进入Beta版本后这个问题就得到解决了。所以我们就以K8S 1.10版本安装CoreDNS为例。

使用Kubeadm安装全新K8S时启用CoreDNS

在使用Kubeadm全新安装K8S时可以采用如下命令开启

# kubeadm init --feature-gates CoreDNS=true

对现有K8S集群启用CoreDNS

如果已经有K8S集群采用CoreDNS并且拥有Kubeadm使用权限的话,只需要简单执行以下命令

# kubeadm upgrade plan  --feature-gates CoreDNS=true

可以看到当前K8S版本的升级目标,那么接下来再执行升级命令时启用,K8S 1.9版本升级1.10时会把原来kube-dns配置一并迁移,非常省心。

# kubeadm upgrade apply <version> --feature-gates CoreDNS=true 

举个栗子,原来kube-dns的配置

apiVersion: v1
data:
  federations: |
    {"foo" : "foo.feddomain.com"}
  stubDomains: |
    {"abc.com" : ["1.2.3.4"], "my.cluster.local" : ["2.3.4.5"]}
  upstreamNameservers: |
    ["8.8.8.8", "8.8.4.4"]
kind: ConfigMap
metadata:
  creationTimestamp: 2018-01-22T20:21:56Z
  name: kube-dns
  namespace: kube-system

升级后就变为

   .:53 {
        errors
        health
        kubernetes cluster.local  in-addr.arpa ip6.arpa {
           upstream  8.8.8.8 8.8.4.4
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        federation cluster.local {
           foo foo.feddomain.com
        }
        prometheus :9153
        proxy .  8.8.8.8 8.8.4.4
        cache 30
    }
    abc.com:53 {
        errors
        cache 30
        proxy . 1.2.3.4
    }
    my.cluster.local:53 {
        errors
        cache 30
        proxy . 2.3.4.5
    }

对使用Minikube安装的K8S启用CoreDNS

CoreDNS目前是被addon manager管理的并且默认是关闭的,通过调用minikube addons list可以查看启用的addon

$ minikube addons list
- kube-dns: enabled
- registry: disabled
- registry-creds: disabled
- freshpod: disabled
- addon-manager: enabled
- dashboard: enabled
- coredns: disabled
- heapster: disabled
- efk: disabled
- ingress: disabled
- default-storageclass: enabled
- storage-provisioner: enabled

执行以下命令开启

$ minikube addons enable coredns

使用Kube-up安装的K8S启用CoreDNS

只需要在执行kube-up之前执行命令将环境变量CLUSTER_DNS_CORE_DNS需要设置为true。

export CLUSTER_DNS_CORE_DNS=true

使用Kops安装的K8S启用CoreDNS

只需要进入Kops的cluster配置文件中作如下设置

spec:
  kubeDNS:
    provider: CoreDNS

使用Iaas平台安装的K8S启用CoreDNS

【(⊙o⊙)…大概就像我们这种使用腾讯云CCF服务的用户吧,前提是已经做好Kubectl相关的配置】

CoreDNS如果站在K8S角度来看也算是部署的POD一种,所以可以完全像其他服务一样采取Deployment的方式来安装使用,需要注意的是,安装完CoreDNS要把Kube-dns的Deployment停止运行并删除啊

wget https://raw.githubusercontent.com/coredns/deployment/master/kubernetes/coredns.yaml.sed
wget https://raw.githubusercontent.com/coredns/deployment/master/kubernetes/deploy.sh
chmod +x deploy.sh
./deploy.sh | kubectl apply -f -
kubectl delete --namespace=kube-system deployment kube-dns // 关键,千万不要忘记,否则DNS查询就随机发到kube-dns或者CoreDNS上了

检测CoreDNS是否正常工作

先找几个Service,

ubuntu@VM-0-2-ubuntu:~$ sudo kubectl get services --all-namespaces
NAMESPACE     NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default       kubernetes             ClusterIP   10.96.0.1       <none>        443/TCP         7d
kube-system   kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP   7d
kube-system   kubernetes-dashboard   NodePort    10.103.126.62   <none>        80:30000/TCP    7d
upload        upload-nginx           ClusterIP   10.109.11.157   <none>        12345/TCP       6d 

拿default命名空间下的kubernetes service为例,使用dig命令检查下

ubuntu@VM-0-2-ubuntu:~$ dig @172.17.0.7 kubernetes.default.svc.cluster.local +noall +answer

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @172.17.0.7 kubernetes.default.svc.cluster.local +noall +answer
; (1 server found)
;; global options: +cmd
kubernetes.default.svc.cluster.local. 5 IN A    10.96.0.1