Kubernetes集羣部署DNS服務

Kubernetes集羣部署DNS服務
在kubernetes中每一個service都會被分配一個虛擬IP,每一個Service在正常情況下都會長時間不會改變,這個相對於pod的不定IP,對於集羣中APP的使用相對是穩定的。

但是Service的信息注入到pod目前使用的是環境變量的方式,並且十分依賴於pod(rc)和service的創建順序,這使得這個集羣看起來又不那麼完美,於是kubernetes以插件的方式引入了DNS系統,利用DNS對Service進行一個映射,這樣我們在APP中直接使用域名進行引用,避免了之前的變量氾濫問題,也避免了創建順序的尷尬局面。

組件:
  •SkyDNS 提供DNS解析服務
  •Etcd 存儲DNS信息
  •Kube2sky 監聽kubernetes,當有Service創建時,生成相應的記錄到SkyDNS

1.下載創建dns的鏡像(node節點下載)
docker pull docker.gaoxiaobang.com/kubernetes/etcd-amd64:2.2.1
docker pull docker.gaoxiaobang.com/kubernetes/kube2sky:1.14
docker pull docker.gaoxiaobang.com/kubernetes/skydns:2015-10-13-8c72f8c
docker pull docker.gaoxiaobang.com/kubernetes/exechealthz:1.0
2.創建命名空間
根據namespace分爲不同的名稱空間,將系統服務統一放到一個單獨的空間:kube-system,由於默認空間只有default,我們首先要創建kube-system空間。
vim kube-system.yaml,內容如下:
apiVersion: v1
kind: Namespace
metadata:
name: kube-system

3.在master服務器上編輯ReplicationController文件
vim skydns-rc.yaml,內容如下,記得修改紅色字體部分:
apiVersion: v1
kind: ReplicationController
metadata:
name: kube-dns-v11
namespace: kube-system
labels:
k8s-app: kube-dns
version: v11
kubernetes.io/cluster-service: "true"
spec:
replicas: 1
selector:
k8s-app: kube-dns
version: v11
template:
metadata:
labels:
k8s-app: kube-dns
version: v11
kubernetes.io/cluster-service: "true"
spec:
containers:

  • name: etcd
    image: docker.gaoxiaobang.com/kubernetes/etcd-amd64:2.2.1
    resources:
    limits:
    cpu: 100m
    memory: 500Mi
    requests:
    cpu: 100m
    memory: 50Mi
    command:

  • name: kube2sky
    image: docker.gaoxiaobang.com/kubernetes/kube2sky:1.14
    args:

    • --domain=cluster.local

    • --kube-master-url=http://192.168.1.10:8080
      resources:
      limits:
      cpu: 100m
      memory: 200Mi
      requests:
      cpu: 100m
      memory: 50Mi

  • name: skydns
    image: docker.gaoxiaobang.com/kubernetes/skydns:2015-10-13-8c72f8c
    resources:
    limits:
    cpu: 100m
    memory: 200Mi
    requests:
    cpu: 100m
    memory: 50Mi
    args:

    • -machines=http://127.0.0.1:4001

    • -addr=0.0.0.0:53

    • -ns-rotate=false

    • -domain=cluster.local.
      ports:

    • containerPort: 53
      name: dns
      protocol: UDP

    • containerPort: 53
      name: dns-tcp
      protocol: TCP
      livenessProbe:
      httpGet:
      path: /healthz
      port: 8080
      scheme: HTTP
      initialDelaySeconds: 60
      timeoutSeconds: 5
      successThreshold: 1
      failureThreshold: 5
      readinessProbe:
      httpGet:
      path: /readiness
      port: 8080
      scheme: HTTP
      initialDelaySeconds: 30
      timeoutSeconds: 5

  • name: healthz
    image: docker.gaoxiaobang.com/kubernetes/exechealthz:1.0
    resources:
    limits:
    cpu: 10m
    memory: 20Mi
    requests:
    cpu: 10m
    memory: 20Mi
    args:

    • -cmd=nslookup kubernetes.default.svc.cluster.local localhost >/dev/null

    • -port=8080
      ports:

    • containerPort: 8080
      protocol: TCP
      volumes:

  • name: etcd-storage
    emptyDir: {}
    dnsPolicy: Default

