쿠버네티스 CoreDNS 장애 해결: systemd-resolved 충돌

💡 핵심 요약 (Executive Summary)

본 가이드는 nameservers 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

TLDR@1qzxc아직 버전 1.27이 존재합니다…. 많은 것을 시도했습니다. 효과가 있었던 유일한 방법은 제안한 버전으로 되돌리는 것뿐이었습니다. 나중에 참고할 수 있도록 제가 시도한 모든 것이 여기에 있습니다.

_readme/vps-kubernetes.md 에 설명된 단계에 따라 kubernetes를 설치했습니다 . k8s에서 nginx와 certbot을 시작하려고 했습니다. 그러나 kube-proxy를 다시 시작하는 데 지속적인 문제가 있었습니다. 이벤트 로그를 확인해 보았는데 GPT와 StackOverflow의 도움으로 중복된 DNS 항목으로 인해 문제가 발생한다는 사실을 발견했습니다. 이는 드롭릿 초기화 직후에 나타납니다.

요약

  • /etc/resolv.conf
  • 오래된 파일, 모두가 집단 공격을 가함
  • /run/systemd/resolve/resolv.conf
  • 시스템 설정을 잃지 않도록 갱뱅 문제를 방지하는 새 파일 – 런타임에 생성됩니다. 변경사항을 덮어씁니다.
  • sudo nano /etc/netplan/50-cloud-init.yaml' - this generates the one from /run - this has double entries for and

    eth0

