Network Trouble Shooting

Yu Sang Min·2025년 9월 18일

CKA

목록 보기
110/110
post-thumbnail

Kubernetes의 네트워크 플러그인

여러 플러그인이 사용 가능하며 다음과 같은 것들이 있습니다.

1. Weave Net:

설치하려면:

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

네트워크 플러그인에 대한 자세한 내용은 다음 문서에서 확인할 수 있습니다:
https://kubernetes.io/docs/concepts/cluster-administration/addons/#networking-and-network-policy

2. Flannel:

설치하려면:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

참고: 현재 Flannel은 Kubernetes 네트워크 정책을 지원하지 않습니다.

3. Calico:

설치하려면:

curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O

다음 명령어를 사용하여 매니페스트를 적용합니다:

kubectl apply -f calico.yaml

Calico는 가장 고급 CNI 네트워크 플러그인으로 알려져 있습니다.

CKA 및 CKAD 시험에서는 CNI 플러그인 설치를 요구하지 않습니다. 하지만 요구된다면 설치할 정확한 URL이 제공됩니다.

참고: 디렉토리에 여러 CNI 구성 파일이 있는 경우, kubelet은 사전식 순서로 이름이 가장 앞서는 구성 파일을 사용합니다.


Kubernetes의 DNS

Kubernetes는 CoreDNS를 사용합니다. CoreDNS는 Kubernetes 클러스터 DNS 역할을 할 수 있는 유연하고 확장 가능한 DNS 서버입니다.

메모리와 파드

대규모 Kubernetes 클러스터에서 CoreDNS의 메모리 사용량은 주로 클러스터의 파드와 서비스 수에 영향을 받습니다. 다른 요인으로는 채워진 DNS 응답 캐시의 크기와 CoreDNS 인스턴스당 수신되는 쿼리 비율(QPS)이 있습니다.

CoreDNS를 위한 Kubernetes 리소스는 다음과 같습니다:

  • coredns라는 서비스 계정
  • coredns와 kube-dns라는 클러스터 역할
  • coredns와 kube-dns라는 클러스터 역할 바인딩
  • coredns라는 배포
  • coredns라는 컨피그맵
  • kube-dns라는 서비스

CoreDNS 배포를 분석할 때 Corefile 플러그인이 컨피그맵으로 정의된 중요한 구성을 포함하고 있음을 확인할 수 있습니다.

DNS 해석을 위해 포트 53이 사용됩니다.

kubernetes cluster.local in-addr.arpa ip6.arpa {
   pods insecure
   fallthrough in-addr.arpa ip6.arpa
   ttl 30
}

이것은 cluster.local과 역방향 도메인을 위한 k8s의 백엔드입니다.

proxy . /etc/resolv.conf

클러스터 외부 도메인을 올바른 권한 있는 DNS 서버로 직접 전달합니다.

