zoukankan      html  css  js  c++  java
  • 附011.Kubernetes-DNS及搭建

    一 Kubernetes DNS介绍

    1.1 Kubernetes DNS发展

    作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,因此需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。
    DNS服务在Kubernetes的发展过程中经历了3个阶段,SkyDNS ----> KubeDNS ----> CoreDNS。

    1.2 SkyDNS

    在Kubernetes 1.2版本时,DNS服务是由SkyDNS提供的,它由4个容器组成:kube2sky、skydns、etcd和healthz。
    kube2sky容器监控Kubernetes中Service资源的变化,根据Service的名称和IP地址信息生DNS记录,并将其保存到etcd中。
    skydns容器从etcd中读取DNS记录,并为客户端容器应用提供DNS查询服务。
    healthz容器提供对skydns服务的健康检查功能。
    SkyDNS的总体架构如下:
    clipboard

    1.3 KubeDNS

    从Kubernetes 1.4版本开始,SkyDNS组件便被KubeDNS替换,主要考虑是SkyDNS组件之间通信较多,整体性能不高。
    KubeDNS由3个容器组成:kubedns、dnsmasq和sidecar,去掉了SkyDNS中的etcd存储,将DNS记录直接保存在内存中,以提高查询性能。
    kubedns容器监控Kubernetes中Service资源的变化,根据Service的名称和IP地址生成DNS记录,并将DNS记录保存在内存中。
    dnsmasq容器从kubedns中获取DNS记录,提供DNS缓存,为客户端容器应用提供DNS查询服务。
    sidecar提供对kubedns和dnsmasq服务的健康检查功能。
    KubeDNS的总体架构如下:
    clipboard

    1.4 CoreDNS

    从Kubernetes 1.11版本开始,Kubernetes集群的DNS服务由CoreDNS提供。CoreDNS是CNCF基金会的一个项目,是用Go语言实现的高性能、插件式、易扩展的DNS服务端。
    CoreDNS解决了KubeDNS的一些问题,例如dnsmasq的安全漏洞、externalName不能使用stubDomains设置,等等。
    CoreDNS支持自定义DNS记录及配置upstream DNS Server,可以统一管理Kubernetes基于服务的内部DNS和数据中心的物理DNS。
    CoreDNS没有使用多个容器的架构,只用一个容器便实现了KubeDNS内3个容器的全部功能。
    CoreDNS的总体架构如下:
    clipboard

    二 CoreDNS部署

    2.1 修改kubelet启动参数

    部署之前需要修改每个Node上kubelet的启动参数,加上以下两个参数:
    • --cluster-dns=169.169.0.100:为DNS服务的ClusterIP地址。
    • --cluster-domain=cluster.local:为在DNS服务中设置的域名。
    然后重启kubelet服务。
    提示:也可通过如下方式引入yaml配置文件实现:
      1 # vi /etc/systemd/system/kubelet.service
      2 ……
      3 --config=/etc/kubernetes/kubelet-config.yaml 
      4 ……
      5 # vi /etc/kubernetes/kubelet-config.yaml
      6 ……
      7 clusterDomain: "cluster.local"
      8 clusterDNS:
      9   - "10.254.0.2"
     10 ……

    2.2 创建授权

    在启用了RBAC的集群中, 还可以设置ServiceAccount、 ClusterRole、 ClusterRoleBinding对CoreDNS容器进行权限设置。ServiceAccount、 ClusterRole、 ClusterRoleBinding相关yaml如下:
      1 [root@k8smaster01 ~]# vi corednsaccout.yaml
      2 # __MACHINE_GENERATED_WARNING__
      3 
      4 apiVersion: v1
      5 kind: ServiceAccount
      6 metadata:
      7   name: coredns
      8   namespace: kube-system
      9   labels:
     10       kubernetes.io/cluster-service: "true"
     11       addonmanager.kubernetes.io/mode: Reconcile
     12 ---
     13 apiVersion: rbac.authorization.k8s.io/v1
     14 kind: ClusterRole
     15 metadata:
     16   labels:
     17     kubernetes.io/bootstrapping: rbac-defaults
     18     addonmanager.kubernetes.io/mode: Reconcile
     19   name: system:coredns
     20 rules:
     21 - apiGroups:
     22   - ""
     23   resources:
     24   - endpoints
     25   - services
     26   - pods
     27   - namespaces
     28   verbs:
     29   - list
     30   - watch
     31 - apiGroups:
     32   - ""
     33   resources:
     34   - nodes
     35   verbs:
     36   - get
     37 ---
     38 apiVersion: rbac.authorization.k8s.io/v1
     39 kind: ClusterRoleBinding
     40 metadata:
     41   annotations:
     42     rbac.authorization.kubernetes.io/autoupdate: "true"
     43   labels:
     44     kubernetes.io/bootstrapping: rbac-defaults
     45     addonmanager.kubernetes.io/mode: EnsureExists
     46   name: system:coredns
     47 roleRef:
     48   apiGroup: rbac.authorization.k8s.io
     49   kind: ClusterRole
     50   name: system:coredns
     51 subjects:
     52 - kind: ServiceAccount
     53   name: coredns
     54   namespace: kube-system
     55 
     56 [root@k8smaster01 ~]# kubectl create -f corednsaccout.yaml

    2.3 创建ConfigMap

      1 [root@k8smaster01 ~]# vi corednsconfigmap.yaml
      2 apiVersion: v1
      3 kind: ConfigMap
      4 metadata:
      5   name: coredns
      6   namespace: kube-system
      7   labels:
      8       addonmanager.kubernetes.io/mode: EnsureExists
      9 data:
     10   Corefile: |
     11     .:53 {
     12         errors
     13         health
     14         kubernetes cluster.local in-addr.arpa ip6.arpa {
     15             pods insecure
     16             upstream
     17             fallthrough in-addr.arpa ip6.arpa
     18         }
     19         prometheus :9153
     20         forward . /etc/resolv.conf
     21         cache 30
     22         loop
     23         reload
     24         loadbalance
     25     }
     26 
     27 [root@k8smaster01 ~]# kubectl create -f corednsconfigmap.yaml

    2.4 创建Deployment

      1 [root@k8smaster01 ~]# vi corednsdeploy.yaml
      2 apiVersion: apps/v1
      3 kind: Deployment
      4 metadata:
      5   name: coredns
      6   namespace: kube-system
      7   labels:
      8     k8s-app: kube-dns
      9     kubernetes.io/cluster-service: "true"
     10     addonmanager.kubernetes.io/mode: Reconcile
     11     kubernetes.io/name: "CoreDNS"
     12 spec:
     13   # replicas: not specified here:
     14   # 1. In order to make Addon Manager do not reconcile this replicas parameter.
     15   # 2. Default is 1.
     16   # 3. Will be tuned in real time if DNS horizontal auto-scaling is turned on.
     17   strategy:
     18     type: RollingUpdate
     19     rollingUpdate:
     20       maxUnavailable: 1
     21   selector:
     22     matchLabels:
     23       k8s-app: kube-dns
     24   template:
     25     metadata:
     26       labels:
     27         k8s-app: kube-dns
     28       annotations:
     29         seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
     30     spec:
     31       priorityClassName: system-cluster-critical
     32       serviceAccountName: coredns
     33       tolerations:
     34         - key: "CriticalAddonsOnly"
     35           operator: "Exists"
     36       nodeSelector:
     37         beta.kubernetes.io/os: linux
     38       containers:
     39       - name: coredns
     40         image: registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1
     41         imagePullPolicy: IfNotPresent
     42         resources:
     43           limits:
     44             memory: 170Mi
     45           requests:
     46             cpu: 100m
     47             memory: 70Mi
     48         args: [ "-conf", "/etc/coredns/Corefile" ]
     49         volumeMounts:
     50         - name: config-volume
     51           mountPath: /etc/coredns
     52           readOnly: true
     53         ports:
     54         - containerPort: 53
     55           name: dns
     56           protocol: UDP
     57         - containerPort: 53
     58           name: dns-tcp
     59           protocol: TCP
     60         - containerPort: 9153
     61           name: metrics
     62           protocol: TCP
     63         livenessProbe:
     64           httpGet:
     65             path: /health
     66             port: 8080
     67             scheme: HTTP
     68           initialDelaySeconds: 60
     69           timeoutSeconds: 5
     70           successThreshold: 1
     71           failureThreshold: 5
     72         readinessProbe:
     73           httpGet:
     74             path: /health
     75             port: 8080
     76             scheme: HTTP
     77         securityContext:
     78           allowPrivilegeEscalation: false
     79           capabilities:
     80             add:
     81             - NET_BIND_SERVICE
     82             drop:
     83             - all
     84           readOnlyRootFilesystem: true
     85       dnsPolicy: Default
     86       volumes:
     87         - name: config-volume
     88           configMap:
     89             name: coredns
     90             items:
     91             - key: Corefile
     92               path: Corefile
     93 
     94 [root@k8smaster01 ~]# kubectl create -f corednsdeploy.yaml
    提示:replicas副本的数量通常应该根据集群的规模和服务数量确定,如果单个CoreDNS进程不足以支撑整个集群的DNS查询,则可以通过水平扩展提高查询能力。由于DNS服务是Kubernetes集群的关键核心服务,所以建议为其Deployment设置自动扩缩容控制器,自动管理其副本数量。
    同时,对资源限制部分(CPU限制和内存限制) 的设置也应根据实际环境进行调整。

    2.5 创建Service

      1 [root@k8smaster01 ~]# vi corednssvc.yaml
      2 apiVersion: v1
      3 kind: Service
      4 metadata:
      5   name: kube-dns
      6   namespace: kube-system
      7   annotations:
      8     prometheus.io/port: "9153"
      9     prometheus.io/scrape: "true"
     10   labels:
     11     k8s-app: kube-dns
     12     kubernetes.io/cluster-service: "true"
     13     addonmanager.kubernetes.io/mode: Reconcile
     14     kubernetes.io/name: "CoreDNS"
     15 spec:
     16   selector:
     17     k8s-app: kube-dns
     18   clusterIP: 10.254.0.2
     19   ports:
     20   - name: dns
     21     port: 53
     22     protocol: UDP
     23   - name: dns-tcp
     24     port: 53
     25     protocol: TCP
     26   - name: metrics
     27     port: 9153
     28     protocol: TCP
     29 
     30 [root@k8smaster01 ~]# kubectl create -f corednssvc.yaml

    2.6 确认验证

      1 [root@k8smaster01 ~]# kubectl get deployments --namespace=kube-system
      2 NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
      3 coredns                1/1     1            1           14s
      4 [root@k8smaster01 ~]# kubectl get pod --namespace=kube-system
      5 NAME                                    READY   STATUS    RESTARTS   AGE
      6 coredns-5b46b98d57-cknrr                1/1     Running   0          34s
      7 [root@k8smaster01 ~]# kubectl get svc --namespace=kube-system
      8 NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
      9 kube-dns               ClusterIP   10.254.0.2     <none>        53/UDP,53/TCP,9153/TCP   47s

    三 服务名DNS解析

    3.1 创建测试Pod

      1 [root@k8smaster01 ~]# vi busybox.yaml
      2 apiVersion: v1
      3 kind: Pod
      4 metadata:
      5   name: busybox
      6   namespace: default
      7 spec:
      8   containers:
      9   - name: busybox
     10     image: gcr.azk8s.cn/google_containers/busybox
     11     command:
     12       - sleep
     13       - "3600"
     14 
     15 [root@k8smaster01 ~]# kubectl exec -ti busybox -- nslookup webapp		#测试解析
     16 Server:    10.254.0.2
     17 Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.local
     18 
     19 Name:      webapp
     20 Address 1: 10.254.156.234 webapp.default.svc.cluster.local
    提示:如果某个Service属于不同的命名空间,那么在进行Service查找时,需要补充Namespace的名称,组合成完整的域名。
      1 [root@k8smaster01 ~]# kubectl exec -ti busybox -- nslookup kube-dns.kube-system	#补充kube-system的namespace
      2 Server:    10.254.0.2
      3 Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.local
      4 
      5 Name:      kube-dns.kube-system
      6 Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.local

    四 CoreDNS配置说明

    4.1 常见插件

    CoreDNS的主要功能是通过插件系统实现的。CoreDNS实现了一种链式插件结构,将DNS的逻辑抽象成了一个个插件,能够灵活组合使用。
    常用的插件如下:
    • loadbalance:提供基于DNS的负载均衡功能。
    • loop:检测在DNS解析过程中出现的简单循环问题。
    • cache:提供前端缓存功能。
    • health:对Endpoint进行健康检查。
    • kubernetes:从Kubernetes中读取zone数据。
    • etcd:从etcd读取zone数据,可以用于自定义域名记录。
    • file:从RFC1035格式文件中读取zone数据。
    • hosts:使用/etc/hosts文件或者其他文件读取zone数据,可以用于自定义域名记录。
    • auto:从磁盘中自动加载区域文件。
    • reload:定时自动重新加载Corefile配置文件的内容。
    • forward:转发域名查询到上游DNS服务器。
    • proxy:转发特定的域名查询到多个其他DNS服务器,同时提供到多个DNS服务器的负载均衡功能。
    • prometheus:为Prometheus系统提供采集性能指标数据的URL。
    • pprof:在URL路径/debug/pprof下提供运行时的性能数据。
    • log:对DNS查询进行日志记录。
    • errors:对错误信息进行日志记录。

    4.2 插件配置

    示例1:
      1 [root@k8smaster01 ~]# vi corednsconfigmap.yaml
      2 apiVersion: v1
      3 kind: ConfigMap
      4 metadata:
      5   name: coredns
      6   namespace: kube-system
      7   labels:
      8       addonmanager.kubernetes.io/mode: EnsureExists
      9 data:
     10   Corefile: |
     11     .:53 {
     12         errors
     13         health
     14         kubernetes cluster.local in-addr.arpa ip6.arpa {
     15             pods insecure
     16             upstream
     17             fallthrough in-addr.arpa ip6.arpa
     18         }
     19         prometheus :9153
     20         forward . /etc/resolv.conf
     21         cache 30
     22         loop
     23         reload
     24         loadbalance
     25     }
    如上所示为域名“cluster.local”设置了一系列插件, 包括errors、health、kubernetes、prometheus、forward、cache、loop、reload和loadbalance,在进行域名解析时, 这些插件将以从上到下的顺序依次执行。
    示例2:如下为使用etcd插件的配置示例,将以“.com”结尾的域名记录配置为从etcd中获取,并将域名记录保存在/skydns路径下。
      1 {
      2 etcd com {
      3 path /skydns
      4 endpoint http://192.168.18.3:2379
      5 upstream /etc/resolv.conf
      6 }
      7 cache 160 com
      8 loadbalance
      9 proxy . /etc/resolv.conf
     10 
     11 }
     12 [root@k8smaster01 ~]# etcdctl put /skydns/com/mycompany '{"host":"10.1.1.1","ttl":"60"}'	#测试插入
     13 [root@k8smaster01 ~]# nslookpu mycompany.com
    提示:forward和proxy插件都可以用于配置上游DNS服务器或其他DNS服务器,当在CoreDNS中查询不到域名时,会到其他DNS服务器上进行查询。在实际环境中,可以将Kubernetes集群外部的DNS纳入CoreDNS,进行统一的DNS管理。

    五 Pod级别的DNS设置

    5.1 Pod级别设置

    集群的DNS(CoreDNS)配置之外,针对Pod中也可以设置相应的DNS策略。
    示例1:
      1 [root@k8smaster01 study]# vi mywebapp.yaml
      2 apiVersion: v1
      3 kind: Pod
      4 metadata:
      5   name: webapp
      6 spec:
      7   containers:
      8   - name: webapp
      9     image: tomcat
     10   dnsPolicy: Default
     11 ……
    目前可以设置的DNS策略如下:
    • Default:继承Pod所在宿主机的DNS设置。
    • ClusterFirst:优先使用Kubernetes环境的DNS服务(如CoreDNS提供的域名解析服务),将无法解析的域名转发到从宿主机继承的DNS服务器。
    • ClusterFirstWithHostNet:与ClusterFirst相同,对于以hostNetwork模式运行的Pod,应明确指定使用该策略。
    • None:忽略Kubernetes环境的DNS配置,通过spec.dnsConfig自定义DNS配置。这个选项从Kubernetes1.9版本开始引入,到Kubernetes 1.10版本升级为Beta版,到Kubernetes1.14版本升级为稳定版。自定义DNS配置可以通过spec.dnsConfig字段进行设置,可以设置下列信息。
      • nameservers:一组DNS服务器的列表,最多可以设置3个。
      • searches:一组用于域名搜索的DNS域名后缀,最多可以设置6个。
      • options:配置其他可选DNS参数,例如ndots、timeout等,以name或name/value对的形式表示。
    示例2:dnsConfig外部字段配置示例。
      1 [root@k8smaster01 study]# vi mywebapp.yaml
      2 apiVersion: v1
      3 kind: Pod
      4 metadata:
      5   namespace: default
      6   name: dns-example
      7 spec:
      8   containers:
      9   - name: test
     10     image: nginx
     11   dnsPolicy: "None"
     12   dnsConfig:
     13     nameservers:
     14       - 223.5.5.5
     15     searches:
     16       - ns1.svc.cluster.local
     17       - my.dns.search.suffix
     18     options:
     19       - name: ndots
     20         value: "2"
     21       - name: edns0
      1 [root@k8smaster01 study]# kubectl create -f mywebapp.yaml
      2 [root@k8smaster01 study]# kubectl exec -ti dns-example -- cat /etc/resolv.conf		#确认查看
      3 nameserver 223.5.5.5
      4 search ns1.svc.cluster.local my.dns.search.suffix
      5 options ndots:2 edns0
    提示:如上配置从而实现Pod中自定义DNS,而不再使用Kubernetes环境的DNS服务。
  • 相关阅读:
    margin:0 auto是什么意思
    CSS border-collapse 属性
    CSS-水平和垂直居中
    jQuery 事件
    移动端Html5控制布局
    CSS :root 测试
    SQL 读取XML到Datatable
    微信小程序 table 简单测试
    微信小程序 JS 获取View 和 屏幕相关属性(高度、宽度等等)
    JavaScript(正则表达式一)
  • 原文地址:https://www.cnblogs.com/itzgr/p/11978187.html
Copyright © 2011-2022 走看看