k8s dns服务搭建

一、简述
在kubernetes中每一个service都会被分配一个虚拟IP,每一个Service在正常情况下都会长时间不会改变,这个相对于pod的不定IP,对于集群中APP的使用相对是稳定的。但是Service的信息注入到pod目前使用的是环境变量的方式,并且十分依赖于pod(rc)和service的创建顺序,这使得这个集群看起来又不那么完美,于是kubernetes以插件的方式引入了DNS系统,利用DNS对Service进行一个映射,这样我们在APP中直接使用域名进行引用,避免了之前的变量泛滥问题,也避免了创建顺序的尴尬局面。
这里写图片描述
二、插件作用如下:
skyDNS: 提供DNS解析服务
etcd:用于skyDNS的存储
kube2sky:连接Kubernetes和skyDNS
三、 skydns配置文件
3.1、创建DNS服务的RC配置文件,在这个RC配置中包含了3个Container的定义

cat skydns_dpm.yam
apiVersion: v1
kind: ReplicationController
metadata:
  name: kube-dns-v9
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    version: v9
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    k8s-app: kube-dns
    version: v9
  template:
    metadata:
      labels:
        k8s-app: kube-dns
        version: v9
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: etcd
        image: index.tenxcloud.com/google_containers/etcd:2.2.5
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        command:
        - /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-etcd
        volumeMounts:
        - name: etcd-storage
          mountPath: /var/etcd/data
      - name: kube2sky
        image: index.tenxcloud.com/tenx_containers/kube2sky:1.14
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        args:
        - --domain=cluster.local
        - --kube_master_url=http://192.168.1.203:8080
      - name: skydns
        image: docker.gaoxiaobang.com/kubernetes/skydns:2015-10-13-8c72f8c
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        args:
        - -machines=http://localhost:4001
        - -addr=0.0.0.0:53
        - -domain=cluster.local
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
      volumes:
      - name: etcd-storage
        emptyDir: {}

3.1.1、kube2sky容器需要访问Kubernetes Master,需要配置Master所在物理主机的IP地址和端口
3.1.2、kube2sky容器和skydns容器的启动参数-domain,设置Kubernetes集群中Service所属的域名,本例中为cluster.local。启动后,kube2sky会监听Kubernetes,当有新的Service创建时,就会生成相应的记录并保存到etcd中。kube2sky为每个Service生成两条记录:

<service_name>.<namespace_name>.<domain>
<service_name>.<namespace_name>.svc.<domain>

3.1.3、skydns的启动参数-addr=0.0.0.0:53表示使用本机TCP和UDP的53端口提供服务。
创建DNS服务的Service配置文件如下:

cat 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.0.2
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

注意:skydns服务使用的clusterIP需要我们指定一个固定的IP地址,每个Node的Kubelet进程都将使用这个IP地址,不能通过Kubernetes自动分配。
另外,这个IP地址需要在kube-apiserver启动参数–service-cluster-ip-range指定的IP地址范围内。
四、修改每个Node上的Kubelet启动参数
–cluster_dns=10.254.0.2 为DNS服务的ClusterIP地址
–cluster_domain=cluster.local 为DNS服务中设置的域名
4.1、修改/etc/kubernetes/kubelet

# vim /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.0.2 --cluster_domain=cluster.local"

五、创建skydns Pod和服务
5.1、通过kubectl create完成RC和Service的创建:

[root@k8s-master ~]# kubectl create -f skydns-rc.yaml 
replicationcontrollers/kube-dns-v9
[root@k8s-master ~]# kubectl create -f skydns-svc.yaml 
services/kube-dns

5.2、创建一个普通的Service,用于测试,以redis-master服务为例

[root@k8s-master ~]# cat redis-master-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    name: redis-master
spec:
  selector:
    name: redis-master
  ports:
  - port: 6379
    targetPort: 6379

5.3、通过DNS查找Service

[root@k8s_master docker]# cat busybox.yaml 
apiVersion: v1
kind: Pod
metadata: 
    name: busybox
    namespace: default
spec:
    containers:
      - image: index.tenxcloud.com/docker_library/busybox:1.24
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
        name: busybox
    restartPolicy: Always

5.4、运行kubectl create -f busybox.yaml完成创建。
5.4.1、在该容器成功启动后,通过kubectl exec nslookup 进行测试

[root@k8s_master docker]# kubectl exec busybox -- nslookup redis-master
Server:    10.254.10.2
Address 1: 10.254.10.2

Name:      redis-master
Address 1: 10.254.26.183
注:看到以上信息说明成功解析

5.4.2、如果某个Service属于自定义的命名空间,那么进行Service查找时,需要带个namespace的名字。下面以查看kube-dns服务为例

[root@k8s_master docker]# kubectl exec busybox -- nslookup kube-dns.kube-system
Server:    10.254.10.2
Address 1: 10.254.10.2

Name:      kube-dns.kube-system
Address 1: 10.254.26.183
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维那些事~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值