部署kubernetes dns 服務(wù)
k8s中的service分配的虛擬IP是固定的,而pod異常后新生成的pod ip會發(fā)生變化,可以通過service做代理關(guān)聯(lián)到后端的pod。
通過設(shè)置k8s中的dns服務(wù)可以直接解析service的名字,得到對應service的ip,可以實現(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 查看詳細pod的詳細信息
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
.......
.......
驗證服務(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.進入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,當有新的Service創(chuàng)建時,就會使用kubelet配置的-cluster_dns=10.254.0.3 --cluster_domain=cluster.local
,在創(chuàng)建的資源中指定使用對應的dns服務(wù)器,并且生成相應的記錄并保存到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