블로그로 돌아가기

Kubernetes 네트워킹 문제를 해결하고 검사하는 방법

Kubernetes 네트워킹 문제를 해결하고 검사하는 방법

Kubernetes은 오픈소스 도구로서 다음 분야에서 필수적입니다: 컨테이너 오케스트레이션. Kubernetes는 다양한 클라우드 환경이나 온프레미스 서버 전체에서 대규모로 클러스터를 오케스트레이션하고 관리하는 데 도움을 줍니다. 클러스터는 컨테이너화된 애플리케이션과 서비스를 실행하기 위한 호스트 집합입니다. 클러스터가 작동하려면 최소 두 개의 노드가 필요합니다 – 마스터 노드 하나와 워커 노드 하나. 워커 노드를 더 추가하여 Kubernetes 인프라를 확장할 수 있습니다. 인프라가 작동하려면 마스터 노드와 워커 노드가 네트워크를 통해 통신할 수 있어야 합니다. Kubernetes의 가장 중요한 기능에 대한 개요는 다음 튜토리얼을 참조하세요: Kubernetes 알아보기.

이 튜토리얼에서는 다음을 보여드리겠습니다: Kubernetes 네트워킹의 검사 및 문제 해결에 도움이 되는 몇 가지 도구와 기술.

전제 조건

  • 또한 다음이 필요합니다: kubectl이 로컬에 설치되어 있어야 합니다. 로컬 환경에 따라 다음의 공식 문서를 참조하세요: Kubernetes 도구 설치. kubectl이 클러스터에 연결되도록 구성되어야 합니다. 이에 대한 자세한 내용은 아래 섹션에서 설명하겠습니다.

로컬과 Kubernetes 노드 모두에서 여러 명령을 실행할 것입니다. 시작해 보겠습니다!

원격 Kubernetes 클러스터에 연결하도록 로컬 kubectl 구성하기

먼저 다음을 설치해 보겠습니다: kubectl. 저희 로컬 환경은 Ubuntu를 실행 중입니다. 다른 로컬 환경을 사용 중이라면 이 링크를 따르세요. kubectl 도구를 apt 패키지 관리자를 사용하는 Ubuntu/Debian 로컬 환경에 설치하려면, 다음 명령을 실행하여 apt 저장소를 업데이트하고 필요한 패키지를 설치합니다:

다음으로, Google 클라우드 공개 서명 키를 다운로드하려면 다음 명령을 실행합니다:

그런 다음, Kubernetes apt 저장소를 추가합니다:

그 후, apt 인덱스를 업데이트하고 kubectl을 다음 명령으로 설치합니다:

그런 다음, 다음 명령으로 버전을 확인하여 kubectl이 설치되었는지 확인합니다:

로컬에 kubectl을 방금 설치한 경우의 출력 결과입니다:

kubectl version

위의 스크린샷에서 kubectl은 로컬 Kubernetes 클러스터에 연결을 시도하고 있습니다. 하지만 로컬 머신에 아직 실행 중인 Kubernetes 클러스터가 없기 때문에 실패합니다.

원격 Kubernetes 클러스터에 연결하려면 먼저 원격 클러스터에서 Kubernetes 자격 증명을 다운로드해야 합니다. 다음은 마스터 노드에서 자격 증명을 복사하는 명령입니다:

강조 표시된 부분을 귀하의 ssh 사용자 이름과 마스터 노드의 공인 IP로 바꾸십시오. 자격 증명 다운로드가 완료되면 자격 증명을 홈 디렉터리로 복사합니다:

이것으로 끝입니다. 이제 로컬 kubectl이 원격 Kubernetes 클러스터에 연결하여 명령을 내릴 수 있을 것입니다. 로컬 kubectl이 원격 클러스터에 연결되어 있는지 확인하려면 버전 명령을 다시 확인하십시오:

성공적인 연결을 보여주는 출력 결과는 다음과 같습니다:

kubectl version json

선택적으로, 다음을 실행할 수 있습니다. get nodes 명령을 다음과 같이 실행합니다:

kubectl get nodes

파드의 클러스터 IP 가져오기

로컬 머신에서 다음 명령을 실행하여 파드의 클러스터 IP를 가져올 수 있습니다. kubectl get pod 명령을 실행합니다. 파드를 호스팅하는 노드 및 파드의 클러스터 IP와 같은 더 많은 정보를 나열하려면 다음 플래그를 추가합니다. -o wide 를 명령에 추가합니다:

다음은 Kubernetes 클러스터의 출력 결과입니다. 사전 요구 사항 튜토리얼에서 보셨듯이 Nginx 웹 서버 배포를 생성했습니다.

kubectl get pod -o wide

IP 열은 개별 파드의 내부 IP 주소를 보여줍니다. 찾고 있는 파드가 목록에 나타나지 않으면 다른 네임스페이스에 있을 수 있습니다. 다음 명령을 실행하여 모든 네임스페이스의 파드를 나열할 수 있습니다::

서비스의 IP 주소 가져오기

