STUDY/Data Engineering

16. CKA udemy 강의 정리 - Section 9 [Networking]

wonpick 2023. 1. 25. 01:53

0. 네트워크 기초

스위치(Switch)

두 PC를 연결하기 위해서는 각 호스트 타입에 따라 물리/가상 인터페이스가 필요하다.

인터페이스 확인을 위해 ip link 명령을 사용한다. 위의 예시에서는 eth0이 인터페이스가 된다.

그렇게 네트워크 구성이 완료되었고, 통신을 하기 위해서는 ip 주소가 필요하므로 
 ip addr 명령으로 자신의 ip주소를 스위치에게 전달하여 얻어 낼 수 있다. 

스위치를 통해 동일한 네트워크 상에서만 통신할 수 있으며, 다른 네트워크로 패킷을 주고 받을 수 없다.

라우터(Router)

두 네트워크를 연결하기 위한 접점이 라우트이다. 서로 다른 네트워크에 있는 컴퓨터가 서로 통신하려고 할때 사용하는 것이 바로 라우트이다. 라우터는 두개의 분리된 네트워크를 연결해주어 각 네트워크의 IP주소를 스위치로부터 할당 받는다. 

게이트웨이(Gateway)

routing table 이 작성된 라우터가 게이트웨이다.

서로 다른 네트워크에 접근해야 하기 때문에 라우터를 사용해야 한다.
위 예에서 라우터는 두 개의 분리된 네트워크를 연결해주므로, 각 네트워크로부터 각 IP 주소를 할당 받는다.

route 명령어를 통해 예시의 routing 설정들이 있는 kernel의 routing table을 확인해보면, 아직 어떠한 라우팅 구성도 없기 때문에 B에서 보낸 패킷이 C에 도달할 수 없고 오직 같은 네트워크 상의 A 나 라우터로만 패킷을 전달할 수 있는 것을 알 수 있다. 

 

때문에 보라색의 네트워크 스위치 IP주소를 ip route add 명령을 통해 등록하고, 반대로 패킷을 보내려면 파란색 네트워크 스위치 IP주소를 ip route add 명령으로 등록하면 된다. 

 

DNS

K8s에서는 클러스터 안에서만 사용하는 DNS(kube-dns)를 설정할 수 있다. DNS 통해 파드 사이에 통신할 때 IP가 아닌 도메인을 사용할 수 있다. 특정 파드나 디플로이먼트를 도메인으로 접근하도록 설정했다면 문제가 생겨서 파드나 디플로이먼트를 재생성할 때 자동으로 변경된 파드의 IP를 도메인에 등록하고 자연스럽게 새로 실행한 파드로 연결할 수 있다. (Service와 POD의 목적지 IP에 대한 FQDN을 관리하고 있다.) DNS를 클라이언트나 API 게이트웨이가 호출할 서비스를 찾는 서비스 디스커버리 용도로 사용할 수도 있다. 

  • Service : {Service Name}.{Namespace}.svc.cluster.local형식의 도메인
  • POD: {POD IP의 점을 대시로 변경}.{Namespace}.svc.cluster.local형식의 도메인

 CoreDNS

coredns는 쿠버네티스 클러스터 DNS서버 역할을 한다. 쿠버네티스 애드온으로 쿠버네티스 클러스터 실행시 pod로 실행된다.

파드, 서비스 도메인을 관리하고 외부 도메인 서버 연결이 필요한 경우 통로역할을 수행한다. CoreDNS는 deployment로 관리되고 ClusterIP타입 서비스를 가지게 된다. 서비스이름은 kube-dns인데 호환성을 위해 구버전부터 사용했던 DNS서비스 이름을 사용한다.

클러스터에 kube-system namespace에 배포된다. 

CoreDNS 설정은 /etc/coredns/Corefile에 정의된다. 이때 수많은 플러그인이 있지만 'kubernetes'부분만 보면된다. 

Network Namespaces

가상화 또는 클러스터 시스템에서 자주 보이는 용어이다. 논리적인 Network Space(공간)을 생성 후 네트워크 인터페이스, 라우팅, IP 라는 네트워크 요소들을 넣어 Host의 네트워크와 격리를 시킬 수 있다.

Network Space는 다양한 환경의 네트워크들을 구분하고 통신하기 위해 활용된다.

Docker Networking

일반적인 도커 컨테이너 네트워크는 브리지 타입 네트워크 구조로 되어있다.

브리지 타입 네트워크 구조는 아래와같다.

  1. 호스트는 호스트 네트워크 네임스페이스를 가진다. 그리고 여기에 docker0 라는 브리지를 만든다.
  2. 컨테이너는 컨테이너 네트워크 네임스페이스를 가진다. 그리고 여기에 컨테이너를 만든다.
  3. 컨테이너 네트워크 네임스페이스에는 가상 이더넷(베스)을 가지고 있다.
  4. 도커는 docker0에 베스들을 연결하여 통신한다.

