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 + etcdkv store 가 아 닌 데 이 터 를 자신의 메모리 에 저장 합 니 다.dnsmasq  DNS 캐 시 를 설정 할 수 있 기 때문에 해석 속 도 를 높이 기 위해 도입 되 었 습 니 다.
    이런 배치 방식 의 전체 프로필 은 여기에 붙 이지 않 습 니 다.제 가 넣 었 습 니 다. github gist 위 에 관심 이 있 으 면 볼 수 있 습 니 다.만 드 는 방법 도 마찬가지 고요.  kubectl create -f ./skydns-rc.yml
    DNS 가용성 테스트
    그런 배치 가 어떻든 간 에 kubernetes 가 대외 적 으로 제공 하 는 DNS 서 비 스 는 일치한다.모든 서비스 에는 해당 하 는 DNS 기록 이 있 습 니 다.kubernetes 는 DNS 기록 을 저장 하 는 형식 은 다음 과 같 습 니 다.
    ..svc.  
    

    각 부분의 필드 의미:
  • service_name:서비스 이름,서 비 스 를 정의 할 때 지은 이름
  • namespace:service 가 있 는 namespace 의 이름
  • domain:기본 도 메 인 이름 접미사 와 같은 도 메 인 이름 접미사 제공  cluster.local

  • pod 에서 통과 할 수 있어 요.  service_name.namespace.svc.domain  모든 서비스 에 접근 할 수도 있 고 줄 임 말 을 사용 할 수도 있 습 니 다.  service_name.namespacepod 와 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
    

    이 세 용기 의 작용 은 다음 과 같다.
  • etcd:모든 DNS 데이터 저장
  • kube2sky:kubernetes API 감청 서비스의 변 화 를 통 해 etcd
  • 로 동기 화
  • skyDNS:etcd 의 데이터 에 따라 대외 적 으로 DNS 조회 서 비 스 를 제공 합 니 다
  • kubeDNS 모드
    이런 모드 에서kubeDNS 용 기 는 원래 의 세 용기 의 기능 을 대체 합 니 다.apiserver 를 감청 하고 모든 service 와 endpoints 의 결 과 를 메모리 에 적당 한 데이터 구조 로 저장 하 며 DNS 조회 서 비 스 를 대외 적 으로 제공 합 니 다.
  • kubeDNS:원래 kube2sky+etcd+skyDNS 기능 을 제공 하여 DNS 조회 서 비 스 를 단독으로 대외 적 으로 제공 할 수 있 습 니 다
  • dnsmasq:경량급 DNS 서비스 소프트웨어 로 DNS 캐 시 기능 을 제공 할 수 있 습 니 다.kubeDNS 모드 에서 dnsmasq 는 메모리 에 크기(기본 값 은 1G)를 미리 남 겨 두 고 현재 가장 많이 사용 되 는 DNS 조회 기록 을 저장 합 니 다.캐 시 에서 찾 을 기록 이 없 으 면 kubeDNS 에서 조회 하고 결 과 를 캐 시 합 니 다
  • .
    모든 모드 에서 추가 로 실행 할 수 있 습 니 다.  exec-healthz  용기 가 대외 적 으로 helh check 기능 을 제공 하여 현재 DNS 서비스 가 정상 임 을 증명 합 니 다.
  • exec-helhz:어떤 명령 을 실행 하고 결과 에 따라 대외 적 으로 제공 합 니 다.  /healthz  결과
  • 총결산
    다음 과 같은 장점 이 있 기 때문에 kubeDNS 모드 로 배치 하 는 것 을 추천 합 니 다.
  • 추가 저장 이 필요 없 이 추가 유지 와 데이터 저장 작업 을 줄 였 다
  • 더 좋 은 성능.dnsmasq 캐 시 와 DNS 기록 을 메모리 에 직접 저장 함으로써 DNS 해석 속 도 를 높 인 다
  • 참고 자료
  • Deploy the DNS Add-on
  • Kubernetes Admin Docs: Using DNS Pods and Services
  • Deploying a Service on a Kubernetes Cluster
  • kubernetes 기술 분석의 DNS
  • Kubernetes DNS 배치
  • Kubernetes DNS Service Deep Dive - Part 1
  • Kubernetes DNS 서비스 기술 연구
  • Kubernetes(K8S)의 서비스 발견 과 kube-dns 플러그 인
  • 좋은 웹페이지 즐겨찾기