클러스터에 있는 서비스의 IP 주소를 가져올 수도 있습니다. 다음을 추가하면 --all-namespaces 플래그를 추가하면 클러스터에서 실행 중인 모든 서비스를 가져옵니다:

위 명령의 출력 결과는 다음과 같습니다. 서비스 IP는 다음 열에 있습니다. cluster-ip 열:

kubectl get svc

파드 네트워크 네임스페이스 가져오기 및 액세스

각 Kubernetes 파드에는 네트워크 네임스페이스가 할당되어 있습니다. netns라고도 하는 네트워크 네임스페이스는 네트워크 장치 간의 격리를 제공하는 Linux의 기본 네트워킹 라이브러리입니다.

DNS 확인 또는 일반 네트워크 연결을 확인하려면 파드의 네트워크 네임스페이스 내에서 명령을 실행할 수 있습니다. 이를 위해 먼저 파드에 있는 컨테이너 중 하나의 프로세스 ID를 조회합니다. 다음에서 이를 쉽게 수행할 수 있습니다. Docker 전용 명령을 사용합니다. 첫 번째 명령은 노드에서 실행 중인 컨테이너를 나열합니다. 워커 노드 중 하나에 로그인하고 다음 명령을 실행합니다:

docker ps

출력 결과에서 컨테이너 ID 또는 Names 열을 확인해야 합니다. 사전 요구 사항 튜토리얼에서 배포한 Nginx 컨테이너를 확인하세요. Ubuntu 20.04에 Kubernetes를 설치하고 사용하는 방법.

다음으로, 프로세스 ID를 찾기 위해 다음 명령에서 사용할 컨테이너 ID 또는 이름을 복사합니다:

강조 표시된 부분을 이전 명령에서 복사한 값으로 바꿉니다. 아래는 프로세스 ID인 출력 결과입니다:

docker inspect

이제 프로세스 ID가 있으므로 이를 사용하여 다음 명령을 실행할 수 있습니다. nsenter 명령을 프로세스의 네트워크 네임스페이스 내부에서 실행합니다:

강조 표시된 부분을 이전 명령에서 얻은 프로세스 ID로 바꿉니다. 그런 다음 ip addr 자리에 파드의 네트워크 네임스페이스 내부에서 실행하려는 명령을 넣을 수 있습니다. 권한 거부 오류가 발생하는 경우 sudo를 사용하여 실행할 수도 있습니다.

The nsenter 명령을 사용하면 컨테이너 내부에 설치된 명령으로만 제한되는 docker exec 를 사용하는 것과 달리 노드에서 사용할 수 있는 더 광범위한 명령을 실행할 수 있습니다.

파드의 가상 이더넷 인터페이스 검색

파드의 네트워크 네임스페이스는 가상 이더넷 파이프를 통해 노드의 루트 netns와 통신합니다. 노드 측에서 이 파이프는 이름이 veth 로 시작하고 veth742f721 또는 veth90 과 같은 고유 식별자로 끝나는 장치로 나타납니다. 파드 내부에서 파이프는 eth0.

으로 식별됩니다. 어떤 veth 장치가 어떤 파드와 페어링되어 있는지 알고 싶을 수 있습니다. 먼저 노드의 모든 네트워크 장치를 나열한 다음 파드 네트워크의 모든 장치를 나열할 수 있습니다. 어떤 veth 장치가 특정 파드와 페어링되어 있는지 확인하려면 두 목록 간의 장치 번호를 상호 연관시킬 수 있습니다.

Use the nsenter 명령을 사용하여 파드의 네트워크 네임스페이스에서 ip addr 명령을 실행합니다. 컨테이너의 프로세스 ID 중 하나를 알아야 합니다. 이에 대해서는 이전 섹션인 파드 네트워크 네임스페이스 가져오기 및 액세스.

다음으로, 워커 노드의 터미널에서 강조 표시된 부분을 적절히 변경하여 다음 명령을 실행합니다:

이 명령은 파드의 인터페이스 목록을 출력합니다:

nsenter ip addr

위 출력에서 if7 문자가 eth0@ 뒤에 있는 것에 주목하세요. 이는 파드의 eth0이 노드의 7번째 인터페이스와 쌍을 이룬다는 것을 의미합니다. 다음으로, ip addr 명령을 실행하여 노드의 기본 네임스페이스 내에 있는 인터페이스를 나열합니다:

명령은 아래와 같이 인터페이스 목록을 출력합니다:

Kubernetes Networking ip addr

출력에서 7번째 인터페이스는 veth254b50e6@if3  – 우리가 테스트 중인 파드와 쌍을 이루는 가상 이더넷 파이프입니다.

Reviewing Iptables Rules

다음 명령을 실행하여 iptables-save 노드의 모든 iptables를 나열할 수 있습니다:

명령의 출력이 길 수 있으므로, 나중에 검사할 수 있도록 파일에 저장할 수 있습니다:

또한 less 을 사용하여 출력을 페이지 단위로 볼 수 있습니다:

Kubernetes NAT 규칙에만 관심이 있으므로, -L 플래그를 추가하여 올바른 대상을 지정합니다:

출력 결과는 다음과 같습니다:

Kubernetes Networking iptables

IPVS 세부 정보 검사

Kube-proxy는 Kubernetes 클러스터의 각 노드에서 실행되는 네트워크 프록시입니다. 가상 서비스 IP를 파드 IP로 변환하도록 IPVS를 구성하는 데 사용할 수 있습니다. IP 변환 테이블을 나열하려면 ipvsadm 명령을 사용할 수 있습니다. 먼저 노드에 설치해야 합니다:

이제 다음 명령을 실행할 수 있습니다:

단일 서비스 IP를 표시하려면 -t 플래그를 추가하고 원하는 IP 주소를 지정합니다:

클러스터 DNS 쿼리

클러스터 DNS 확인을 디버깅하는 몇 가지 방법이 있습니다. 공식 문서에서는 필요한 모든 도구가 포함된 디버그 컨테이너를 배포한 다음, kubectl을 사용하여 nslookup.

을 실행하는 방법을 설명합니다. 선택적으로, 노드 자체에서 dignsenter 명령을 사용하여 DNS를 쿼리할 수 있습니다. 먼저 마스터 노드에 dig을 설치해야 합니다. Ubuntu의 경우, apt 명령으로 설치합니다:

Kubernetes Networking install dnsutils

로컬 머신의 터미널로 돌아가서, 아래 명령을 실행하여 kube-dns 서비스의 클러스터 IP를 찾습니다:

명령 출력 결과:

get kube dns service

The cluster-ip 열에 필요한 값이 포함되어 있습니다. 이제 nsenter를 사용하여 컨테이너 네임스페이스에서 dig 을 실행할 수 있습니다. 하지만 네임스페이스에 액세스하려면 컨테이너 프로세스 ID가 필요합니다. 안내를 위해 위의 파드 네트워크 네임스페이스 가져오기 및 액세스 섹션을 참조하세요.

일단 container-id를 확보하면, 마스터 노드에서 다음 명령을 실행합니다:

The dig 명령은 클러스터 DNS 서비스 IP( @10.96.0.10)를 가져와 서비스의 전체 도메인 이름을 조회합니다: service-name.namespace.svc.cluster.local:

Kubernetes Networking nsenter dig

서비스 이름 및 네임스페이스를 찾는 방법에 대한 정보는 다음 섹션을 참조하세요: 서비스의 IP 주소 가져오기.

Conntrack 연결 추적 검토

다음 명령을 사용하여 conntrack 현재 추적 중인 모든 연결을 볼 수 있습니다:

스크린샷과 유사한 결과가 출력됩니다:

Kubernetes Networking conntrac -l

들어오는 연결을 지속적으로 모니터링하려면 -E 플래그를 추가합니다:

특정 대상 주소로 추적된 연결을 보려면 -d 플래그를 추가하고 대상 주소를 지정합니다:

때로는 연결 추적 테이블이 가득 차서 새로운 연결이 끊어지는 경우가 있습니다. 이로 인해 노드가 안정적인 연결을 생성하지 못하는 문제가 발생합니다. 이 경우 시스템 로그의 다음 위치에서 다음과 같은 메시지를 볼 수 있습니다. /var/log/syslog:

추적할 최대 연결 수에 대한 시스템 설정이 존재합니다. 다음 명령어를 사용하여 현재 값을 확인하십시오:

출력 결과는 다음과 같습니다:

conntrack max

다음 -w 플래그를 사용하여 값을 수정할 수 있습니다:

다음 /etc/sysctl.conf 파일을 수정하여 값을 영구적으로 적용하고 재부팅 후에도 유지되도록 할 수 있습니다. nano로 파일을 여십시오:

다음으로, 해당 라인이 존재하면 값을 수정하고, 존재하지 않으면 파일 끝에 새 값을 지정하는 라인을 추가합니다:

결론

여러 컨테이너화된 서비스를 배포할 때 Kubernetes는 중앙 관리 지점을 제공하므로 큰 이점을 얻을 수 있습니다. 다양한 Kubernetes 포드 간의 연결성을 보장하기 위해, Kubernetes 인프라 주변의 문제를 해결하는 데 사용할 수 있는 몇 가지 네트워크 검사 명령어를 소개해 드렸습니다.

Kubernetes와 그 장점, Kubernetes에서 애플리케이션을 설정하고 배포하는 방법에 대해 자세히 알아보려면 다양한 Kubernetes 튜토리얼.

즐거운 컴퓨팅 되세요!

author

Pranay Kapgate

작성자 · CloudSigma

Preslav Dobrev는 CloudSigma의 크리에이티브 디자이너로서, 전통적이고 혁신적인 마케팅 채널을 활용하여 일관된 비즈니스 정체성을 구축하는 데 중점을 두고 있습니다. 그는 영향력 있는 브랜드 내러티브를 창출하기 위해 예술적 비전과 전략적 마케팅을 결합하는 데 능숙합니다.

댓글

아직 댓글이 없습니다. 첫 번째로 작성해 보세요.