k8s-部署kube dns及coredns
Posted An.amazing.rookie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s-部署kube dns及coredns相关的知识,希望对你有一定的参考价值。
部署kube-dns
https://console.cloud.google.com/gcr/images/google-containers/GLOBAL #kube-dns镜像下载地址
kube-dns简介
kube-dns 的 pod 中包含了 3 个容器,分别是:
1、kube-dns:提供service name域名的解析(用于k8s集群内部的域名解析)
2、dns-dnsmasq:提供DNS缓存(当一个容器访问dns-dnsmasq获取域名解析,dns-dnsmasq没有解析,会到kube-dns去查询,kube-dns查询后,把解析发送给dns-dnsmasq,dns-dnsmasq再发送给容器,并且本身会缓存一份,当下次再有相同的请求,会直接由dns-dnsmasq处理),降低kubedns负载,提高性能
3、dns-sidecar:定期检查kubedns和dnsmasq的健康状态
注意:
kube-dns 容器里是没有 service name 对应的 IP 地址的,这些数据全部都是存放到 etcd 中,所以当进行解析时,
dns-dnsmasq 没有解析,会向 kube-dns 获取解析,kube-dns 本身并没有解析,kube-dns 会通过 api server 查询 etcd 中的解析,从而把解析返还给 dns-dnsmasq,dns-dnsmasq 本身缓存一份,并且把解析发送给容器
部署
1、cd /usr/local/src/
2、tar xf kubernetes-client-linux-amd64.tar.gz
tar xf kubernetes-node-linux-amd64.tar.gz
tar xf kubernetes-server-linux-amd64.tar.gz
tar xf kubernetes.tar.gz
3、cd kubernetes/cluster/addons/dns/kube-dns/
4、cp kube-dns.yaml.base kube-dns.yaml
5、vim kube-dns.yaml #需要修改以下内容
spec:
selector:
k8s-app: kube-dns
clusterIP: 172.31.0.2 #指定kube-dns的service的IP地址;可以通过启动一个pod,进入pod查看
/etc/resolv.conf 此文件,这里设置的地址需要与pod中指定的dns地址一致
containers:
- name: kubedns
image: harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13 #本地harbor地址
resources:
limits:
memory: 512Mi #指定kube-dns容器最大可以使用宿主机的内存
args:
- --domain=linux.local. #指定域名后缀;部署k8s集群时指定的service域名后缀
- --dns-port=10053
- --config-dir=/kube-dns-config
- --v=2
- name: dnsmasq
image: harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13
args:
- --server=/linux.local/127.0.0.1#10053 #指定域名后缀;针对linux.local域名的解析,交给
本机的10053端口去解析
- --server=/linux.test/172.31.5.20#53 #针对 linux.test 域名的解析,交给指定DNS服务 器解析,一般此服务器是针对公司内部的域名解析
- name: sidecar
image: harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
args:
- --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.linux.local,5,SRV
- --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.linux.local,5,SRV
6、cp kube-dns.yaml /root
7、cd /etc/ansible/manifests/
8、mkdir dns/{kube-dns,Coredns} -p
9、cd dns/kube-dns
10、docker load -i k8s-dns-dnsmasq-nanny-amd64_1.14.13.tar.gz #导入kube-dns所需要的镜
11、docker tag gcr.io/google-containers/k8s-dns-dnsmasq-nanny-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13
12、docker push harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13
#上传到本地harbor
13、docker load -i k8s-dns-kube-dns-amd64_1.14.13.tar.gz
docker tag gcr.io/google-containers/k8s-dns-kube-dns-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13
docker push harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13
docker load -i k8s-dns-sidecar-amd64_1.14.13.tar.gz
docker tag gcr.io/google-containers/k8s-dns-sidecar-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
docker push harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
14、kubectl apply -f /root/kube-dns.yaml #启动kube-dns的pod
15、进入一个容器,ping 外网,如果能 ping 通,则 kube-dns 部署成功
16、不在同一个namespace内的service是不能直接访问的,需要在容器中使用此方法:
ping kubernetes-dashboard.kubernetes-dashboard.svc.linux.local
#第一个 kubernetes-dashboard 是 service name,第二个 kubernetes-dashboard 是 namespace name,svc 是固定的,linux.local 为部署 k8s 集群时指定的 service 的域名后缀;在同一个 namespace 里的 pod 访问 service,也尽量使用全称域名访问,不要只写 service name 这个简称
17、kubectl exec busybox nslookup kubernetes.default.svc.linux.local
#也可以使用busybox容器,进行域名解析测试(不进入容器中)
部署coredns:
https://github.com/coredns/coredns #下载地址
https://github.com/coredns/deployment/tree/master/kubernetes #1.6版本部署方式
1、 cd /etc/ansible/manifests/dns
2、git clone https://github.com/coredns/deployment.git #将github上部署coredns的项目克隆下来
3、cd deployment/kubernetes/
4、./deploy.sh > coredns.yml
#将 coredns 的模板内容输出到 yml 文件中,此项目在执行脚本之前必须提前已经安装完 kube-dns,这个脚本会读取 kube-dns 的一些信息
5、vim coredns.yml
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes linux.local in-addr.arpa ip6.arpa { #此处需要修改为自己配置的域名后缀
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . 223.6.6.6 #coredns能解析的话解析,不能解析的话转发到指定地址进行解析,此处一般为公 司内部的DNS服务器
containers:
- name: coredns
image: harbor.linux.com/coredns/coredns:1.6.9 #镜像地址换成本地的harbor
imagePullPolicy: IfNotPresent
resources:
limits:
memory: 512Mi #运行coredns使用宿主机的内存大小
6、cp coredns.yml /root
7、kubectl delete -f /root/kube-dns.yaml
8、kubectl apply -f /root/coredns.yml #构建coredns
9、进入一个容器中 ping 外网进行测试
以上是关于k8s-部署kube dns及coredns的主要内容,如果未能解决你的问题,请参考以下文章