部署kubernetes dns 服務(wù)
k8s中的service分配的虛擬IP是固定的泡挺,而pod異常后新生成的pod ip會發(fā)生變化命浴,可以通過service做代理關(guān)聯(lián)到后端的pod生闲。
通過設(shè)置k8s中的dns服務(wù)可以直接解析service的名字,得到對應(yīng)service的ip悬蔽,可以實(shí)現(xiàn)服務(wù)在集群內(nèi)部互相訪問捉兴。
本文檔操作前提:
1.建立私有倉庫倍啥,將etcd禾乘、skydns 和kube2sky 鏡像上傳到私有倉庫
2.k8s中的網(wǎng)絡(luò)已經(jīng)打通
修改每個node上的kubelet配置文件
–cluster_dns=10.254.0.3 為DNS服務(wù)的ClusterIP地址
–cluster_domain=cluster.local 為DNS服務(wù)中設(shè)置的域名
$ vi /etc/kubernetes/kubelet KUBELET_ARGS="--cluster_dns=10.254.0.3 --cluster_domain=cluster.local "
重啟kubelet
創(chuàng)建dns rc和service
#######定義yaml文件
1.skydns-rc.yaml
分別定義了三個容器:etcd、kube2sky虽缕、skydns
一個pod中包含三個容器始藕。
可以通過kubectl describe pod pod-name --namespace=ns-name 查看詳細(xì)pod的詳細(xì)信息
apiVersion: v1
kind: ReplicationController
metadata:
name: kube-dns-v9
namespace: kube-system
labels:
k8s-app: kube-dns
version: v9
kubernetes.io/cluster-service: "true"
spec:
replicas: 1
selector:
k8s-app: kube-dns
version: v9
template:
metadata:
labels:
k8s-app: kube-dns
version: v9
kubernetes.io/cluster-service: "true"
spec:
containers:
- name: etcd
image: test-registry:5000/etcd
resources:
limits:
cpu: 100m
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
- http://127.0.0.1:2379,http://127.0.0.1:4001
- -initial-cluster-token
- skydns-etcd
volumeMounts:
- name: etcd-storage
mountPath: /var/etcd/data
- name: kube2sky
image: test-registry:5000/kube2sky
resources:
limits:
cpu: 100m
memory: 50Mi
args:
- -domain=cluster.local #設(shè)置k8s集群中Service所屬的域名
- -kube_master_url=http://192.168.30.60:8080 #k8s中master的ip地址和apiserver中配置的端口號
- name: skydns
image: test-registry:5000/skydns
resources:
limits:
cpu: 100m
memory: 50Mi
args:
- -machines=http://localhost:4001
- -addr=0.0.0.0:53
- -domain=cluster.local
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
volumes:
- name: etcd-storage
emptyDir: {}
2.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.0.3 #/etc/kubernetes/kubelet中已經(jīng)設(shè)定好clusterIP
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
創(chuàng)建rc和service
kubectl create -f skydns-rc.yaml,skydns-svc.yaml
檢查服務(wù)
kubectl get svc --all-namespaces kubectl get rc --all-namespaces kubectl get pods --all-namespaces
排錯
pod啟動失敗
1.檢查鏡像是否可以docker pull
2.檢查鏡像是否正常,docker run -it imageID sh
3.檢查私有倉庫
curl http://test-registry:5000/v2/_catalog
查看私有倉庫里面的鏡像
4.刪除rc,檢查kubelet 中的配置伍派,然后重新啟動
5.查看pod中的某個容器日志
kubectl logs pod-name -c container-name --all-namespaces
kubectl logs pod-name -c container-name --namespace=name
.......
.......
驗(yàn)證服務(wù)
1.創(chuàng)建一個名為redis-master的Service
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
selector:
name: redis-master
ports:
- port: 6379
targetPort: 6379
kubectl create -f redis-service.yaml
創(chuàng)建服務(wù)
2.創(chuàng)建一個帶有nslookup工具的pod
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: docker.io/busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
使用kubectl create -f busybox.yaml
創(chuàng)建
3.進(jìn)入busybox中解析服務(wù)
[root@k8s-master conf]# kubectl exec -it busybox sh
/ # nslookup redis-master
Server: 10.254.0.3
Address 1: 10.254.0.3
Name: redis-master
Address 1: 10.254.222.213
k8s dns原理
(1)etcd:DNS的存儲
(2)kube2sky:將k8s master中的Service(服務(wù))注冊到etcd中
(3)skyDNS:提供DNS域名解析服務(wù)
1.在kube2sky容器中需要指定訪問k8s master的地址弟塞,獲取k8s集群中的服務(wù)。
2.kube2sky容器和skydns容器的啟動參數(shù)-domain拙已,設(shè)置Kubernetes集群中Service所屬的域名,本例中為cluster.local倍踪。啟動后系宫,kube2sky會監(jiān)聽Kubernetes,當(dāng)有新的Service創(chuàng)建時(shí)建车,就會使用kubelet配置的-cluster_dns=10.254.0.3 --cluster_domain=cluster.local
,在創(chuàng)建的資源中指定使用對應(yīng)的dns服務(wù)器扩借,并且生成相應(yīng)的記錄并保存到etcd中。kube2sky為每個Service生成兩條記錄缤至,例如:
redis-master.default.cluster.local
redis-master.default.svc.cluster.local
3.skydns從etcd中獲取dns的數(shù)據(jù)潮罪,然后解析服務(wù)。
4.etcd的數(shù)據(jù)來自kube2sky容器领斥,kube2sky通過監(jiān)聽k8s master 中API獲取集群所有Service的信息嫉到。然后將Service的信息保存到etcd容器中,提供給skydns使用
資料參考:權(quán)威指南第二版P153