基於Kubernetes集群部署skyDNS服務


目錄貼:Kubernetes學習系列

  在之前幾篇文章的基礎,(Centos7部署Kubernetes集群基於kubernetes集群部署DashBoard為Kubernetes集群部署本地鏡像倉庫),本文繼續搭建Kubernete中的服務注冊發現機制——SkyDNS.

1、部署Cluster DNS

1.1 原理

  通過前面對Kubernetes的討論(Kubernetes核心概念總結).我們已經知道,每個Kubernetes service都綁定了一個虛擬IP 地址(ClusterIP),而且Kubernetes最初使用向pod中注入環境變量的方式實現服務發現,但這會帶來環境變量泛濫等問題。故需要增加集群DNS服務為每個service映射一個域名。到Kubernetes v1.2版本時,DNS作為一個系統可選插件集成到Kubernetes集群中。Kubernetes默認使用SkyDNS 作為集群的DNS服務器,

  kubernetes可以為pod提供dns(skyDNS)內部域名解析服務。其主要作用是為pod提供可以直接通過service的名字解析為對應service的ip的功能。啟用了集群DNS選項,需要創建一個運行SkyDNS域名服務器的pod和一個對外提供集群service域名解析服務的SkyDNS service,並且還會為該service綁定一個穩定的靜態IP地址作為入口IP地址。然后,Kubelet被配置成向每個Docker容器傳人SkyDNS service的IP地址。作為它們其中一個DNS服務器。每個在Kubernetes集群中定義的service包括DNS服務器本身對應的service都會被映射到一個DNS域名,該域名一般由兩個部分組成:service所在namespace和service名。默認情況下,一個客戶端pod的DNS搜索列表一般包含pod自身的namespace和集群的默認域名集。SkyDNS service的域名搜索順序大致如下。

    搜索客戶端pod所在namespace中所有的service域名記錄;

    搜索目標域名namespace中所有的service域名記錄;

    從當前Kubernetes集群中,搜索所有的service域名記錄。

  skyDNS由三部分組成:kube2sky、etcd、skydns。

    kube2sky的功能是監測api-server中的service的變化,當service創建、刪除、修改時,獲取對應的service信息,將其保存在etcd的中;

    Etcd的功能是存儲kube2sky保存過來的數據;

    Skydns。在kubelet創建pod時,會使用為kubelet配置的“KUBELET_ARGS="--cluster-dns=10.254.10.2 --cluster-domain=sky --allow-privileged=true"” 在創建的pod中從而使用對應的dns服務器。而這一dns解析服務,實際是由Skydns提供的。

1.2 配置etcd中關於skyDNS的key

[root@k8s-master ~]# etcdctl mk /skydns/config '{"dns-addr":"10.254.10.2:53","ttl":3600,"domain":"sky."}'
{"dns-addr":"10.254.10.2:53","ttl":3600,"domain":"sky."}

1.3 配置kubelet中相關信息

  在每個node中更改kubelet的配置文件如下紅色部分,更改完成之后重啟服務。

[root@K8s-node-1 ~]# vim /etc/kubernetes/kubelet

###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"

# The port for the info server to serve on
# KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=k8s-node-1"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://k8s-master:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own! KUBELET_ARGS="--cluster-dns=10.254.10.2 --cluster-domain=sky --allow-privileged=true"

[root@k8s-node-1 ~]# systemctl restart kubelet.service

1.4 yaml文件

  編輯skydns_dpm.yaml文件,更改以下紅色部分(拷貝到機器上之后,最好把中文注釋去掉):

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kube-dns
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: kube-dns
        tier: platform
        subsystem: unconfirmed
        k8s-app: kube-dns
        version: v9
        partition: "no"
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: kube2sky
      #填寫你自己的鏡像名稱
        image: gcr.io/google_containers/kube2sky:1.11
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        args:
        # 同etcd中配置的/skydns/config中的domain名
        - -domain=sky
        # master地址
        - --kube_master_url=http://10.0.251.148:8080
        # etcd地址
        - -etcd-server=http://10.0.251.148:2379
      - name: skydns
        #你的鏡像名稱
        image: gcr.io/google_containers/skydns:2015-10-13-8c72f8c 
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        args:
        # command = "/skydns"
        # etcd地址
        - -machines=http://10.0.251.148:2379
        - -addr=0.0.0.0:53
        - -ns-rotate=false
        #同etcd中配置的/skydns/config中的domain名,最后有‘點’
        - -domain=sky.
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
      dnsPolicy: Default  # Don't use cluster DNS.

  編輯skydns-svc.yaml文件,更改以下紅色部分:

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.254.10.2
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

1.5 啟動

  在master執行如下命令:

kubectl create -f skydns_dpm.yaml 
kubectl create -f skydns-svc.yaml

  之后,dns搭建完成。

[root@k8s-master yaml]# kubectl get deployment --all-namespaces
NAMESPACE     NAME   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-system   kube-dns        1         1         1            1           2m
kube-system kubernetes-dashboard-latest   1         1         1            1           1d
[root@k8s-master yaml]# kubectl get pod  -o wide  --all-namespaces
NAMESPACE     NAME   READY     STATUS    RESTARTS   AGE       IP          NODE
kube-system   kube-dns-520758324-1luff   2/2       Running   0  2m   10.0.28.2   k8s-node-1
kube-system kubernetes-dashboard-latest-127826951-pxrpk 1/1 Running   0  1d   10.0.62.2   k8s-node-2

1.6 DNS功能驗證

1.6.1 創建測試service

[root@k8s-master yaml]# cat test_svc.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

[root@k8s-master yaml]# kubectl create -f test_svc.yml
service "mysql-service" created
[root@k8s-master yaml]#  kubectl get service
NAME            CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes      10.254.0.1      <none>        443/TCP    1d
mysql-service   10.254.61.203   <nodes>       3306/TCP   6s

1.6.2 創建測試pod

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

[root@k8s-master yaml]# kubectl create -f busybox.yml
pod "busybox" created
[root@k8s-master yaml]# kubectl get pod  -o wide  --all-namespaces
NAMESPACE     NAME   READY     STATUS RESTARTS AGE IP          NODE
default       busybox 1/1       Running   0    18s       10.0.62.3   k8s-node-2
kube-system   kube-dns-520758324-1luff   2/2 Running   0     33m 10.0.28.2  k8s-node-1
kube-system kubernetes-dashboard-latest-127826951-pxrpk 1/1 Running 0 1d  10.0.62.2 k8s-node-2

1.6.3 進入pod驗證服務解析

[root@k8s-master yaml]# kubectl exec -i -t busybox sh
/ # cat /etc/resolv.conf 
search default.svc.sky svc.sky sky openstacklocal
nameserver 10.254.10.2
nameserver 10.0.251.90
nameserver 192.168.5.225
nameserver 192.168.5.226
options ndots:5
/ #
/ #  ping mysql-service  
PING mysql-service (10.254.61.203): 56 data bytes

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM