zoukankan      html  css  js  c++  java
  • Kubernetes-dns 服务搭建

    DNS 服务不是独立的系统服务,而是一种 addon ,作为插件来安装的,不是 kubernetes 集群必须的(但是非常推荐安装)。可以把它看做运行在集群上的应用,只不过这个应用比较特殊而已。

    DNS 有两种配置方式,在 1.3 之前使用 etcd + kube2sky + skydns 的方式,在 1.3 之后可以使用 kubedns + dnsmasq 的方式。

    第一步在所有node节点增加如下配置

    vi /etc/kubernetes/kubelet
    KUBELET_ARGS="--cluster_dns=10.254.0.10 --cluster_domain=cluster.local"
    systemctl restart kubelet kube-proxy
    

    安装前准备

    下载k8s-dns需要的yaml文档
    github下载路径:kubernetes/cluster/addons/dns/

    kubedns-svc.yaml.sed
    kubedns-controller.yaml.sed
    kubedns-cm.yaml
    kubedns-sa.yaml
    

    准备dns服务需要三个images

    docker save gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4 >dns.tar
    docker save gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4 >dnsmasq.tar
    docker save gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4 >sidecar.tar
    
    docker load < dns.tar 
    docker load < dnsmasq.tar
    docker load < sidecar.tar
    
    docker tag gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4  harbor.biglittleant.cn/udoctor/k8s-dns-kube-dns-amd64:1.14.4
    docker push harbor.biglittleant.cn/udoctor/k8s-dns-kube-dns-amd64:1.14.4
    
    docker tag gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4 harbor.biglittleant.cn/udoctor/k8s-dns-dnsmasq-nanny-amd64:1.14.4
    docker push harbor.biglittleant.cn/udoctor/k8s-dns-dnsmasq-nanny-amd64:1.14.4
    
    docker tag gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4 harbor.biglittleant.cn/udoctor/k8s-dns-sidecar-amd64:1.14.4
    docker push harbor.biglittleant.cn/udoctor/k8s-dns-sidecar-amd64:1.14.4
    

    修改配置文件

    1. 将images镜像修改为上面的私有仓库镜像。
    2. kubedns-controller.yaml中的$DNS_DOMAIN替换成cluster.local
    3. kubedns-controller.yaml中的$DNS_SERVER_IP替换成10.254.0.10。这个IP 要跟你集群配置的IP一个网段。
    4. 在kubedns这个镜像下的args中增加:- --kube-master-url=http://192.168.56.12:8080
    5. 因为kubernetes的版本是1.5.2 所以禁用volumes的参数。
    #      tolerations:
    #      - key: "CriticalAddonsOnly"
    #        operator: "Exists"
    #      volumes:
    #      - name: kube-dns-config
    #        configMap:
    #          name: kube-dns
    #          optional: true
    
    #        volumeMounts:
    #        - name: kube-dns-config
    #          mountPath: /kube-dns-config
    
    #        volumeMounts:
    #        - name: kube-dns-config
    #          mountPath: /etc/k8s/dns/dnsmasq-nanny
    

    CLUSTER-IP 这个IP 就是你集群配置的IP。

    kubectl get services
    NAME          CLUSTER-IP      EXTERNAL-IP   PORT(S)                     AGE
    kubernetes    10.254.0.1      <none>        443/TCP                     3d
    

    创建k8s-dns集群

    kubectl create -f sa/kubedns-sa.yaml
    kubectl create -f sa/kubedns-cm.yaml
    kubectl create -f sa/kubedns-controller.yaml
    kubectl create -f sa/kubedns-svc.yaml
    

    查看集群节点是否配置成功

    kubectl get pods --namespace=kube-system
    NAME                                    READY     STATUS    RESTARTS   AGE
    kube-dns-3132964191-xh7fh               3/3       Running   0          4h
    

    验证kubernetes dns是否可用

    我们创建一个busybox.yaml 文件,并启动,查看解析是否正常。

    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
      namespace: default
    spec:
      containers:
      - image: busybox
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
        name: busybox
      restartPolicy: Always
    
    kubectl create -f busybox.yaml
    

    查看已有的services服务,并测试是否可以解析

     kubectl get services 
    NAME          CLUSTER-IP      EXTERNAL-IP   PORT(S)                     AGE
    kubernetes    10.254.0.1      <none>        443/TCP                     3d
    
    kubectl exec -it busybox sh
    kubectl exec -it busybox sh
    / # nslookup kubernetes
    Server:    10.254.0.10
    Address 1: 10.254.0.10 kube-dns.kube-system.svc.cluster.local
    
    Name:      kubernetes
    Address 1: 10.254.0.1 kubernetes.default.svc.cluster.local
    

    不管那种部署很是,kubernetes 对外提供的 DNS 服务是一致的。每个 service 都会有对应的 DNS 记录,kubernetes 保存 DNS 记录的格式如下:

    <service_name>..svc.
    每个部分的字段意思:

    service_name: 服务名称,就是定义 service 的时候取的名字
    namespace:service 所在 namespace 的名字
    domain:提供的域名后缀,比如默认的 cluster.local

    参考文档

    DNS Pods and Services
    kubernetes 简介:kube-dns 和服务发现
    部署kubernetes dns服务
    部署kubernetes dns服务
    kubernetes的使用四–安装kube-dns
    k8s集群之kubernetes-dashboard和kube-dns组件部署安装
    服务发现机制与Cluster DNS的安装(无CA认证版)
    serviceaccount/token: no such file or directory

    报错汇总

    报错一 :提示Volume 错误

    error: error validating "sa/kubedns-controller.yaml": error validating data: [found invalid field tolerations for v1.PodSpec, found invalid field optional for v1.ConfigMapVolumeSource]; if you choose to ignore these errors, turn validation off with --validate=false
    

    报错原因

    v1.ConfigMapVolumeSource 这个参数在kubernetes 1.6以上的版本才有,yum安装默认是1.5.2 所以需要禁用这个功能。
    

    vim kubedns-controller.yaml 这个文件一共编辑三处

    #      tolerations:
    #      - key: "CriticalAddonsOnly"
    #        operator: "Exists"
    #      volumes:
    #      - name: kube-dns-config
    #        configMap:
    #          name: kube-dns
    #          optional: true
    
    #        volumeMounts:
    #        - name: kube-dns-config
    #          mountPath: /kube-dns-config
    
    #        volumeMounts:
    #        - name: kube-dns-config
    #          mountPath: /etc/k8s/dns/dnsmasq-nanny
    

    报错二

    CrashLoopBackOff  Failed to create a kubernetes client: open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory
    

    报错的原因是因为k8s-dns 需要启用安全机制

    KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
    

    在master-apiserver 配置文件中增加上面这行。但是相当于服务器开启了CA验证机制。需要的话,可以参考文章集群基于CA签名的安全设置

    方法二:手动指定master-api的位置,在kubedns这个镜像下的args中增加:- --kube-master-url=http://10.10.0.183:8080。重新创建。

    vim kubedns-controller.yaml
          containers:
          - name: kubedns
            image: harbor.cloudh.net.cn/udoctor/k8s-dns-kube-dns-amd64:1.14.4
            args:
            - --domain=cluster.local.
            - --dns-port=10053
            - --config-dir=/kube-dns-config
            - --v=2
            - --kube-master-url=http://10.10.0.183:8080
    
  • 相关阅读:
    Java中JDK,JRE和JVM之间的关系-(转载)
    linux(Ubuntu)安装QQ2013(转)
    Java-寻找矩阵连通域个数
    Linux 安装 python IDE
    Java学习笔记-数组与容器间的转制-asList
    由LCS到编辑距离—动态规划入门—算法学习笔记
    Java学习笔记-策略模式
    Java学习笔记-模板方法模式
    Java学习笔记-迭代器模式
    Java学习笔记-Collections.sort详解
  • 原文地址:https://www.cnblogs.com/biglittleant/p/7463535.html
Copyright © 2011-2022 走看看