클러스터 DNS 제공자 구성

IBM Cloud® Kubernetes Service 클러스터에 있는 각 서비스에는 DNS(Domain Name System) 이름이 지정되는데, 이 이름은 클러스터 DNS 제공자가 DNS 요청을 분석하기 위해 등록하는 이름입니다. 서비스 및 파드에 대한 DNS에 대한 자세한 내용은 ‘ Kubernetes ’ 문서를 참조하십시오.

클러스터 DNS 제공자는 CoreDNS로, 이는 범용 권한 있는 DNS 서버로서 Kubernetes 와의 하위 호환성을 유지하면서도 확장 가능한 통합 기능을 제공합니다. CoreDNS는 단일 실행 파일이며 단일 프로세스이므로 기타 클러스터 DNS 제공자보다 문제를 일으킬 수 있는 종속 항목과 작동 부분이 더 적습니다. 또한 이 프로젝트는 Kubernetes 프로젝트와 동일한 Go(메모리를 보호하는 데 도움을 줌)로 작성되었습니다. 마지막으로, CoreDNS 는 CoreDNS 문서에 소개된 일반적인 설정과 같은 사용자 지정 DNS 항목을 생성할 수 있기 때문에, 다른 클러스터 DNS 제공업체보다 더 유연한 사용 사례를 지원합니다.

CoreDNS 버전 1.34 및 이후 NodeLocal 버전에서의 DNS 캐시 구성 변경 사항
기본 DNS 캐시 시간이 및 NodeLocal DNS CoreDNS 구성 모두에서 30초에서 120초로 증가되었습니다. 이 변경 사항은 DNS 캐싱 설정에 ConfigMap 적용됩니다. 일부 사용자는 짧은 캐시 기간으로 인한 잦은 DNS 조회로 인해 pDNS (또는 UDP ) 트래픽 제한에 도달했습니다. 30초 캐시 간격은 매우 빈번하게 변경되는 DNS 레코드(예: 상태 확인 엔드포인트)를 제외하고는 거의 필요하지 않습니다. 대부분의 워크로드에 대해 120초 기본 캐시는 더 나은 성능을 제공하고 불필요한 DNS 트래픽을 줄입니다. 특정 사용 사례에 대해 더 짧은 캐시 시간이 필요한 사용자는 이 설정을 재정의할 수 있습니다.

클러스터 DNS 제공자 Auto-Scaling

기본적으로 CoreDNS에는 클러스터의 작업자 노드와 코어의 수에 따라 CoreDNS 팟(Pod)을 오토스케일링하는 배치가 포함되어 있습니다. CoreDNS 오토스케일링 기능 ConfigMap을 편집하여 CoreDNS 오토스케일러 매개변수를 세부 조정할 수 있습니다. 예를 들어, 앱이 클러스터 DNS 제공자를 많이 사용하는 경우에는 앱을 지원하기 위해 최소 CoreDNS 팟(Pod) 수를 늘려야 할 수 있습니다. 자세한 내용은 ‘ Kubernetes ’ 문서를 참조하십시오.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. CoreDNS 오토스케일러 배치가 사용 가능한지 확인하십시오. CLI 출력에서 하나의 배치가 AVAILABLE인지 확인하십시오.

    kubectl get deployment -n kube-system coredns-autoscaler
    

    출력 예

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    coredns-autoscaler   1/1     1            1           69d
    
  2. CoreDNS 오토스케일러에 대한 기본 설정을 편집하십시오. data.linear 필드를 찾으십시오. 이 필드의 기본값은 클러스터 크기 (preventSinglePointFailure: true) 에 관계없이 최소 두 개의 CoreDNS 팟 (Pod) 이 있는 16개의 작업자 노드 또는 256개의 코어당 하나의 CoreDNS 팟 (Pod) 입니다. 자세한 정보는 Kubernetes 문서를 참조하십시오.

    kubectl edit configmap -n kube-system coredns-autoscaler
    

    출력 예

    apiVersion: v1
    data:
      linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}'
    kind: ConfigMap
    metadata:
    ...
    

