您的位置:

k8sdns详解

k8sdns是Kubernetes的一部分,它提供了在kubernetes集群内部的DNS解析服务。它通过将所有Kubernetes服务命名为DNS记录,使得容器中服务的查找变得非常简单。

一、部署

在Kubernetes集群中启用k8sdns与其他插件一样简单。有两种方式可以在Kubernetes中启用k8sdns:

方式一:使用kube-up.sh脚本,它将所有必需的组件(包括Docker、Etcd、Kubelet等)都安装在集群上:


kube-up.sh

在脚本中,在kube-up.sh脚本文件所在目录中运行命令,将创建1个Master节点和2个Minion节点。最后,k8sdns将启动在Master节点上。

方式二:使用kubectl命令行工具手动安装k8sdns。


kubectl create -f kubedns.yaml

kubedns.yaml文件的内容如下所示:


apiVersion: v1
kind: Namespace
metadata:
  name: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ""
    spec:
      containers:
      - name: etcd
        image: gcr.io/google_containers/etcd-amd64:2.2.1
        command:
        - /usr/local/bin/etcd
        - -name
        - k8s
        - -data-dir
        - /var/etcd/data
        - -advertise-client-urls
        - http://$POD_IP:2379
        - -listen-client-urls
        - http://0.0.0.0:2379
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        volumeMounts:
        - name: etcd-storage
          mountPath: /var/etcd/data
      - name: kube2sky
        image: gcr.io/google_containers/kube2sky-amd64:1.14
        args:
        - -domain=cluster.local
        - -kubeconfig=/srv/kubernetes/kubeconfig.yaml
        - -kube-master-url=http://127.0.0.1:8080
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
      - name: skydns
        image: gcr.io/google_containers/skydns-amd64:1.0
        args:
        - -machines=http://localhost:4001
        - -addr=0.0.0.0:53
        - -dns-bind-address=0.0.0.0:53
        - -domain=cluster.local.
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
      volumes:
      - name: etcd-storage
        emptyDir: {}
      dnsPolicy: Default

kubedns.yaml文件中定义了一个Deployment类型,其中包含三个容器:etcd、kube2sky和skydns。其中kube2sky包含用于从etcd中检索服务信息并处于DNS格式的skydns。

二、核心概念

1. DNS命名约定

在Kubernetes中,每个服务都由一个DNS名称(默认情况下包括两部分,service和namespace)标识。DNS名称使用的模式是service.namespace.svc.cluster.local。其中,namespace部分包含服务的命名空间,service部分包含服务名称。Kubernetes可以提供一些默认的属性(例如,默认情况下,namespace为default)。

2. DNS解析服务

k8s DNS是一个基于CoreDNS实现的DNS解析服务,主要是在Kubernetes 集群内用于服务发现,支持多种服务发现方法,为Kubernetes中所有对象(包括服务、Pod等)提供了DNS别名。

3. DNS名字解析

在Kubernetes中,可以通过DNS名字解析来访问服务。在Kubernetes节点上运行的每个Pod都自动配置为使用Kubernetes DNS插件进行域名解析。与Pod共存的Kubelet容器独立地在DNS服务器的反向解析表中为Kubernetes节点管理的所有Pod分配 nameserver IP。这些IP充当DNS服务器的递归名称服务地址,这使管理更加简单。

4. DNS解析操作

在Kubernetes中,所有的DNS解析请求都将发送到Kubernetes的“kube-dns”服务。DNS请求将被转发并解析为服务器端点。服务端点基于与服务关联的Pod标签,创建DNS记录,以便在服务名称被从DNS中解析时,返回所有同名Pod的地址集合。

三、应用场景

1. 创建服务发现

Kubernetes中的DNS解析服务可以帮助用户轻松创建服务发现。用户可以将服务名称解析为其对应的IP地址,这些IP地址中提供了应用程序所需的各种服务。这为应用程序部署提供了新的机遇,尤其是在需要将服务与其他应用程序的集成时。

2. 实现troubleshooting

k8s用于DNS解析的CoreDNS提供了具有多种功能的各种插件。例如kubernetes插件,这个插件允许CoreDNS查询Kubernetes API相关的内容(如service和endpoints)来解析服务名称。在三次握手等连接失败时,管理员可以使用此插件进行 troubleshooting。

3. 创建访问规则

Kubernetes DNS提供了一种简单的方式来配置服务的访问规则。通过为每个服务创建一个DNS名称,管理员可以指定访问每个服务所需的任何规则。管理员也可以使用特定的DNS名称来提高网络和应用程序的安全性。

四、总结

k8sdns是Kubernetes中必不可少的一部分,能够轻松地为我们提供服务发现并实现DNS别名。k8sdns能够使得整个Kubernetes集群具有更高的可用性和安全性。