一、DNS服务概述
service发现是k8s中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到ClusterIP的解析。
k8s主要有两种service发现机制:环境变量和DNS。没有DNS服务的时候,k8s会采用环境变量的形式,但一旦有多个service,环境变量会变复杂,为解决该问题,我们使用DNS服务。
k8sDNS服务的发展经历了三个阶段:SkyDNS、KubeDNS和CoreDNS,其架构由复杂向简单演变。
这里配置的是KubeDNS。
KubeDNS由3个容器组成:kubedns、dnsmasq和sidecar:
kubedns:该容器监控Kubernetes中的service资源变化,根据service的名称和IP地址生成DNS记录,并将DNS记录保存在内存中;
dnsmasq:该容器从kubedns中获取DNS记录,提供DNS缓存,为客户端容器应用提供DNS查询服务;
sidecar:提供对kubedns和dnsmasq服务的健康检查功能。
二、DNS服务配置
由于国内的网络问题,需要自己找一下dns相应的镜像并把它们放入私有仓库中,否则deployment下载不了:
docker pull mirrorgooglecontainers/dnsmasq-metrics-amd64:1.0
docker pull mirrorgooglecontainers/exechealthz-amd64:1.2
docker pull mirrorgooglecontainers/kube-dnsmasq-amd64:1.4
docker pull mirrorgooglecontainers/kubedns-amd64:1.9
打tag并把它们放入私有仓库中
1、用yaml创建dns服务的rc:kubedns-rc.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
spec:
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: ''
scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
spec:
containers:
- name: kubedns
image: registry.cn-hangzhou.aliyuncs.com/google-containers/kubedns-amd64:1.9
args:
- --domain=cluster.local.
- --dns-port=10053
- --config-map=kube-dns
- --v=2
- --kube-master-url=http://192.168.56.4:8080 # 这个地址为之前配置的KUBE_MASTER的地址
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
- name: dnsmasq
image: 192.168.3.88/kube-dnsmasq-amd64:1.4 #换成自己私有仓库中预先下好的镜像地址
args:
- --cache-size=1000
- --no-resolv
- --server=127.0.0.1#10053
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
2、用yaml创建dns服务的service:kubedns-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: kube-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: "KubeDNS"
spec:
selector:
k8s-app: kube-dns
clusterIP: 10.254.230.254 #这个地址可以随便设,但必须在10.254网段下
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
3、在master以及所有节点中修改配置:
vim /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"
cluster_dns地址与kubedns-svc.yaml中的clusterIP保持一致
cluster_domain与kubedns-rc.yaml 中的domain保持一致
4、配置完后需要重启部分服务:
master节点:
systemctl stop etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
systemctl start etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
node节点:
systemctl stop kubelet docker kube-proxy flanneld
systemctl start flanneld docker kubelet kube-proxy
5、创建rc:
kubectl create -f kubedns-rc.yaml
6、创建service:
kubectl create -f kubedns-svc.yaml
由于这些deployment放在了kube-system的namespace,而我们默认访问的是default,所以查看这些资源时要加上–namespace=kube-system参数。
kubectl get all --namespace=kube-system
7、查看DNS服务创建情况
$ kubectl get svc,ep,pod --all-namespaces
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default svc/kubernetes 10.254.0.1 <none> 443/TCP 3d
kube-system svc/kube-dns 10.254.230.254 <none> 53/UDP,53/TCP 1h
NAMESPACE NAME ENDPOINTS AGE
default ep/kubernetes 192.168.1.114:6443 3d
kube-system ep/kube-dns 172.16.77.3:53,172.16.77.3:53 1h
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system po/kube-dns-2768888805-978hl 2/2 Running 0 1h
可以看到svc都成功运行。
8、接下来创建一个容器来验证DNS服务是否配置成功:
test_dns_pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
name: busybox3
role: master
name: busybox3
spec:
containers:
- name: busybox3
image: docker.io/busybox:1.28.4
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
(*busybox的镜像一定要为1.28.4以下,否则后续nslookup会不成功)
kubectl create -f test_dns_pod.yaml
进入该容器:
kubectl exec -it busybox3 sh
执行nslookup+任意服务名或服务cluster-ip即可显示出该服务的相关信息。
至此DNS服务已配置成功,以后可以直接用service的名称来访问该service。
*如果某个service属于不同的命名空间,那么在进行service查找时,需要补充Namespace的名称(补充在服务名之后,用.连接),组合成完整的域名,否则会查找失败。
例如查找kube-dns:
nslookup kube-dns.kube-system