CoreDNS 관련 문제 해결

  1. CoreDNS 파드가 대기 상태에 있는 경우 먼저 네트워크 플러그인이 설치되어 있는지 확인하세요.

  2. CoreDNS 파드가 CrashLoopBackOff 또는 Error 상태인 경우

    구버전 Docker를 사용하는 SELinux가 실행 중인 노드가 있다면 CoreDNS 파드가 시작되지 않는 상황이 발생할 수 있습니다. 이를 해결하기 위해 다음 옵션 중 하나를 시도할 수 있습니다:

    a) 새 버전의 Docker로 업그레이드

    b) SELinux 비활성화

    c) CoreDNS 배포를 수정하여 allowPrivilegeEscalation을 true로 설정:

    kubectl -n kube-system get deployment coredns -o yaml | \
      sed 's/allowPrivilegeEscalation: false/allowPrivilegeEscalation: true/g' | \
      kubectl apply -f -

    d) CoreDNS가 CrashLoopBackOff 상태가 되는 또 다른 원인은 Kubernetes에 배포된 CoreDNS 파드가 루프를 감지할 때입니다.

    이 문제를 해결하는 여러 방법이 있으며, 그 중 일부는 다음과 같습니다:

  • kubelet 구성 yaml에 다음을 추가: resolvConf: <실제-resolv-conf-파일-경로> 이 플래그는 kubelet에게 파드에 대체 resolv.conf를 전달하도록 지시합니다. systemd-resolved를 사용하는 시스템의 경우 /run/systemd/resolve/resolv.conf가 일반적으로 “실제” resolv.conf의 위치이지만 배포판에 따라 다를 수 있습니다.
  • 호스트 노드에서 로컬 DNS 캐시를 비활성화하고 /etc/resolv.conf를 원래 상태로 복원합니다.
  • 빠른 수정은 Corefile을 편집하여 forward . /etc/resolv.conf를 업스트림 DNS의 IP 주소(예: forward . 8.8.8.8)로 교체하는 것입니다. 하지만 이는 CoreDNS에 대해서만 문제를 해결하고, kubelet은 계속해서 잘못된 resolv.conf를 모든 기본 dnsPolicy 파드에 전달하여 DNS 해석을 할 수 없게 만듭니다.
  1. CoreDNS 파드와 kube-dns 서비스가 정상 작동하는 경우 kube-dns 서비스가 유효한 엔드포인트를 가지고 있는지 확인하세요.

    kubectl -n kube-system get ep kube-dns

    서비스에 엔드포인트가 없다면 서비스를 검사하고 올바른 셀렉터와 포트를 사용하는지 확인하세요.


Kube-Proxy

kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프록시입니다. kube-proxy는 노드에서 네트워크 규칙을 유지합니다. 이러한 네트워크 규칙은 클러스터 내부 또는 외부의 네트워크 세션에서 파드로의 네트워크 통신을 허용합니다.

kubeadm으로 구성된 클러스터에서는 kube-proxy를 데몬셋으로 찾을 수 있습니다.

kubeproxy는 서비스와 각 서비스와 연관된 엔드포인트를 감시하는 역할을 합니다. 클라이언트가 가상 IP를 사용하여 서비스에 연결하려고 할 때 kubeproxy가 실제 파드로 트래픽을 전송하는 역할을 합니다.

kubectl describe ds kube-proxy -n kube-system을 실행하면 kube-proxy 바이너리가 kube-proxy 컨테이너 내에서 다음 명령어로 실행되는 것을 볼 수 있습니다:

Command:
  /usr/local/bin/kube-proxy
  --config=/var/lib/kube-proxy/config.conf
  --hostname-override=$(NODE_NAME)

구성 파일 /var/lib/kube-proxy/config.conf에서 구성을 가져오며 파드가 실행되는 노드 이름으로 호스트명을 재정의할 수 있습니다.

구성 파일에서는 clusterCIDR, kubeproxy 모드, ipvs, iptables, bindaddress, kube-config 등을 정의합니다.

Kube-proxy 관련 문제 해결

  1. kube-system 네임스페이스의 kube-proxy 파드가 실행 중인지 확인하세요.
  2. kube-proxy 로그를 확인하세요.
  3. 컨피그맵이 올바르게 정의되어 있고 kube-proxy 바이너리 실행을 위한 구성 파일이 올바른지 확인하세요.
  4. kube-config가 컨피그맵에 정의되어 있는지 확인하세요.
  5. kube-proxy가 컨테이너 내에서 실행 중인지 확인하세요:
# netstat -plan | grep kube-proxy
tcp        0      0 0.0.0.0:30081           0.0.0.0:*               LISTEN      1/kube-proxy
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      1/kube-proxy
tcp        0      0 172.17.0.12:33706       172.17.0.12:6443        ESTABLISHED 1/kube-proxy
tcp6       0      0 :::10256                :::*                    LISTEN      1/kube-proxy

참고 자료:

서비스 문제 디버깅:
https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/

DNS 문제 해결:
https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/​​​​​​​​​​​​​​​​

profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글