클러스터 DNS 제공자 사용자 정의

CoreDNS configmap을 편집하여 CoreDNS를 사용자 정의할 수 있습니다. 예를 들어, 외부 호스트를 가리키는 서비스를 해석하도록 스텁 도메인 및 업스트림 DNS 서버를 구성할 수 있습니다. 또한, CoreDNS ConfigMap 내에서 여러 개의 Corefile을 구성할 수 있습니다. 자세한 내용은 ‘ Kubernetes ’ 문서를 참조하십시오.

NodeLocal DNS 캐싱은 CoreDNS에 의존하여 DNS 해석의 캐시를 유지합니다. DNS 해석 일관성을 유지하려면 해당되는 NodeLocal DNS 캐시 및 CoreDNS 구성(예: 스텁 도메인)을 동일하게 유지하십시오.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. CoreDNS 배치가 사용 가능한지 확인하십시오. CLI 출력에서 하나의 배치가 AVAILABLE인지 확인하십시오.

    kubectl get deployment -n kube-system coredns
    

    출력 예

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    coredns   3/3     3            3           69d
    
  2. CoreDNS configmap에 대한 기본 설정을 편집하십시오. configmap의 data 섹션에서 Corefile을 사용하여 스텁 도메인 및 업스트림 DNS 서버를 사용자 정의하십시오. 자세한 내용은 ‘ Kubernetes ’ 문서를 참조하십시오.

    CoreDNS proxy 플러그인은 더 이상 사용되지 않으며 forward 플러그인으로 대체됩니다. CoreDNS configmap을 업데이트하는 경우 모든 proxy 인스턴스를 forward로 대체하십시오.

    kubectl edit configmap -n kube-system coredns
    

    CoreDNS 예제 출력

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: coredns
    namespace: kube-system
      data:
        Corefile: |
          import <MyCorefile>
          .:53 {
              errors
              health {
                lameduck 10s
              }
              ready
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                 pods insecure
                 fallthrough in-addr.arpa ip6.arpa
                 ttl 30
              }
              prometheus :9153
              forward . /etc/resolv.conf {
                  max_concurrent 1000
              }
              cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
              }
              loop
              reload
              loadbalance
          }
        <MyCorefile>: |
          abc.com:53 {
            errors
            cache 30
            loop
            forward . 1.2.3.4
            }
    
  3. 선택사항: CoreDNS configmap에 사용자 정의 Corefile을 추가하십시오. 다음 예제에서, data.Corefile 섹션에 import 를 포함하고, data. 섹션을 사용자 정의 Corefile 정보로 채워 넣으십시오. 자세한 내용은 Corefile 가져오기 문서를 참조하십시오.

    CoreDNS proxy 플러그인은 더 이상 사용되지 않으며 forward 플러그인으로 대체됩니다. CoreDNS configmap을 업데이트하는 경우 모든 proxy 인스턴스를 forward로 대체하십시오.

    kubectl edit configmap -n kube-system coredns
    

    사용자 정의 Corefile 예제 출력

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: kube-system
    data:
      Corefile: |
        import <MyCorefile>
        .:53 {
            errors
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
               pods insecure
               upstream 172.16.0.1
               fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . /etc/resolv.conf {
                max_concurrent 1000
            }
            cache 30 {
                disable success cluster.local
                disable denial cluster.local
            }
            loop
            reload
            loadbalance
        }
      <MyCorefile>: |
        abc.com:53 {
          errors
          cache 30
          loop
          forward . 1.2.3.4
        }
    
  4. 몇 분 후에 CoreDNS 팟(Pod)이 configmap 변경사항을 선택합니다.

NodeLocal DNS 캐시 설정

IBM Cloud Kubernetes Service 클러스터에서 클러스터 DNS 성능 및 가용성 향상을 위해 선택한 작업자 노드에서 NodeLocal DNS 캐싱 에이전트를 설정합니다. 자세한 내용은 Kubernetes 문서를 참조하십시오.

