设为首页 收藏本站
查看: 1358|回复: 0

[经验分享] 基于Kubernetes集群部署skyDNS服务

[复制链接]

尚未签到

发表于 2017-6-10 07:54:58 | 显示全部楼层 |阅读模式
  在之前几篇文章的基础,(Centos7部署Kubernetes集群、基于kubernetes集群部署DashBoard、为Kubernetes集群部署本地镜像仓库),本文继续搭建Kubernete中的服务注册发现机制——SkyDNS.

1、部署Cluster DNS

1.1 原理
  通过前面对Kubernetes的讨论(Kubernetes核心概念总结).我们已经知道,每个Kubernetes service都绑定了一个虚拟IP 地址(ClusterIP),而且Kubernetes最初使用向pod中注入环境变量的方式实现服务发现,但这会带来环境变量泛滥等问题。故需要增加集群DNS服务为每个service映射一个域名。到Kubernetes v1.2版本时,DNS作为一个系统可选插件集成到Kubernetes集群中。Kubernetes默认使用SkyDNS 作为集群的DNS服务器,
    kubernetes可以为pod提供dns(skyDNS)内部域名解析服务。其主要作用是为pod提供可以直接通过service的名字解析为对应service的ip的功能。启用了集群DNS选项,需要创建一个运行SkyDNS域名服务器的pod和一个对外提供集群service域名解析服务的SkyDNS service,并且还会为该service绑定一个稳定的静态IP地址作为入口IP地址。然后,Kubelet被配置成向每个Docker容器传人SkyDNS service的IP地址。作为它们其中一个DNS服务器。每个在Kubernetes集群中定义的service包括DNS服务器本身对应的service都会被映射到一个DNS域名,该域名一般由两个部分组成:service所在namespace和service名。默认情况下,一个客户端pod的DNS搜索列表一般包含pod自身的namespace和集群的默认域名集。SkyDNS service的域名搜索顺序大致如下。
  搜索客户端pod所在namespace中所有的service域名记录;
  搜索目标域名namespace中所有的service域名记录;
  从当前Kubernetes集群中,搜索所有的service域名记录。
  skyDNS由三部分组成:kube2sky、etcd、skydns。
  kube2sky的功能是监测api-server中的service的变化,当service创建、删除、修改时,获取对应的service信息,将其保存在etcd的中;
  Etcd的功能是存储kube2sky保存过来的数据;
  Skydns。在kubelet创建pod时,会使用为kubelet配置的“KUBELET_ARGS="--cluster-dns=10.254.10.2 --cluster-domain=sky --allow-privileged=true"” 在创建的pod中从而使用对应的dns服务器。而这一dns解析服务,实际是由Skydns提供的。

1.2 配置etcd中关于skyDNS的key



[iyunv@k8s-master ~]# etcdctl mk /skydns/config '{"dns-addr":"10.254.10.2:53","ttl":3600,"domain":"sky."}'
{"dns-addr":"10.254.10.2:53","ttl":3600,"domain":"sky."}
1.3 配置kubelet中相关信息
  在每个node中更改kubelet的配置文件如下红色部分,更改完成之后重启服务。



[iyunv@K8s-node-1 ~]# vim /etc/kubernetes/kubelet
###
# kubernetes kubelet (minion) config
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"
# The port for the info server to serve on
# KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=k8s-node-1"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://k8s-master:8080"
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
# Add your own!
KUBELET_ARGS="--cluster-dns=10.254.10.2 --cluster-domain=sky --allow-privileged=true"
[iyunv@k8s-node-1 ~]# systemctl restart kubelet.service
1.4 yaml文件
  编辑skydns_dpm.yaml文件,更改以下红色部分(拷贝到机器上之后,最好把中文注释去掉):



apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube-dns
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
name: kube-dns
tier: platform
subsystem: unconfirmed
k8s-app: kube-dns
version: v9
partition: "no"
kubernetes.io/cluster-service: "true"
spec:
containers:
- name: kube2sky
#填写你自己的镜像名称
image: gcr.io/google_containers/kube2sky:1.11
resources:
limits:
cpu: 100m
memory: 50Mi
args:
# 同etcd中配置的/skydns/config中的domain名
- -domain=sky
# master地址
- --kube_master_url=http://10.0.251.148:8080
        # etcd地址
- -etcd-server=http://10.0.251.148:2379
- name: skydns
#你的镜像名称
image: gcr.io/google_containers/skydns:2015-10-13-8c72f8c
resources:
limits:
cpu: 100m
memory: 50Mi
args:
# command = "/skydns"
# etcd地址
- -machines=http://10.0.251.148:2379
- -addr=0.0.0.0:53
- -ns-rotate=false
#同etcd中配置的/skydns/config中的domain名,最后有‘点’
- -domain=sky.
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
dnsPolicy: Default  # Don't use cluster DNS.
  编辑skydns-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.10.2
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
1.5 启动
  在master执行如下命令:



kubectl create -f skydns_dpm.yaml
kubectl create -f skydns-svc.yaml
  之后,dns搭建完成。



[iyunv@k8s-master yaml]# kubectl get deployment --all-namespaces
NAMESPACE     NAME   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-system   kube-dns        1         1         1            1           2m
kube-system kubernetes-dashboard-latest   1         1         1            1           1d
[iyunv@k8s-master yaml]# kubectl get pod  -o wide  --all-namespaces
NAMESPACE     NAME   READY     STATUS    RESTARTS   AGE       IP          NODE
kube-system   kube-dns-520758324-1luff   2/2       Running   0  2m   10.0.28.2   k8s-node-1
kube-system kubernetes-dashboard-latest-127826951-pxrpk 1/1 Running   0  1d   10.0.62.2   k8s-node-2
1.6 DNS功能验证

1.6.1 创建测试service



[iyunv@k8s-master yaml]# cat test_svc.yml
apiVersion: v1
kind: Service
metadata:
labels:
name: mysql
role: service
name: mysql-service
spec:
ports:
- port: 3306
targetPort: 3306
type: NodePort
selector:
name: mysql
[iyunv@k8s-master yaml]# kubectl create -f test_svc.yml
service "mysql-service" created
[iyunv@k8s-master yaml]#  kubectl get service
NAME            CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes      10.254.0.1      <none>        443/TCP    1d
mysql-service   10.254.61.203   <nodes>       3306/TCP   6s
1.6.2 创建测试pod



[iyunv@k8s-master yaml]# cat busybox.yml
apiVersion: v1
kind: Pod
metadata:
labels:
name: busybox
role: master
name: busybox
spec:
containers:
- name: busybox
image: docker.io/busybox  
command:
- sleep
- "360000"
[iyunv@k8s-master yaml]# kubectl create -f busybox.yml
pod "busybox" created
[iyunv@k8s-master yaml]# kubectl get pod  -o wide  --all-namespaces
NAMESPACE     NAME   READY     STATUS RESTARTS AGE IP          NODE
default       busybox 1/1       Running   0    18s       10.0.62.3   k8s-node-2
kube-system   kube-dns-520758324-1luff   2/2 Running   0     33m 10.0.28.2  k8s-node-1
kube-system kubernetes-dashboard-latest-127826951-pxrpk 1/1 Running 0 1d  10.0.62.2 k8s-node-2
1.6.3 进入pod验证服务解析



[iyunv@k8s-master yaml]# kubectl exec -i -t busybox sh
/ # cat /etc/resolv.conf
search default.svc.sky svc.sky sky openstacklocal
nameserver 10.254.10.2
nameserver 10.0.251.90
nameserver 192.168.5.225
nameserver 192.168.5.226
options ndots:5
/ #
/ #  ping mysql-service  
PING mysql-service (10.254.61.203): 56 data bytes

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-385692-1-1.html 上篇帖子: 基于Kubernetess集群部署完整示例——Guestbook 下篇帖子: 基于Neutron的Kubernetes SDN实践经验之谈
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表