eth1\`. 기본적으로 DO 물방울에서 나옵니다.

  • 6개의 DNS 항목을 생성합니다.
  • DNS 우분투는 3개만 지원합니다.
  • 3보다 큰 모든 것은 레거시 프로그램에서 무시됩니다.
  • K8S kube-proxy는 이를 보고 당황합니다.
  • kube-proxy를 강제로 사용했습니다.etc/resolv.conf
  • 문제는 더 이상 존재하지 않지만 kube-proxy 포드는 여전히 계속 죽어갑니다.
  • 자세한 내용을 늘리기 위해 가능한 모든 로그를 파헤쳐 보았습니다. 아무것도 아님
  • 마지막으로 이전 버전으로 롤백을 시도했는데 효과가 있었습니다.

상세 로그

  • 이벤트 검사kubectl get events --all-namespacesNameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: xx.xxx.xx.2 xx.xxx.xx.3 xx.xxx.xx.2

    \-

  • 이벤트 확인 중 여러 포드에서 오류를 발견했습니다.

  • kubelet 플래그 조정K8s coredns 및 플란넬 네임서버 제한이 초과되었습니다. [닫기]

    \- 필요한 경우 –resolv-conf 플래그를 kubelet에 전달하여 대체 resolv.conf 파일을 지정할 수 있습니다.

  • 일부 Linux 배포판(예: Ubuntu)에서는 기본적으로 로컬 DNS 확인자(systemd-resolved)를 사용합니다. Systemd-resolved는 업스트림 서버에서 이름을 확인할 때 치명적인 전달 루프를 일으킬 수 있는 스텁 파일로 /etc/resolv.conf를 이동하고 대체합니다. 이 문제는 kubelet의 –resolv-conf 플래그를 사용하여 올바른 resolv.conf(systemd-resolved의 경우 /run/systemd/resolve/resolv.conf)를 가리키도록 하여 수동으로 해결할 수 있습니다. kubeadm(>= 1.11)은 systemd-resolved를 자동으로 감지하고 이에 따라 kubelet 플래그를 조정합니다. DNS 확인 디버깅

    .

  • 이 페이지를 처음 보는 것은 아닙니다. Minikube가 시작되지 않는 이유를 이해하려고 할 때 비슷한 문제가 발생했습니다. 그 당시에는 기본값에 문제가 있었고 유일한 해결책은 완전한 재설치였습니다. 이번에는 작동하지 않습니다.
  • kubelet 구성 파일

    GPT를 편집합니다. kubelet 구성은 일반적으로 /var/lib/kubelet/config.yaml에 있는 파일에 의해 제어됩니다. DNS 설정을 변경하려면 이 파일을 편집해야 합니다.

txt
sudo nano /var/lib/kubelet/config.yaml
  • 대체 resolv.conf를 지정하려면 kubelet 구성 아래에 다음 줄을 추가하세요.
txt
Copy code
resolvConf: /run/systemd/resolve/resolv.conf
  • 이미 수정된 사항을 검사했습니다

    . 그런 다음 /run/systemd/resolve/resolv.conf를 확인했습니다. 설립하다:

txt
nameserver xx.xxx.xx.2
nameserver xx.xxx.xx.3
nameserver xx.xxx.xx.2
# Too many DNS servers configured, the following entries may be ignored.
nameserver xx.xxx.xx.3
nameserver xx.xxx.xx.2
nameserver xx.xxx.xx.3
search .
txt
nameserver xx.xxx.xx.2
nameserver xx.xxx.xx.3
search .
  • kubelet 다시 시작sudo systemctl restart kubelet

    \-

  • 이벤트 다시 검사 – 새로운 문제kubectl get events --all-namespaces

    \-

  • 시도했지만 작동하는 것 같았지만 새로운 문제가 있습니다.

  • 전체 재시작이 도움이 되지 않음 – 변경 사항이 덮어쓰기됨/run/systemd/resolve/resolv.conf/run/systemd/resolve/resolv.conf

    \- 전체 재시작을 수행했습니다. 을 편집했습니다

. 속임수를 제거했습니다. 모든 것을 다시 설치하기 시작했습니다. 같은 문제입니다. 에 다시 확인했습니다

. 덮어썼습니다.

  • /etc/systemd/resolved.conf도 편집하세요.

    \- GPT: systemd-resolved가 resolv.conf를 적극적으로 관리하는 경우 이러한 변경 사항이 systemd-resolved에 의해 덮어쓰여질 수 있다는 점에 유의하는 것이 중요합니다. 이러한 경우 올바른 DNS 서버를 사용하도록 systemd-resolved를 구성해야 합니다. 여기에는 일반적으로 /etc/systemd/resolved.conf를 편집하고 DNS= 행을 원하는 네임서버로 설정한 다음 systemd-resolved를 다시 시작하는 작업이 포함됩니다.

  • sudo nano /etc/systemd/resolved.conf

txt
DNS=xx.xxx.xx.2 xx.xxx.xx.3
  • sudo systemctl restart systemd-resolved
  • 재시작
  • /run/systemd/resolve/resolv.conf가 여전히 덮어쓰기됨systemd-resolved

    \- K8이 설치되지 않은 경우에도 마찬가지입니다. 다시 시작하면 충분하며

파일을 덮어씁니다.

txt
sudo systemctl restart systemd-resolved
kubectl get events --all-namespaces | grep kube-proxy
kubectl get events --all-namespaces --sort-by='.lastTimestamp'
  • 아이디어, 추가 연구

    \- 매우 잘 알려진 문제인 것 같습니다.

  • 롤백 – 그래도 작동하지만 나중에 알게 됨This problem appears on k8s v1.26 however it was absent on v1.23 kube-proxy 포드가 지속적으로 CrashLoopBackOff

    누군가가 제안함:

  • kubelet config에 플래그 추가my current workaround is to have a /etc/resolv-static.conf and add --resolv-conf=/etc/resolv-static.conf to /var/snap/microk8s/current/args/kubelet but this is really not very satisfying/etc/resolv.conf에서 3개 이상의 DNS 서버로 인해 네임서버 제한이 초과되었습니다.

    – 여기에서 또 다른 플래그:

    . 직접적인 관련이 없습니다. 우리는 microk8을 사용하지 않습니다.

    – dnsmasq를 사용하여 3개의 DNS 제한 늘리기/etc/resolv.conf에서 3개 이상의 DNS 서버로 네임서버 제한이 초과되었습니다.

    – GPT: dnsmasq를 사용하여 네임서버 레코드 늘리기: 3개의 네임서버 레코드 제한에 도달한 경우 노드에 dnsmasq를 설정하면 도움이 될 수 있습니다. 로컬 DNS 캐시 역할을 하며 추가 네임서버를 지정할 수 있습니다. 설정 방법을 간략하게 소개합니다. 여기와 동일:

    – 지금은 이 접근 방식을 사용하고 싶지 않습니다. 매우 복잡하여 실패하기 쉽습니다.

    • 노드에 dnsmasq를 설치합니다.
    • 클러스터 DNS와 필요한 기타 이름 서버를 포함하도록 dnsmasq를 구성합니다.
    • kubelet의 –resolv-conf를 dnsmasq 관리 resolv.conf로 지정하세요.
    • 알려진 문제, 명확하지 않은 수정 사항K8s coredns 및 플란넬 이름 서버 제한이 초과되었습니다.

      –

    • Netplan 중복 DNS 항목sudo nano /etc/netplan/50-cloud-init.yaml

      \- 일부 중복은

. GPT: /etc/netplan에서 찾은 구성 조각은 다시 시작할 때 DNS 설정이 재설정되면서 발생하는 동작에 대한 중요한 단서를 제공합니다. Netplan은 Ubuntu 및 기타 Linux 배포판에서 사용되는 네트워크 구성 추상화 렌더러로, YAML 파일을 통해 네트워킹을 쉽게 구성할 수 있습니다. 시스템이 부팅되면 netplan은 DNS 서버 설정을 포함한 이러한 구성을 시스템의 네트워크 인터페이스에 적용합니다.

  • 중복 문제 이해

    – systemd-resolved를 재부팅하거나 다시 시작한 후 /run/systemd/resolve/resolv.conf에서 DNS 서버가 중복되는 것은 netplan이 네트워크 구성을 처리하고 systemd-resolved와 상호 작용하는 방식 때문일 가능성이 높습니다. eth0 및 eth1 인터페이스 모두 동일한 DNS 서버가 지정되어 있고 이러한 설정이 시스템의 DNS 확인자에 적용되는 경우 중복이 관찰될 수 있습니다.

  • 변경해도 괜찮은지 확실하지 않습니다

    . DO 액적 기본값을 변경하는 것을 좋아하지 않습니다. 나는 다른 방법을 시도해 볼 것이다.

  • K8s가 관심을 갖는 이유 – 3개 항목 이후 자체 DNS가 손실될 수 있기 때문입니다.

    \- GPT: 네임서버 제한 초과에 대한 Kubernetes의 경고는 기본적으로 최대 3개의 네임서버만 고려하는 Linux 커널의 DNS 확인자의 고유한 제한 때문입니다. DNS 확인을 위한 /etc/resolv.conf 파일의 항목입니다. Kubernetes(구체적으로 kubelet)는 포드를 설정할 때 노드의 /etc/resolv.conf 또는 –resolv-conf kubelet 플래그로 지정된 다른 확인자 구성을 기반으로 DNS 설정을 구성합니다. Kubernetes는 클러스터의 내부 DNS 서비스(예: CoreDNS 또는 kube-dns)를 노드의 DNS 구성에 지정된 기존 이름 서버와 병합하려고 시도합니다. 노드의 DNS 구성이 이미 3개의 이름 서버를 지정한 경우 클러스터의 DNS 서비스를 추가하면 이 제한을 초과하여 경고가 표시됩니다.

  • /run/systemd/resolve/resolv.conf 대신 Kube를 //etc/resolv.conf로 지정/etc/resolv.conf/run/systemd/resolve/resolv.conf

    \- GPT:

대신 kubelet의 –resolv-conf 플래그를 지정하는 것이

실행 가능한 접근 방식입니다. 특히 /etc/resolv.conf에 다음이 포함되어 있는 경우에는 더욱 그렇습니다. Kubernetes Pod의 DNS 확인 요구 사항에 더 적합한 DNS 구성입니다. 이 방법은 /etc/resolv.conf가 안정적이고 올바르게 구성되어 있으며 Kubernetes 작업을 방해할 수 있는 바람직하지 않은 자동 업데이트가 적용되지 않는 경우 특히 효과적일 수 있습니다.

  • sudo nano /var/lib/kubelet/config.yaml
  • 변경: resolvConf: /run/systemd/resolve/resolv.confresolvConf: /etc/resolv.conf

    to

    • “현대”를 유지하려면 이 작업을 수행해서는 안 되지만 자동 DNS 변경에 많이 의존하지 않는 한 괜찮을 것입니다.
    • sudo systemctl restart kubelet
    • 드디어 다시 시작
    • 새로운 문제 – 무엇인지 불분명하며 로그에 문제가 표시되지 않음

      \- 이전 문제에서는 이름 서버 제한 초과 오류가 수정되었습니다. 이제 우리는 새로운 것을 갖게 되었습니다.

  • kubectl describe pod kube-proxy-qv47n -n kube-system

    • 여기서는 쓸모가 없습니다. 그냥 죽었다고 표시하면 됩니다.
  • kubectl logs kube-proxy-mg49v --previous -n kube-system
    • 여기도 아무것도 없어요.
  • 다음 항목 중 하나에 항목이 없습니다.
txt
journalctl -u kubelet
journalctl -u docker
journalctl -u containerd
journalctl -p err
  • kube-proxy의 자세한 정보 편집 – 여전히 결과 없음kubectl edit daemonset kube-proxy -n kube-system:wq

    \-

  • 저장 및 종료: 자세한 정보 표시 플래그를 추가한 후 변경 사항을 저장하고 편집기를 종료합니다. Kubernetes는 자동으로 DaemonSet를 업데이트하고 kube-proxy 포드를 다시 시작하여 새 로그 수준을 적용합니다.

  • vim을 작성하고 종료합니다.
txt
containers:
- command:
  - kube-proxy
  - --config=/var/lib/kube-proxy/config.conf
  - -v=8
  • 레벨 8의 상세성에도 불구하고 GPT는 잘못된 것을 찾을 수 없습니다.
  • 이전 버전 1.23.17-00 설치 – 답변입니다sudo apt-get install -y kubelet=1.23.17 kubeadm=1.23.17 kubectl=1.23.17This problem appears on k8s v1.26 however it was absent on v1.23 kube-proxy 포드가 지속적으로 CrashLoopBackOff

    \- 전체 재설치 –

  • 누군가 제안함:

  • [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 24.0.5. Latest validated version: 20.10

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *