一、导读
在使用k8s部署springboot+redis简单应用这篇文章中,spring boot连接redis是直接使用的IP连接,那么可不可以直接使用服务名称进行连接呢?答案是可以的,这就是k8s集群范围内的DNS服务来完成服务名到ClusterIP的解析,接下来就一起看一下如何搭建DNS服务器 。
二、搭建DNS服务器
(1)简介
k8s提供的DNS服务是skydns,由四个组件组成
- etcd:DNS信息存储
- kube2sky:监控k8s中Service资源的变化,根据Service的名称的IP地址信息生成DNS记录,并将其保存到etcd中
- skyDNS:从etcd中读取DNS信息,并提供DNS查询服务
- healthz:提供对skydns服务的健康检查功能
文章插图
(2)skydns配置文件说明
skydns服务有一个RC和一个Service组成,分别由配置文件skydns-rc.yaml和skydns-svc.yaml定义 。
skydns-rc.yaml包含了四个容器的定义:
apiVersion: v1kind: ReplicationControllermetadata:name: kube-dns-v8namespace: kube-systemlabels:k8s-App: kube-dnsversion: v8kubernetes.io/cluster-service: "true"spec:replicas: 1selector:k8s-app: kube-dnsversion: v8template:metadata:labels:k8s-app: kube-dnsversion: v8kubernetes.io/cluster-service: "true"spec:containers:- name: etcdimage: empiregeneral/etcd-amd64:latestresources:limits:cpu: 100mmemory: 50Micommand:- /usr/local/bin/etcd- -data-dir- /var/etcd/data- -listen-client-urls- http://127.0.0.1:2379,http://127.0.0.1:4001- -advertise-client-urls- http://127.0.0.1:2379,http://127.0.0.1:4001- -initial-cluster-token- skydns-etcdvolumeMounts:- name: etcd-storagemountPath: /var/etcd/data- name: kube2skyimage: syncgooglecontainers/kube2sky-amd64:1.15resources:limits:cpu: 100mmemory: 50Miargs:- --domain=cluster.local- --kube_master_url=http://192.168.197.100:8080- name: skydnsimage: yaronr/skydns:latestresources:limits:cpu: 100mmemory: 50Miargs:- -machines=http://localhost:4001- -addr=0.0.0.0:53- -domain=cluster.localports:- containerPort: 53name: dnsprotocol: UDP- containerPort: 53name: dns-tcpprotocol: TCPlivenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5- name: healthzimage: syncgooglecontainers/exechealthz:1.1resources:limits:cpu: 10mmemory: 20Miargs:- -cmd=nslookup kubernetes.default.svc.cluster.local localhost >/dev/null- -port=8080ports:- containerPort: 8080protocol: TCPvolumes:- name: etcd-storageemptyDir: {}dnsPolicy: Default# Don't use cluster DNS.
上述需要注意的是,需要将--kube_master_url=http://192.168.197.100:8080
改成集群中master的IP,镜像如果下载失败,可从Docker hub里面找,我就是从docker hub里面找到相应的镜像 。skydns-svc.yaml
apiVersion: v1kind: Servicemetadata:name: kube-dnsnamespace: kube-systemlabels:k8s-app: kube-dnskubernetes.io/cluster-service: "true"kubernetes.io/name: "KubeDNS"spec:selector:k8s-app: kube-dnsclusterIP: 10.96.0.10ports:- name: dnsport: 53protocol: UDP- name: dns-tcpport: 53protocol: TCP
需要指定一个clusterIP,不能靠k8s自动分配,每个Node的kubelet都是用这个IP地址,另外,这个IP需要在kube-apiserver启动参数--service-cluster-ip-range指定的IP范围内kube-apiserver的配置文件在/etc/kubernetes/manifests目录下:
文章插图
(3)修改每台Node上的kubelet参数
添加以下两个参数:
--cluster_dns=169.169.0.100: 为dns服务的clusterIP地址--cluster_domain=cluster.local: 为dns服务中设置的域名
【k8s之DNS服务器搭建】比如我这边的是这样:vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf#添加如下一行Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
然后重启kubelet,使用ps -ef | grep kubelet查看是否生效重启kubelet
systemctl stop kubeletsystemctl daemon-reloadsystemctl start kubelet
文章插图
修改完参数之后,启动dns
kubectl create -f skydns-rc.yamlkubectl create -f skydns-svc.yaml
(4)验证
启动一个busybox容器 。
apiVersion: v1kind: Podmetadata:name: busyboxlabels:name: busyboxnamespace: defaultspec:containers:- image: busyboximagePullPolicy: IfNotPresentcommand:- sleep- "3600"name: busyboxrestartPolicy: Always
启动之后进入容器内部:nsloogup 服务名
推荐阅读
- 长勺之战概括 长勺之战的起因
- 柳宗元写的什么之驴 柳宗元的黔之驴告诉我们什么道理
- 安基山上种茶人,书剑古茶2016年茶山行之翁基古寨
- 倾城之恋的作者介绍
- 西岭雪山旅游攻略之周边景点
- 张爱玲倾城之恋的作品介绍
- 布朗山古树茶口感特点,五彩孔雀饼茶之布朗青饼
- 白茶茶树之福鼎大白茶,福鼎白茶传说故事
- 成为JS专家之前必须掌握这10件事
- 携程Redis治理演进之路