Kubernetes-kube-dns 와 서비스 발견
10911 단어 Kubernetes
kubernetes 는 서비스 개념 을 제공 하여 VIP 를 통 해 pod 가 제공 하 는 서 비 스 를 방문 할 수 있 습 니 다.그러나 사용 할 때 또 하나의 문제 가 있 습 니 다.어떤 응용 프로그램의 VIP 를 어떻게 압 니까?예 를 들 어 저 희 는 두 개의 응용 프로그램 이 있 습 니 다.하 나 는 app 이 고 하 나 는 db 입 니 다.모든 응용 프로그램 은 rc 를 사용 하여 관 리 를 하고 service 를 통 해 포트 를 노출 하여 서 비 스 를 제공 합 니 다.app 는 db 응용 프로그램 에 연결 해 야 합 니 다.우 리 는 db 응용 프로그램의 이름 만 알 고 있 지만 VIP 주 소 는 모 릅 니 다.
가장 쉬 운 방법 은 kubernetes 에서 제공 하 는 API 조회 입 니 다.그러나 이것 은 나 쁜 방법 입 니 다.먼저 모든 응용 프로그램 이 시작 할 때 서비스 에 의존 하 는 논 리 를 작성 해 야 합 니 다.이것 자체 가 중복 되 고 응용 복잡 도 를 증가 하 는 것 입 니 다.그 다음으로 응용 은 kubernetes 에 의존 해 야 하기 때문에 단독으로 배치 하고 실행 할 수 없습니다.(물론 설정 옵션 을 추가 하면 할 수 있 지만 책임 도 증가 합 니 다.)
처음에 kubernetes 는 docker 가 사용 한 방법 인 환경 변 수 를 사용 했다.모든 pod 가 시 작 될 때 환경 변 수 를 통 해 모든 서비스의 IP 와 port 정 보 를 설정 합 니 다.그러면 pod 의 응용 은 환경 변 수 를 읽 어서 서비스 에 의존 하 는 주소 정 보 를 얻 을 수 있 습 니 다.이러한 방식 의 서비스 와 환경 변수의 일치 관 계 는 일정한 규범 이 있 고 사용 하기에 도 상대 적 으로 간단 하지만 큰 문제 가 있다.의존 하 는 서 비 스 는 pod 가 시작 되 기 전에 존재 해 야 한다.그렇지 않 으 면 환경 변수 에 나타 나 지 않 을 것 이다.
더 이상 적 인 방안 은 서비스 이름 을 직접 사용 할 수 있 고 실제 ip 주소 에 관심 을 가 질 필요 가 없 으 며 중간 전환 이 자동 으로 이 루어 질 수 있다 는 것 이다.이름과 ip 간 의 전환 은 DNS 시스템 의 기능 이기 때문에 kubernetes 도 DNS 방법 을 제공 하여 이 문 제 를 해결 했다.
DNS 서비스 배포
DNS 서 비 스 는 독립 된 시스템 서비스 가 아니 라 일종 의 것 이다. addon ,플러그 인 으로 설 치 된 것 은 kubernetes 집단 에 필요 한 것 이 아 닙 니 다.(단,설 치 를 매우 추천 합 니 다.)클 러 스 터 에서 실행 되 는 응용 으로 볼 수 있 지만 이 응용 은 비교적 특수 할 뿐이다.
DNS 는 두 가지 설정 방식 이 있 습 니 다.1.3 전에 etcd+kube2sky+skydns 방식 을 사용 하고 1.3 이후 에는 kubedns+dnsmasq 방식 을 사용 할 수 있 습 니 다.
kubelet 시작 매개 변수 수정
어떤 방식 으로 작 동 하 든 대외 적 효 과 는 같다.DNS 기능 을 사용 하려 면 수정 이 필요 하 다.
kubelet
의 시작 설정 항목 은 kbelet 에 게 시작 하 는 pod 에 대응 하 는 DNS 정 보 를 설정 하 는 데 모두 두 개의 매개 변수 가 있 습 니 다.--cluster_dns=10.10.10.10 --cluster_domain=cluster.local
각각 DNS 가 클 러 스 터 에 있 는 vip 와 도 메 인 이름 접 두 사 는 DNS rc 와 일치 해 야 합 니 다.skydns
다음은 이러한 방식 의 배치 프로필 입 니 다.
apiVersion: v1
kind: ReplicationController
metadata:
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
name: kube-dns
namespace: kube-system
spec:
replicas: 1
selector:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
spec:
containers:
- name: etcd
command:
- /usr/local/bin/etcd
- "-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
image: "gcr.io/google_containers/etcd:2.0.9"
resources:
limits:
cpu: 100m
memory: 50Mi
- name: kube2sky
args:
- "-domain=cluster.local"
- "-kube_master_url=http://10.7.114.81:8080"
image: "gcr.io/google_containers/kube2sky:1.11"
resources:
limits:
cpu: 100m
memory: 50Mi
- name: skydns
args:
- "-machines=http://localhost:4001"
- "-addr=0.0.0.0:53"
- "-domain=cluster.local"
image: "gcr.io/google_containers/skydns:2015-03-11-001"
livenessProbe:
exec:
command:
- /bin/sh
- "-c"
- "nslookup kubernetes.default.svc.cluster.local localhost >/dev/null"
initialDelaySeconds: 30
timeoutSeconds: 5
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
resources:
limits:
cpu: 100m
memory: 50Mi
dnsPolicy: Default
실제 상황 에 따라 설정 해 야 할 두 가지 가 있 습 니 다.
kube_master_url
:kube2sky 는 kubernetes master API 를 사용 합 니 다.서비스 정 보 를 읽 습 니 다domain
:도 메 인 이름 접미사,기본 값 은 cluster.local
,당신 은 실제 수요 에 따라 어떠한 합 법 적 인 값그리고 Service 프로필:
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.10.10.10
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
여기 서 주의해 야 할 것 은
clusterIP: 10.10.10.10
이 줄 은 DNS 서비스의 IP 주 소 를 수 동 으로 지정 합 니 다.이 주 소 는 미리 남 겨 진 vip 네트워크 에 있어 야 합 니 다.수 동 으로 지정 한 이 유 는 이 ip 을 고정 시 키 기 위해 서 입 니 다.이렇게 kubelet 을 시작 할 때 설정 합 니 다. --cluster_dns=10.10.10.10
DNS 의 VIP 주 소 를 동적 으로 가 져 올 필요 가 없습니다.이 두 개의 파일 이 있 으 면 대상 을 직접 만 들 면 됩 니 다.
$ kubectl create -f ./skydns-rc.yml
$ kubectl create -f ./skydns-svc.yml
[root@localhost ~]# kubectl get svc,rc,pod --namespace=kube-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/kube-dns 10.10.10.10 53/UDP 1d
NAME DESIRED CURRENT READY AGE
rc/kube-dns 1 1 1 41m
NAME READY STATUS RESTARTS AGE
po/kube-dns-twl0q 3/3 Running 0 41m
kubeDNS
kubernetes 1.3 버 전 이후 kubernetes 는 DNS 의 배치 방식 을 바 꾸 어
kubeDNS + dnsmasq
없어 요. etcd
。이런 모드 에서 kubeDNS 는 원래 kube2sky + skyDNS + etcd
kv store 가 아 닌 데 이 터 를 자신의 메모리 에 저장 합 니 다.dnsmasq
DNS 캐 시 를 설정 할 수 있 기 때문에 해석 속 도 를 높이 기 위해 도입 되 었 습 니 다.이런 배치 방식 의 전체 프로필 은 여기에 붙 이지 않 습 니 다.제 가 넣 었 습 니 다. github gist 위 에 관심 이 있 으 면 볼 수 있 습 니 다.만 드 는 방법 도 마찬가지 고요.
kubectl create -f ./skydns-rc.yml
DNS 가용성 테스트
그런 배치 가 어떻든 간 에 kubernetes 가 대외 적 으로 제공 하 는 DNS 서 비 스 는 일치한다.모든 서비스 에는 해당 하 는 DNS 기록 이 있 습 니 다.kubernetes 는 DNS 기록 을 저장 하 는 형식 은 다음 과 같 습 니 다.
..svc.
각 부분의 필드 의미:
cluster.local
pod 에서 통과 할 수 있어 요.
service_name.namespace.svc.domain
모든 서비스 에 접근 할 수도 있 고 줄 임 말 을 사용 할 수도 있 습 니 다. service_name.namespace
pod 와 service 가 같은 namespace 에 있 으 면 직접 사용 할 수 있 습 니 다. service_name
。 NOTE:정상 적 인 service 도 메 인 이름 은 service vip 로 해석 되 며,headless service 도 메 인 이름 은 뒤의 pods ip 로 직접 분 석 됩 니 다.
자주 사용 되 지 는 않 지만 pod 에 도 해당 하 는 DNS 기록 이 있 습 니 다.형식 은?
pod-ip-address..pod.
,그 중 pod-ip-address
pod ip 주소 사용 -
pod ip 주소 1.2.3.4
,그럼 대응 하 는 도 메 인 이름 은 1-2-3-4.default.pod.cluster.local
。 하나 실행 할 게 요.
busybox
DNS 서비스 가 정상적으로 작 동 할 수 있 는 지 검증 합 니 다./ # nslookup whoami
Server: 10.10.10.10
Address 1: 10.10.10.10
Name: whoami
Address 1: 10.10.10.175
/ # nslookup kubernetes
Server: 10.10.10.10
Address 1: 10.10.10.10
Name: kubernetes
Address 1: 10.10.10.1
/ # nslookup whoami.default.svc
Server: 10.10.10.10
Address 1: 10.10.10.10
Name: whoami.default.svc
Address 1: 10.10.10.175
/ # nslookup whoami.default.svc.transwarp.local
Server: 10.10.10.10
Address 1: 10.10.10.10
Name: whoami.default.svc.transwarp.local
Address 1: 10.10.10.175
우리 가 기본 namespace 에 있다 면
default
이름 whoami
다음 의 모든 도 메 인 이름 을 정확하게 해석 할 수 있 는 서비스 입 니 다.whoami
whoami.default.svc
whoami.default.svc.cluster.local
모든 pod 의 DNS 설정 파일 은 다음 과 같 습 니 다.DNS vip 주소 와 검색 한 domain 목록 을 볼 수 있 습 니 다.
/ # cat /etc/resolv.conf
search default.pod.cluster.local default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.10.10.10
options ndots:5
options ndots:5
kubernetes DNS 원리 분석
우 리 는 앞에서 두 가지 서로 다른 DNS 배치 방식 을 소개 하 였 는데,이 부분 은 그들의 내부 원 리 를 이야기 하 였 다.
kube2sky 모드
이 모드 에서 주로 세 개의 용기 가 실행 되 고 있 습 니 다.
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
919cbc006da2 172.16.1.41:5000/google_containers/kube2sky:1.12 "/kube2sky /kube2sky " About an hour ago Up About an hour k8s_kube2sky.80a41edc_kube-dns-twl0q_kube-system_ea1f5f4d-15cf-11e7-bece-080027c09e5b_1bd3fdb4
73dd11cac057 172.16.1.41:5000/jenkins/etcd:live "etcd -data-dir=/var/" About an hour ago Up About an hour k8s_etcd.4040370_kube-dns-twl0q_kube-system_ea1f5f4d-15cf-11e7-bece-080027c09e5b_b0e5a99f
0b10ae639989 172.16.1.41:5000/jenkins/skydns:20150703-113305 "bootstrap.sh" About an hour ago Up About an hour k8s_skydns.73baf3b1_kube-dns-twl0q_kube-system_ea1f5f4d-15cf-11e7-bece-080027c09e5b_2860aa6d
이 세 용기 의 작용 은 다음 과 같다.
이런 모드 에서
kubeDNS
용 기 는 원래 의 세 용기 의 기능 을 대체 합 니 다.apiserver 를 감청 하고 모든 service 와 endpoints 의 결 과 를 메모리 에 적당 한 데이터 구조 로 저장 하 며 DNS 조회 서 비 스 를 대외 적 으로 제공 합 니 다.모든 모드 에서 추가 로 실행 할 수 있 습 니 다.
exec-healthz
용기 가 대외 적 으로 helh check 기능 을 제공 하여 현재 DNS 서비스 가 정상 임 을 증명 합 니 다./healthz
결과다음 과 같은 장점 이 있 기 때문에 kubeDNS 모드 로 배치 하 는 것 을 추천 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kubernetes 배포 master 서비스1. 서버 초기화 1 방화벽 닫기 [모든 마스터 실행] 2 selinux 닫기 [모든 마스터 실행] 3 호스트 이름 구성 [모든 마스터 실행] hostnamectl set-hostname 호스트 이름 4 구성 이름 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.