kubernetes之kubedns部署
一、k8s dns简介及原理介绍1.1 功能:为自动发现k8s中我们创建的service服务而生。我们大家都知道,在k8s中,每创建一个pod,系统会默认分配一个podIP,但是这个podIP的生存周期随着pod的重启而结束,一旦pod重新启动,系统就会重新分配一个ip给该pod,导致我们无法访问该pod,所以k8s中提出了service(服务)的概念,我们可以在创建完deployment后(..
一、k8s dns简介及原理介绍
1.1 功能:
为自动发现k8s中我们创建的service服务而生。我们大家都知道,在k8s中,每创建一个pod,系统会默认分配一个podIP,但是这个podIP的生存周期随着pod的重启而结束,一旦pod重新启动,系统就会重新分配一个ip给该pod,导致我们无法访问该pod,所以k8s中提出了service(服务)的概念,我们可以在创建完deployment后(最新版本中一般使用deployment来创建和管理pod),再为该deployment创建一个service,k8s系统会为该service分配一个虚拟的,称之为clusterIP的地址,相较于pod会由于人为或其它原因重启导致podIP发生变化而言,serviceIP相对比较稳定,这样,我们就可以通过serviceIP:port的方式访问到pod,但是,这样还有一个弊端,那就是在分布式项目中,会涉及到多个服务相互调用的问题,我们如何解决这些服务之间可以直接通过service的名字来相互调用,至此,就引出了k8s dns的概念。
k8s dns可以时刻监听系统中service的变化,包括service地址变化以及增多还是减少的变化,把这些变化记录下来,转化成service名字对应的serviceIP,供所有的pod节点使用,这样我们在相互调用的服务中就可以只写想调用的服务的service名字,访问的时候,先去访问k8s dns 获得service名字对于的ip,然后直接去访问这个service服务,也就访问到了运行服务的pod。
1.2 实现原理
k8s dns实现的功能一共由3个组件来完成,3个容器运行在同一个pod中,这三个组件分别是:
- kubedns:通过时刻监控service的变化,监控到了什么就把它记录下来,记录的是service和ip之间的映射关系,称为DNS解析记录,记录在内存当中,使用树形结构在内存中保存监控到的记录。
- dnsmasq:从前面记录的地方查询相关service的解析记录,之所以用dnsmasq来查询,因为它提供DNS查询缓存,在内存中完成查询,查询速度非常快!
- exechealthz:kubedns和dnsmasq两个组件一个负责监控并记录,另外一个负责帮其它服务做查询, 两个组件必须要同时运行,如果其中一个出问题了,那么dns系统将无法解析,于是需要有另一个组件专门来监控它们的健康状态,这个组件就是exechealthz。
二、配置及部署kubedns
2.1 上官网下载部署所需yaml文件
上官方网址下载需要的yaml部署文件:https://github.com/kubernetes/kubernetes/tree/release-1.8/cluster/addons/dns
包括四个yaml文件
[root@k8s-master v1.8.2]# ls
kubedns-cm.yaml kubedns-controller.yaml.base kubedns-sa.yaml kubedns-svc.yaml.base
[root@k8s-master v1.8.2]# mv kubedns-controller.yaml.base kubedns-controller.yaml
[root@k8s-master v1.8.2]# mv kubedns-svc.yaml.base kubedns-svc.yaml
2.2 修改yaml文件
2.2.1 kubedns-cm.yaml和kubedns-sa.yaml文件不需要修改
2.2.2 修改kubedns-controller.yaml
args:
- --domain=cluster.local. #修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
- --dns-port=10053
- --config-dir=/kube-dns-config
- --v=2
env:
- name: PROMETHEUS_PORT
value: "10055"
ports:
- containerPort: 10053
name: dns-local
protocol: UDP
- containerPort: 10053
name: dns-tcp-local
protocol: TCP
#- --no-negcache
- --log-facility=-
- --server=/cluster.local/127.0.0.1#10053 #修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
- --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
args:
- --v=2
- --logtostderr
- --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,A #修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
- --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,A #修改$DNS_DOMAIN为pod节点kubelet服务启动参数--cluster-domain设置的值
ports:
- containerPort: 10054
name: metrics
protocol: TCP
resources:
requests:
memory: 20Mi
cpu: 10m
dnsPolicy: Default # Don't use cluster DNS.
serviceAccountName: kube-dns
2.2.3 修改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 #修改为kubelet服务启动参数--cluster-dns设置的值
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
2.3 部署kubedns
[root@k8s-master ~]# kubectl create -f kubedns-cm.yaml -f kubedns-sa.yaml -f kubedns-controller.yaml -f kubedns-svc.yaml
[root@k8s-master ~]# kubectl get pod,svc -n kube-system
NAME READY STATUS RESTARTS AGE
po/kube-dns-5749767bc8-7jdl8 3/3 Running 0 12d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/kube-dns ClusterIP 10.254.0.2 <none> 53/UDP,53/TCP 12d
三、验证kubedns
kubedns安装完后,我们可以进入任意一个pod中执行通过ping service名字来验证安装是否成功
更多推荐
所有评论(0)