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搭建成功
..