4.在master上創建skydns服務文件skydns-service.yaml
在創建skydns-service.yaml之前,需要手動爲dns指定一個cluster-ip
你需要查看你的/etc/kubernetes/apiserver文件和kubernetes的cluster-ip:
[root@k8s-master dns]# cat /etc/kubernetes/apiserver | grep KUBE_SERVICE_ADDRESSES
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=172.25.0.0/24"
[root@k8s-master dns]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.25.0.1 <none> 443/TCP 19d
如果這兩個ip地址屬於同一網段,則從172.25.0.0中挑選一個IP充當dns的cluster-ip;
如果不一樣,以kubernetes的cluster-ip爲準,修改apiserver的網絡地址範圍,重啓apiserver,然後從172.25.0.0中挑選一個IP作爲dns的cluster-ip

創建skydns-service.yaml文件,注意修改紅色部分,這裏我選的dns-clusterip是172.25.0.254
vim skydns-service.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: 172.25.0.254
ports:

  • name: dns
    port: 53
    protocol: UDP

  • name: dns-tcp
    port: 53
    protocol: TCP

5.在集羣中創建cluster-dns解析應用
•創建Namespace
kubectl create -f kube-system.yaml

•創建ReplicationController
kubectl create -f skydns-rc.yaml

•創建Service
kubectl create -f skydns-service.yaml

刪除就是將上面三個命令中的“create”換成“delete”
6.查看dns-pod的啓動狀態
[root@ k8s-master dns]# kubectl get pod --namespace=kube-system
NAME READY STATUS RESTARTS AGE
kube-dns-v11-ey14j 4/4 Running 8 1d
7.查看skydns-service.yaml文件中定義的Service的信息。
[root@ k8s-master dns]# kubectl get svc --namespace=kube-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns 172.25.0.254 <none> 53/UDP,53/TCP 1d

8.測試DNS功能
(1) 獲取busybox鏡像
docker pull busybox:latest
(2) 編輯busybox的pod的yaml文件
vim busybox.yaml,內容如下:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:

  • image: busybox:latest
    command:

    • sleep

    • "3600"
      imagePullPolicy: IfNotPresent
      name: busybox
      restartPolicy: Always

(3) 創建busybox的pod:
kubectl create -f busybox.yaml
pod啓動狀態:
[root@k8s-master dns]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 2 2h

(4) 使用busybox自帶的nslookup測試dns
kubernetets集羣搭建完畢之後都會有一個默認的cluster-ip,可通過命令查看:
[root@k8s-master dns]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.25.0.1 <none> 443/TCP 19d

開始測試,解析時間可能有點小長,耐心等待:
[root@k8s-master dns]# kubectl exec busybox nslookup kubernetes.default
Server: 172.25.0.254
Address 1: 172.25.0.254

Name: kubernetes.default
Address 1: 172.25.0.1

解析成功,注意,上面的kubernetes.default參數,kubernetes爲service的name,default爲k8s的默認命名空間,如果你查詢的不是default名稱空間裏的域名,則更改default,例如下面這個例子:
[root@k8s-master dns]# kubectl get service -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 172.25.0.254 <none> 53/UDP,53/TCP 2h
如果你想解析“kube-dns”這個域名對應的IP,需要這樣寫:
[root@k8s-master dns]# kubectl exec busybox nslookup kube-dns.kube-system
Server: 172.25.0.254
Address 1: 172.25.0.254

Name: kube-dns.kube-system
Address 1: 172.25.0.254

至此,kubernetes的DNS搭建成功

..

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章