기본적으로, ‘ ClusterFirstDNS 정책을 사용하는 파드에 대한 클러스터 DNS 요청은 클러스터 DNS 서비스로 전송됩니다. 작업자 노드에서 NodeLocal DNS 캐싱을 사용하는 경우, 작업자 노드에 있는 이러한 팟(Pod)에 대한 클러스터 DNS 요청이 링크 로컬 IP 주소(169.254.20.10)에서 청취하는 로컬 DNS 캐시로 대신 전송됩니다. 또한 DNS 캐시는 kube-dns 네임스페이스에 있는 kube-system 서비스의 클러스터 IP를 청취합니다.

클러스터에서 구역 인식 DNS를 이미 사용하고 있는 경우 DNS 캐시 레이블을 추가하지 마십시오. 또한 NodeLocal DNS 캐싱은 CoreDNS에 의존하여 DNS 해석의 캐시를 유지합니다. DNS 해석 일관성을 유지하려면 해당되는 NodeLocal DNS 캐시 및 CoreDNS 구성(예: 스텁 도메인)을 동일하게 유지하십시오.

1.34 및 그 이전 버전
NodeLocal DNS 캐시는 옵트인입니다. 작업자 노드에 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 레이블을 추가하여 수동으로 활성화해야 합니다.
1.35 버전 및 이후 버전
NodeLocal DNS 캐시는 모든 워커 노드에서 기본적으로 사용하도록 설정됩니다. 버전 1.35 으로 업그레이드된 클러스터는 사용자가 옵트아웃하지 않는 한 NodeLocal DNS가 자동으로 활성화됩니다. 자동 활성화를 방지하려면 업그레이드하기 전에 작업자 노드에 ibm-cloud.kubernetes.io/node-local-dns-disabled=true 레이블을 적용하세요.

버전 1.35 변경 사항에 대한 자세한 내용은 1.35 버전 정보를 참조하세요.

NodeLocal DNS 캐시 사용

Kubernetes 클러스터에 있는 하나 이상의 작업자 노드에 대해 NodeLocal DNS 캐시를 사용으로 설정합니다.

1.35 버전 및 이후 버전
NodeLocal DNS는 모든 워커 노드에서 기본적으로 사용하도록 설정됩니다. 이전에 NodeLocal DNS를 비활성화했거나 NodeLocal DNS를 비활성화한 상태에서 새 작업자 노드를 추가하는 경우에만 이 단계를 따르세요.
1.34 및 그 이전 버전
NodeLocal DNS는 옵트인입니다. 워커 노드에서 이 기능을 사용 설정하려면 다음 단계를 따르세요.

다음 단계는 특정 작업자 노드에서 실행되는 DNS 팟(Pod)을 업데이트합니다. 향후 노드에서 레이블을 상속하도록 작업자 풀을 레이블 지정할 수도 있습니다.

시작하기 전에, 이 기능의 영향을 받는 모든 DNS 아웃바운드 네트워크 정책 (예: DNS 아웃바운드에 팟 또는 네임스페이스 선택자를 사용하는 정책 등)을 업데이트하십시오.

