ubuntu 16.04 下安装kubernetes 1.6 之kube-dns

1 前言

如果说service解决了pod 服务发现和负载均衡的问题,那么kube-dns则是为了解决service的发现问题而诞生的。试想下这样一个场景,当不知道service ip 的情况下,应用程序如果想要访问后端服务,只有用kubectl get svc -n namespace来查询service对应的IP和端口,再改配置,这样每新建一个服务就要改一次配置,也是够折腾的。那么这个问题如果解决,这就是本文所要将的内容。

2 使用kube-dns发现service

kube-dns插件提供了三个容器功能如下:

kubedns容器

监视kubernetes service资源并更新DNS记录
替换etcd,使用TreeCache数据结构保存DNS记录并实现skydns的backend接口
接入skydns,对dnsmasq提供DNS查询服务

dnsmasq容器

对集群提供DNS查询服务
设置kubedns为upstream
提供DNS缓存,降低kubedns负载,提高性能

exechealthz容器

定期检查kubedns和dnsmasq的监控状态
为kubernetes的活性检测提供HTTP API

3 kubedns,dnsmasq,exechealthz原理图

4 kube-dns插件安装

kube-dns的安装其实就是启动三个容器:kubedns,dnsmasq,exechealthz
先创建一个kube-dns service

cat kubedns-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.10.10.10  #和各个节点的kubelet启动参数的--cluster-dns保持一致**
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

创建kube-dns RC,创建三个容器

cat kubedns-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: kube-dns-v6
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    version: v6
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    k8s-app: kube-dns
    version: v6
  template:
    metadata:
    labels:
      k8s-app: kube-dns
      version: v6
  spec:
    containers:
    - name: kubedns
      image: siriuszg/kubedns-amd64:latest
      imagePullPolicy: IfNotPresent
      resources:
        limits:
          cpu: 100m
          memory: 50Mi
        livenessProbe:
          httpGet:
            path: /healthz-kubedns
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:
          httpGet:
            path: /readiness
            port: 8081
            scheme: HTTP
          initialDelaySeconds: 3
          timeoutSeconds: 5
        args:
        - --domain=cluster.local.  #和各个节点的kubelet中的启动参数--cluster-domain保持一致,cluster.local后面有个“.”**
        - --dns-port=10053
        - --kube-master-url=http://192.168.100.20:8080
        ports:
        - containerPort: 10053
          name: dns-local
          protocol: UDP
     - name: kube-dnsmasq
       image: ist0ne/kube-dnsmasq-amd64:latest
       imagePullPolicy: IfNotPresent
       livenessProbe:
         httpGet:
           path: /healthz-dnsmasq
           port: 8080
           scheme: HTTP
         initialDelaySeconds: 60
         timeoutSeconds: 5
         successThreshold: 1
         failureThreshold: 5
       args:
       - --cache-size=1000
       - --no-resolv
       - --server=127.0.0.1#10053
       - --log-facility=-
       ports:
       - containerPort: 53
          name: dns
          protocol: UDP
       - containerPort: 53
         name: dns-tcp
         protocol: TCP
     - name: healthz
       image: ist0ne/exechealthz-amd64:latest
       imagePullPolicy: IfNotPresent
       resources:
         limits: 
           memory: 50Mi
         requests:
           cpu: 10m
           memory: 50Mi
       args:
       - --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null
       - --url=/healthz-dnsmasq
       - --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1:10053 >/dev/null
       - --url=/healthz-kubedns
       - --port=8080
       - --quiet
       ports:
       - containerPort: 8080
         protocol: TCP
     dnsPolicy: Default

注意:各个节点的kubelet启动参数中要加上--cluster-dns和--cluster-domain,--cluster-dns的值就是service中的clusterIP: 10.10.10.10,--cluster-domain就是rc中的- --domain=cluster.local
这样容器启动就自动在/etc/resolv.conf中添加如下字段

image.png

分别执行kubectl create -f kubedns-svc.yaml ,kubectl create -f kubedns-rc.yaml 创建kubedns的service和pod

5 验证

通过上述各步的操作,kube-dns的插件就安装好了,先来看看我们都安装了什么,可以通过kubectl也可以通过dashboard来查看我们创建的service,rc和pod,下面的截图是通过kubectl来查看的

image.png

从图中可以看出启动了kube-dns-v6-41d2c这个pod,启在192.168.100.93这个节点上,分配的IP是172.17.2.5,共启了3个容器,这三个容器共享IP。
从default namespace中找一个pod,用这个pod验证kube-dns

image.png

选择 tomcat-gllz3这个pod,理由是这个pod中的容器装有nslookup。

image.png

从图中可以看出所有的service都可以通过kubedns解析出来
注意:kubedns的域名规则是service-name.namespace.svc.domain
service-name 即为某个service的name
namespace 为该service所在的namespace
svc 为固定字符
domain 为创建kubedns pod时指定的domain也就是各节点kubelete启动参数中的--cluster-domain,本文是cluster.local
不要试图去ping service ip ,可以telnet 或是nslookup去验证service是否有效。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容