네트워크 네임스페이스는 서로 연결되기 전까지 독립적으로 동작한다.

네트워크 네임스페이스는 별도의 ARP, 라우팅, iptable 을 가진다.

CNI (Container Network Interface)

CNI(Container Network Interface)는 Linux 컨테이너에서 네트워크 인터페이스를 구성하는데 사용되는 플러그인을 작성하기 위한 사양 및 라이브러리로 구성된다.

CNI는 컨테이너의 '네트워크 연결'과 컨테이너가 삭제될 때 '할당된 리소스를 제거'하는 데에만 관여한다.
이러한 이유로, CNI는 광범위한 지원을 제공하며 사양을 구현하기가 간단하다.

즉 ,  어떤 컨테이너 런타임인지 상관없이 리눅스 컨테이너에서 사용할 네트워크의 인터페이스를 정의한 것이다.

Cluster Networking

쿠버네티스는 도커와 달리 기본 도커 네트워크 타입이 링크 타입이다.

쿠버네티스는 도커와 달리 파드 단위로 컨테이너를 관리한다.

파드 하나에 속한 컨테이너는 veth0 를 공유한다.

파드 하나에 속한 컨테이너는 같은 IP를 가진다. (Pause 컨테이너 네트워크 네임스페이스의 IP)

파드 안 컨테이너의 Network 모드를 보면 bridge, host 가 아닌 container 이다.

즉 컨테이너가 pause 컨테이너의 네트워크를 공유한다는 의미다. 파드 안 컨테이너 사이의 구분은 포트로 한다.

 

CNI Weave Works

라우팅 테이블은 많은 엔트리를 포함할 수 없기 때문에 다른 해결책이 필요하다.
CNI 플러그인이 클러스터에 배포되면 모든 노드에 에이전트처럼 배포된다. 이 에이전트들은 서로 통신해서 노드와 네트워크, POD에 대한 정보를 교환한다.
네트워크 패킷이 어떤 POD에서 다른 노드로 전달될 때 Weave가 이 패킷을 가로챈 뒤 목적지 POD가 존재하는 노드의 네트워크 주소 정보를 포함 시켜 다시 캡슐화 해서 해당 노드로 전달한다. 그러면 해당 노드의 Weave가 다시 이 패킷을 받아 캡슐화된 정보를 확인해서 실제 목적지 POD에서 최종 전달하게 된다.

IPAM (IP Address Management)

POD IP를 중복되지 않도록 할당하는 방법이다. 가장 간단한 방법은 IP를 리스트 파일로 저장하는 것이다. 

CNI Plugin Responsibilities

  • Must support argument ADD/DEL/CHECK
  • Must support parameters container id, network namespace, etc...
  • Must manage IP Address assignment to PODs
  • Must Return results in a specific format

Ingress in Kubernetes

ingress는 클러스터 외부에서 내부로 접근하는 요청을 어떻게 처리할지에 대한 설정이다. 

인그레스 자체는 이런 규칙들을 정의해둔 자원이고 이런 규칙들을 실제로 동작하게 해주는게 인그레스 컨트롤러(ingress controller)이다.

  • 외부에서 접근가능한 URL
  • 트래픽 로드밸런싱
  • SSL/TLS termination
  • ip가아닌 이름기반 주소처리

Ingress는 사용자가 외부에서 액세스 할 수있는 단일 URL을 사용하여 애플리케이션에 액세스하게 해준다. 이 URL은 URL Path를 기반으로 클러스터 내의 다른 서비스로 라우팅하도록 구성 할 수 있다. 동시에 TLS 인증서 보안도 제공한다.

Ingress는 쿠버네티스 클러스터에 장착된 L7 로드밸런서라고 생각해도 된다.
Ingress를 실행하기 위해서는 외부 네트워크에서 들어올 수 있는 NodePort나 Load Balancer 타입의 Serivce가 필요하다. 이것은 단 한 번만 하면 된다.

만약 쿠버네티스가 밖에서 Ingress 역할을 직접 만든다고 하면 Nginx, HAProxy, Traefik 같은 솔루션을 이용해야 한다.
쿠버네티스에는 이 부분을 __Ingress Controller__라고 부르는 리소스를 생성할 수 있다. 그리고 그 설정들을 __Ingress Resource__라고 하며, POD, Deployments, Services 같이 Definition file을 사용해서 생성한다.

 


참고

1. 네트워크 구성 

2. DNS란 

3. CoreDNS