kubectl get networkpolicy --all-namespaces -o yaml
  1. 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  2. CoreDNS의 스텁 도메인 및 업스트림 DNS 서버를 사용자 정의한 경우, 이러한 스텁 도메인 및 업스트림 DNS 서버에서 NodeLocal DNS 캐시를 사용자 정의해야 합니다.

  3. 클러스터의 노드를 나열하십시오. NodeLocal DNS 캐싱 에이전트 팟(Pod)은 각 노드에서 실행되는 디먼 세트의 일부입니다.

    kubectl get nodes
    
  4. 작업자 노드에 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 레이블을 추가하십시오. 해당 레이블에서 작업자 노드의 DNS 캐싱 에이전트 팟(Pod)을 시작합니다.

    1. 하나 이상의 작업자 노드에 레이블을 추가하십시오.
    2. NODE-LOCAL-DNS-ENABLED 필드가 true로 설정되어 있는지 확인하여 노드에 레이블이 있는지 확인하십시오.
        kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
        ```
        출력 예
    
        ```sh {: screen}
        NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
        10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.35+IKS   true
        ```
    3. DNS 캐싱 에이전트 팟(Pod)이 작업자 노드에서 실행되고 있는지 확인하십시오.
    
    ```sh {: pre}
        kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
        ```
        출력 예
    
        ```sh {: screen}
        NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
        node-local-dns-pvnjn   1/1     Running   0          1m    10.xxx.xx.xxx   10.xxx.xx.xxx  <none>           <none>
        ```
    
  5. 각 작업자 노드에 대해 이전 단계를 반복하여 DNS 캐싱을 사용으로 설정하십시오.

NodeLocal DNS 캐시 사용 안함

하나 이상의 작업자 노드에 대해 NodeLocal DNS 캐시를 사용 안함으로 설정할 수 있습니다.

1.35 버전 및 이후 버전

기본적으로 사용하도록 설정된 NodeLocal DNS를 사용하지 않으려면 ibm-cloud.kubernetes.io/node-local-dns-disabled=true 레이블을 워커 노드에 추가하세요.

kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-disabled=true"
1.34 및 그 이전 버전

NodeLocal DNS를 비활성화하려면 작업자 노드에서 ibm-cloud.kubernetes.io/node-local-dns-enabled 레이블을 제거하세요.

  1. 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  2. 작업자 노드에서 ibm-cloud.kubernetes.io/node-local-dns-enabled 레이블을 제거하십시오. 이 조치는 작업자 노드의 DNS 캐싱 에이전트 팟(Pod)을 종료합니다.

    다음 명령을 실행하여 클러스터의 모든 작업자 노드에서 레이블을 제거하십시오.

    kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    

    다음 명령을 실행하여 개별 작업자 노드에서 레이블을 제거하십시오.

    kubectl label node <node_name> "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    
    1. NODE-LOCAL-DNS-ENABLED 필드가 비어 있는지 확인하여 레이블이 제거되었는지 확인하십시오.
        kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
        ```
        출력 예
    
        ```sh {: screen}
        NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
        10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.35+IKS   
        ```
    2. DNS 캐시가 사용 안함으로 설정된 노드에서 해당 팟(Pod)이 더 이상 실행되지 않는지 확인하십시오. 출력에 팟(Pod)이 표시되지 않습니다.
    
    ```sh {: pre}
        kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
        ```
        출력 예
    
        ```sh {: screen}
        No resources found.
        ```
    
  3. 각 작업자 노드에 대해 이전 단계를 반복하여 DNS 캐싱을 사용 안함으로 설정하십시오.

NodeLocal DNS 캐시 사용자 정의

두 개의 configmap을 편집하여 NodeLocal DNS 캐시를 사용자 정의할 수 있습니다.

  • node-local-dns configmap: NodeLocal DNS 캐시 구성을 사용자 정의합니다.
  • node-local-dns-config configmap: 외부 호스트를 가리키는 서비스를 분석하도록 스텁 도메인 또는 업스트림 DNS 서버를 사용자 정의하여 NodeLocal DNS 캐시 구성을 확장하십시오.

NodeLocal DNS 캐싱은 CoreDNS에 의존하여 DNS 해석의 캐시를 유지합니다. DNS 해석 일관성을 유지하려면 해당되는 NodeLocal DNS 캐시 및 CoreDNS 구성(예: 스텁 도메인)을 동일하게 유지하십시오.

일반 구성 업데이트에 대한 node-local-dns configmap 편집

