阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Kubernetes入门之skydns

146次阅读
没有评论

共计 5150 个字符,预计需要花费 13 分钟才能阅读完成。

部署 kubernetes dns 服务

kubernetes 可以为 pod 提供 dns 内部域名解析服务。其主要作用是为 pod 提供可以直接通过 service 的名字解析为对应 service 的 ip 的功能。

部署 kubernetes dns 服务主要需要两部分。

kubelet

在 kubelet 中增加启动项,修改

$ vi /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.0.10 --cluster_domain=kube.local"

创建 dns rc 和 service

以下为两个 dns rc 和 service 的配置文件

[root@localhost calico]# cat /etc/kubernetes/skydns-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: kube-dns-v6
  namespace: default
  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
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: etcd
        image: gcr.io/google_containers/etcd:2.0.9
        command:
        - /usr/local/bin/etcd
        - -listen-client-urls
        - http://0.0.0.0:2379,http://0.0.0.0:4001
        - -advertise-client-urls
        - http://127.0.0.1:2379,http://127.0.0.1:4001
        - -initial-cluster-token
        - skydns-etcd
      - name: kube2sky
        image: gcr.io/google_containers/kube2sky:1.11
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        command:
        - /kube2sky
        - --kube_master_url=http://10.8.65.48:8080
        - -domain=kube.local
      - name: skydns
        image: gcr.io/google_containers/skydns:2015-03-11-001
        resources:
        command:
        - /skydns
        - -machines=http://localhost:4001
        - -addr=0.0.0.0:53
        - -domain=kube.local.
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
      dnsPolicy: Default
      
[root@localhost calico]# cat /etc/kubernetes/skydns-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: default
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.254.0.10
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

然后使用 kubectl 进行创建

kubectl create -f /etc/kubernetes/skydns-rc.yaml 
kubectl create -f /etc/kubernetes/skydns-svc.yaml 

最后使用 kubectl get rckubectl get service进行检查,验证其是否创建成功。

dns 实验

在部署完成后,进行验证实验。首先创建一个名为 mysql-service 的 service。

[root@localhost k8s]# cat srv.yml 
apiVersion: v1
kind: Service
metadata:
  labels:
    name: mysql
    role: service
  name: mysql-service
spec:
  ports:
    - port: 3306
      targetPort: 3306
  type: NodePort
  selector:
    name: mysql

通过 kubectl create -f srv.yml 创建,然后进行查看

[root@localhost k8s]# kubectl get service
NAME            CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
kube-dns        10.254.0.10     <none>        53/UDP,53/TCP   d
kubernetes      10.254.0.1      <none>        443/TCP         d
mysql-service   10.254.162.44   nodes         3306/TCP        d

可以看到 mysql-service 服务创建成功。

现在我再创建一个 pod,查看其是否能正确解析域名。这里使用最简单的 busybox 镜像。

[root@localhost k8s]# cat busybox.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: busybox
    role: master
  name: busybox
spec:
  containers:
    - name: busybox
      image: busybox  
      command:
      - sleep
      - "360000"

使用 kubectl create -f busybox.yml 创建。

使用 exec 进入到容器中进行域名解析

[root@localhost k8s]# kubectl exec -i -t busybox sh
/ # nslookup mysql-service
Server:    10.254.0.10
Address 1: 10.254.0.10 localhost

Name:      mysql-service
Address 1: 10.254.162.44
/ # nslookup mysql-service.default.kube.local
Server:    10.254.0.10
Address 1: 10.254.0.10

Name:      mysql-service.default.kube.local
Address 1: 10.254.162.44
/ # nslookup mysql-service.default.svc.kube.local
Server:    10.254.0.10
Address 1: 10.254.0.10

Name:      mysql-service.default.svc.kube.local
Address 1: 10.254.162.44

可以看到 mysql-servicemysql-service.default.svc.kube.localmysql-service.default.kube.local 的域名均能正确解析为 mysql-service 的 service 中的 ip10.254.162.44

其中 mysql-service.default.kube.local 为完整域名,其组成为<service-name>.<namespace>.<domain-name>

kubernetes dns 原理

现在反过来看 kubernetes dns 的原理。

首先在部署时候创建了一个 dns 的 rc,最终会产生三个容器(不含 pause)

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                                            COMMAND                  CREATED              STATUS              PORTS               NAMES
033800f393b9        index.alauda.cn/tutum/CentOS:centos6             "/run.sh"                3 days ago           Up 3 days           22/tcp              awesome_newton
0fb60dcfb8b4        gcr.io/google_containers/etcd:2.0.9              "/usr/local/bin/etcd"   3 days ago           Up 3 days                               k8s_etcd.8d001f7f_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_6afe5c27
0a0efd5f0aaa        gcr.io/google_containers/skydns:2015-03-11-001   "/skydns -machines=ht"   3 days ago           Up 3 days                               k8s_skydns.5d0f4a29_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_f7c4ee06
cfef318e4032        gcr.io/google_containers/kube2sky:1.11           "/kube2sky --kube_mas"   3 days ago           Up 3 days                               k8s_kube2sky.eb7ac18c_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_19b79770
afad7b2ebd3d        docker.io/kubernetes/pause                       "/pause"                 3 days ago           Up 3 days                               k8s_POD.87e723e6_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_3c3f7c87

dns 解析过程

在创建的 pod 中,可以查看其所使用的域名解析服务器:

[root@localhost k8s]# kubectl exec -i -t busybox sh
/ # cat /etc/resolv.conf 
search default.svc.kube.local svc.kube.local kube.local 
nameserver 10.254.0.10
options ndots:5

在 kubelet 创建 pod 时,会使用为 kubelet 配置的-cluster_dns=10.254.0.10 --cluster_domain=kube.local,在创建的 pod 中从而使用对应的 dns 服务器。

而这一 dns 解析服务,实际是由 dns 的 rc 中的 gcr.io/google_containers/skydns:2015-03-11-001 容器 0a0efd5f0aaa 完成的。

skydns 的数据源来自于 gcr.io/google_containers/etcd:2.0.9 的容器0fb60dcfb8b4

[root@localhost ~]# docker exec -it 0fb etcdctl get /skydns/local/kube/svc/default/mysql-service/2f1020d6
{"host":"10.254.162.44","priority":10,"weight":10,"ttl":30,"targetstrip":0}
[root@localhost ~]# docker exec -it 0fb etcdctl get /skydns/local/kube/default/mysql-service
{"host":"10.254.162.44","priority":10,"weight":10,"ttl":30,"targetstrip":0}

service 同步过程

etcd 的数据源自于 gcr.io/google_containers/kube2sky:1.11 创建的 cfef318e4032 容器。

cfef318e4032容器通过 watch kube-api 的 service,查看 service 的变化。

当 service 创建 / 删除 / 修改时,cfef318e4032容器获取对应的 service 信息,将其保存在 etcd 的容器 0fb60dcfb8b4 中,进而提供给 skydns 使用。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147495.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5150字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中