zoukankan      html  css  js  c++  java
  • k8s之DNS服务器搭建

     


    一、导读

    在使用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包含了四个容器的定义:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: kube-dns-v8
      namespace: kube-system
      labels:
        k8s-app: kube-dns
        version: v8
        kubernetes.io/cluster-service: "true"
    spec:
      replicas: 1
      selector:
        k8s-app: kube-dns
        version: v8
      template:
        metadata:
          labels:
            k8s-app: kube-dns
            version: v8
            kubernetes.io/cluster-service: "true"
        spec:
          containers:
          - name: etcd
            image: empiregeneral/etcd-amd64:latest
            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: syncgooglecontainers/kube2sky-amd64:1.15
            resources:
              limits:
                cpu: 100m
                memory: 50Mi
            args:
            - --domain=cluster.local
            - --kube_master_url=http://192.168.197.100:8080
          - name: skydns
            image: yaronr/skydns:latest
            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
            livenessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 30
              timeoutSeconds: 5
          - name: healthz
            image: syncgooglecontainers/exechealthz:1.1
            resources:
              limits:
                cpu: 10m
                memory: 20Mi
            args:
            - -cmd=nslookup kubernetes.default.svc.cluster.local localhost >/dev/null
            - -port=8080
            ports:
            - containerPort: 8080
              protocol: TCP
          volumes:
          - name: etcd-storage
            emptyDir: {}
          dnsPolicy: Default  # Don't use cluster DNS.

      

    上述需要注意的是,需要将

    1
    --kube_master_url=http://192.168.197.100:8080

      

    改成集群中master的IP,镜像如果下载失败,可从docker hub里面找,我就是从docker hub里面找到相应的镜像。

    skydns-svc.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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.96.0.10
      ports:
      - name: dns
        port: 53
        protocol: UDP
      - name: dns-tcp
        port: 53
        protocol: TCP

      

    需要指定一个clusterIP,不能靠k8s自动分配,每个Node的kubelet都是用这个IP地址,另外,这个IP需要在kube-apiserver启动参数--service-cluster-ip-range指定的IP范围内

    kube-apiserver的配置文件在/etc/kubernetes/manifests目录下:

     

    (3)修改每台Node上的kubelet参数

    添加以下两个参数:

    1
    2
    --cluster_dns=169.169.0.100: 为dns服务的clusterIP地址
    --cluster_domain=cluster.local: 为dns服务中设置的域名

      

    比如我这边的是这样:

    1
    2
    3
    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

    1
    2
    3
    systemctl stop kubelet
    systemctl daemon-reload
    systemctl start kubelet

      

     

    修改完参数之后,启动dns

    1
    2
    kubectl create -f skydns-rc.yaml
    kubectl create -f skydns-svc.yaml

      

    (4)验证

    启动一个busybox容器。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
      labels:
        name: busybox
      namespace: default
    spec:
      containers:
      - image: busybox
        imagePullPolicy: IfNotPresent
        command:
          - sleep
          - "3600"
        name: busybox
      restartPolicy: Always

      

    启动之后进入容器内部:

    nsloogup 服务名

     

    可知解析后的ip是10.102.184.126。

    然后查找对应的redis 的Service的ip,可以看到,两个IP是对的上的。

     

    又例如之前的springboot连接redis:

    在构建镜像的时候直接使用ip,这次改为使用服务名:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    FROM centos:7
     
     
    LABEL author=lsy
     
     
    ENV path=/usr/soft
     
     
    RUN mkdir ${path}
     
     
    WORKDIR ${path}
     
     
    ADD jdk-8u191-linux-x64.tar.gz ${path}
     
     
    ENV JAVA_HOME=${path}/jdk1.8.0_191
    ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH=$JAVA_HOME/bin:$PATH
     
     
    COPY k8s_demo-1.0.jar ${path}
     
     
    EXPOSE 8080
     
     
    CMD  java -jar -DredisIp=redis k8s_demo-1.0.jar

      

    然后进行镜像构建:

     

    然后改为使用当前镜像进行容器的构建,之后创建容器

    测试:

    设置值:

     

    取值:

  • 相关阅读:
    JAVA——return浅析
    JAVA泛型【转】
    C#——WinForm修改密码
    java获取当前时间的方式【转】
    iOS 取得单张系统图片
    iOS UIView的简单渐变效果
    UIView 添加子视图的常用方法
    IOS之UIView的tag学习
    OC学习笔记之属性详解和易错点
    oc对象函数什么时候返回值类型使用instancetype
  • 原文地址:https://www.cnblogs.com/wjxzs/p/14236159.html
Copyright © 2011-2022 走看看