node-local-dns configmap을 편집하여 NodeLocal DNS 캐시 구성을 사용자 정의합니다.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. NodeLocal DNS 캐시 디먼 세트가 사용 가능한지 확인하십시오.

    kubectl get ds -n kube-system node-local-dns
    

    출력 예

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. 기본 설정을 편집하거나 사용자 정의 Corefile을 NodeLocal DNS 캐시 configmap에 추가하십시오. 가져온 각 Corefile은 coredns 경로를 사용해야 합니다. 자세한 내용은 ‘ Kubernetes ’ 문서를 참조하십시오.

    NodeLocal 의 DNS 캐시에서는 제한된 수의 플러그인 만 지원됩니다.

    kubectl edit configmap -n kube-system node-local-dns
    

    출력 예

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns
      namespace: kube-system
    data:
      Corefile: |
        # Add your NodeLocal DNS customizations as import files under ./coredns directory.
        # Refer to /docs/containers?topic=containers-cluster_dns for details.
        import ./coredns/<MyCorefile>
        cluster.local:53 abc.com:53 {
            errors
            cache {
                    success 9984 30
                    denial 9984 5
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            health 169.254.20.10:8080
            }
        in-addr.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        ip6.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        .:53 {
            errors
            cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__UPSTREAM__SERVERS__ {
                    force_tcp
            }
            prometheus :9253
            }
      <MyCorefile>: |
        # Add custom corefile content ...
    
  3. 몇 분 후에 NodeLocal DNS 캐시 팟(Pod)이 configmap 변경사항을 선택합니다.

node-local-dns-config configmap을 편집하여 스텁 도메인 또는 업스트림 서버로 확장

node-local-dns-config configmap을 편집하여 NodeLocal DNS 캐시 구성을 확장하십시오(예: 스텁 도메인 또는 업스트림 DNS 서버를 사용자 정의하여). 자세한 내용은 ‘ Kubernetes ’ 문서를 참조하십시오.

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  1. NodeLocal DNS 캐시 디먼 세트가 사용 가능한지 확인하십시오.

    kubectl get ds -n kube-system node-local-dns
    

    출력 예

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. NodeLocal DNS 캐시에 configmap이 있는지 확인하십시오.

    1. NodeLocal DNS 캐시 configmap이 있는지 여부를 결정하십시오.
        kubectl get cm -n kube-system node-local-dns-config
        ```
        Configmap이 없는 경우 출력 예
    
        ```sh {: screen}
        Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
        ```
    2. configmap이 없는 경우, `NodeLocal` DNS 캐시 configmap을 작성하십시오.
    
    ```sh {: pre}
        kubectl create cm -n kube-system node-local-dns-config
        ```
        출력 예
    
        ```sh {: screen}
        configmap/node-local-dns-config created
        ```
    
  3. NodeLocal DNS 캐시 configmap을 편집하십시오. configmap은 KubeDNS 구문을 사용하여 스텁 도메인 및 업스트림 DNS 서버를 사용자 정의합니다. 자세한 내용은 ‘ Kubernetes ’ 문서를 참조하십시오.

    kubectl edit cm -n kube-system node-local-dns-config
    

    출력 예

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns-config
      namespace: kube-system
    data:
      stubDomains: |
          {"abc.com" : ["1.2.3.4"]}
    
  4. 몇 분 후에 NodeLocal DNS 캐시 팟(Pod)이 configmap 변경사항을 선택합니다.

구역 인식 DNS 설정

다중 구역 IBM Cloud Kubernetes Service 클러스터에서 클러스터 DNS 성능 및 가용성을 높이기 위해 구역 인식 DNS를 설정합니다. 이 설정을 사용하면 동일한 구역 내의 클러스터 DNS 트래픽을 선호하는 NodeLocal DNS 캐시가 확장됩니다.

기본적으로 클러스터는 클러스터 전체의 DNS 리소스로 설정되고, 구역 인식 DNS 리소스로는 설정되지 않습니다. 구역 인식 DNS를 설정한 후에도 클러스터 전체의 DNS 리소스는 백업 DNS로 계속 실행됩니다. 구역 인식 DNS 리소스는 클러스터 전체의 DNS와 별도로 실행되며, 이에 따라 구역 인식 DNS를 변경해도 클러스터 전체의 DNS에 영향을 주지 않습니다.

클러스터에서 구역 인식 DNS를 사용하고 있는 경우 DNS 캐시 레이블을 사용하지 마십시오.

구역 인식 DNS 설정

다중 구역 클러스터에서 구역 인식 DNS를 설정하려면 다음 단계를 완료하십시오.

  1. 존 인식 DNS의 영향을 받는 모든 DNS 아웃바운드 네트워크 정책 (예: DNS 아웃바운드에 팟 또는 네임스페이스 선택자를 사용하는 정책 등)을 업데이트하십시오. 네트워크 정책 목록을 확인하려면 다음 명령을 실행하십시오.

    kubectl get networkpolicy --all-namespaces -o yaml
    
  2. kube-system 네임스페이스의 coredns ConfigMap 에 ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true 레이블을 지정하십시오.

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true"
    
  3. 클러스터 마스터 새로 고치기 를 수행하여 구역 인식 DNS 자원을 배치하십시오.

    ibmcloud ks cluster master refresh -c CLUSTER_NAME_OR_ID
    
  4. 클러스터 세부사항의 Master Health를 검토하여 새로 고치기 오퍼레이션이 완료되는 것을 지켜보십시오.

    ibmcloud ks cluster get -c CLUSTER_NAME_OR_ID
    
  5. CoreDNS의 스텁 도메인 및 업스트림 DNS 서버를 사용자 정의한 경우, 이러한 스텁 도메인 및 업스트림 DNS 서버에서 NodeLocal DNS 캐시를 사용자 정의해야 합니다.

  6. 클러스터의 구역에 대한 환경 변수를 설정하십시오.

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  7. 모든 구역에서 CoreDNS 및 CoreDNS 오토스케일러 팟(Pod)을 시작하십시오.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1
    done
    
  8. 모든 구역에서 CoreDNS 및 CoreDNS 오토스케일러 팟(Pod)이 실행 중인지 확인하십시오.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" -o wide
        kubectl get pods -n kube-system -l "k8s-app=coredns-${ZONE}" -o wide
    done
    
  9. 모든 작업자 노드에서 NodeLocal DNS 캐시 팟(Pod)을 시작하십시오.

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
    
  10. 모든 작업자 노드에서 NodeLocal DNS 캐시 팟(Pod)이 실행 중인지 확인하십시오.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide
    done
    
  11. 워커 풀에 레이블을 지정하여, 향후 워커 노드가 ‘ ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true ’ 레이블을 상속받도록 하십시오.

구역 인식 DNS 사용 안함 및 삭제

구역 인식 DNS를 제거하려면 먼저 다중 구역 클러스터의 각 구역에서 구역 인식 DNS 리소스를 사용 안함으로 설정해야 합니다. 그런 다음 구역 인식 DNS 리소스를 삭제하십시오.

  1. ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true 레이블을 작업자 풀에서 제거하십시오.

  2. 클러스터의 구역에 대한 환경 변수를 설정하십시오.

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  3. 모든 작업자 노드에서 NodeLocal DNS 캐시 팟(Pod)을 중지하십시오.

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
    
  4. 모든 구역에서 CoreDNS 오토스케일러 팟(Pod)을 중지하십시오.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0
    done
    
  5. 모든 구역에서 CoreDNS 오토스케일러 팟(Pod)이 더 이상 실행 중이 아닌지 확인하십시오.

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}"
    done
    
  6. 모든 구역에서 CoreDNS 팟(Pod)을 중지하십시오.

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0
    done
    
  7. ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true 네임스페이스의 coredns configmap에서 kube-system 레이블을 제거하십시오.

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
    
  8. 클러스터 마스터를 새로 고쳐 구역 인식 DNS 리소스를 삭제하십시오.

    ibmcloud ks cluster master refresh --cluster CLUSTER_NAME_OR_ID
    
  9. 클러스터 세부사항의 Master Health를 검토하여 새로 고치기 오퍼레이션이 완료되는 것을 지켜보십시오.

    ibmcloud ks cluster get -c CLUSTER_NAME_OR_ID