天天看點

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,内容如下,記得修改紅色字型部分:

kind: ReplicationController

name: kube-dns-v11

namespace: kube-system

labels:

k8s-app: kube-dns

version: v11

kubernetes.io/cluster-service: "true"

spec:

replicas: 1

selector:

template:

containers:

name: etcd

image: docker.gaoxiaobang.com/kubernetes/etcd-amd64:2.2.1

resources:

limits:

cpu: 100m

memory: 500Mi

requests:

memory: 50Mi

command:

/usr/local/bin/etcd

-data-dir

/var/etcd/data

-listen-client-urls

http://127.0.0.1:2379,http://127.0.0.1:4001

-advertise-client-urls

-initial-cluster-token

skydns-etcd

name: kube2sky

image: docker.gaoxiaobang.com/kubernetes/kube2sky:1.14

args:

--domain=cluster.local

--kube-master-url=http://192.168.1.10:8080

memory: 200Mi

name: skydns

image: docker.gaoxiaobang.com/kubernetes/skydns:2015-10-13-8c72f8c

-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

name: dns-tcp

protocol: TCP

livenessProbe:

httpGet:

path: /healthz

port: 8080

scheme: HTTP

initialDelaySeconds: 60

timeoutSeconds: 5

successThreshold: 1

failureThreshold: 5

readinessProbe:

path: /readiness

initialDelaySeconds: 30

name: healthz

image: docker.gaoxiaobang.com/kubernetes/exechealthz:1.0

cpu: 10m

memory: 20Mi

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

-port=8080

containerPort: 8080

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,内容如下:

kind: Service

name: kube-dns

kubernetes.io/name: "KubeDNS"

clusterIP: 172.25.0.254

port: 53

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,内容如下:

kind: Pod

name: busybox

namespace: default

image: busybox:latest

sleep

"3600"

imagePullPolicy: IfNotPresent

restartPolicy: Always

(3) 建立busybox的pod:

kubectl create -f busybox.yaml

pod啟動狀态:

[root@k8s-master dns]# kubectl get pods

busybox 1/1 Running 2 2h

(4) 使用busybox自帶的nslookup測試dns

kubernetets叢集搭建完畢之後都會有一個預設的cluster-ip,可通過指令檢視:

[root@k8s-master dns]# kubectl get services

開始測試,解析時間可能有點小長,耐心等待:

[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

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

Name: kube-dns.kube-system

至此,kubernetes的DNS搭建成功

..

繼續閱讀