전공공부
[K8S - CKA] Networking 본문
Networking Basic
Switching and Routing, DNS, Network Namespace, Docker Namespace 등에 대해서 개념적인 의미 그리고 시스템에서 어떻게 사용되는지 알아봅시다.
우리는 네트워크 엔지니어가 아니니 가볍게 볼 거지만 적어도 기본적으로 용어나 어떤 행동을 하는지 알아야 깊이 있는 이해가 가능하기 때문에 한 번 알아봅시다.
Switching
Switch는 네트워크 내부에서만 통신 할 수 있게 도와줍니다.
각각의 VM 또는 데스크톱이 있다고 합시다. 우리는 서로 소통하기 위해서 이들을 스위치에 연결하고, 스위치는 이 두 시스템을 포함하는 네트워크를 생성합니다. 이들을 스위치에 연결하기 위해서는 각 호스트에 인터페이스가 필요한데요. 호스트에 따라 물리적인 것일 수도 있고 가상의 것일 수도 있습니다.
호스트의 인터페이스를 확인하기 위해 우리는 IP link 명령어를 사용합니다. 이 경우, 우리는 스위치에 연결하는 데 사용할 eth0이라는 이름의 인터페이스를 살펴봅니다. 이 네트워크의 주소가 192.168.1.0이라고 가정해봅시다. 그런 다음 우리는 같은 네트워크에 IP 주소를 할당합니다.
그러면 링크가 활성화 되고 네트워크 내부에서 통신이 서로 가능하게 합니다.
$ ip addr add 192.168.1.10/24 dev eth0
$ ip addr add 192.168.1.11/24 dev eth0
그러면 아래와 같이 서로 다른 네트워크의 접근은 어떻게 해야 할까요? 바로 이때 라우터가 등장합니다.
Router
라우터는 두개의 네트워크를 연결하죠. 각 네트워크가 연결되어 있으니 그 둘 사이의 통신이 가능합니다.
그러면 A-D가 연결되는걸 어떻게 알고 나갈까요?
Gateway
시스템은 라우터의 나가는 곳을 지정해야 시스템에서 실제로 통신이 가능합니다. Router에 문을 달지 않으면 소통을 하지 못하겠죠.
자 그러면, 인터넷에 연결하기 위해서는 우리가 모든 전세계의 서버에 대해서 Gateway를 달아야 할까요?
당연히 아닙니다. Default Gateway라는 개념을 가지고 인터넷을 연결하는 네트워크를 만들 수 있죠.
Default Gateway
Default Gateway 방식을 통해 기존 네트워크 외부의 어떤 네트워크로든 요청이 특정 라우터로 이동합니다. 따라서, VM 끼리 간단한 설정에서는 라우터의 IP 주소로 설정된 기본 게이트웨이가 있는 단일 라우팅 테이블 항목만 필요합니다.
$ ip route add default via 192.168.2.1
이렇게 하면 인터넷 모두에 대해서 연결 할 수 있죠.
$ ip route add 192.168.2.0 via 0.0.0.0
이렇게 하면 아까 192.168.2.0은 모든 게이트 웨이로 나가게 됩니다.
자 그러면 A-B-C로 바로 연결된 것에서는 A-C 통신을 어떻게 해야 할 까요? 라우터가 없고 리눅스 호스트가 바로 연결 되었다면 아래와 같이 라우터 경로를 추가하면 됩니다.
$ ip route add <B-hostIP> via <A-hostIP>
라우팅 항목은 올바르지만 아직 응답을 받지 못합니다.
왜냐하면 B의 eth0로 받은 것이 eth1로 내보니지 않아서인데요. 이때, /proc/sys/net/ipv4/ip 파일의 설정을 바꿔야 합니다. 하지만 이는 재부팅을 하면 유지되지 않으므로
/etc/sysctl.conf 파일의 설정을 수정 합시다.
net.ipv4.ip_forward=1
아래 명령어로 수정하고 아래 명령어로 OS Parameter 적용 여부를 체크하면 됩니다.
$ sysctl -a
이제 K8S의 Network로 점진적으로 넘어가봅시다.
DNS
A 시스템이 B 시스템에 접근하려고 할 때, ip address로 접근하는것이 힘들면 cat >> /etc/hosts에 ip address를 적고 hostname을 적어주면 되죠.
ping dns-name 을 하면 이제 연결이 됩니다.
그러나 이런 방식은 사실 dns를 모두 관리 할 수 없죠. 모든 항목을 관리 할 수 있는 단일 서버를 두기로 했습니다. 그리고, 그것이 DNS 서버이죠.
모든 호스트는 /etc/resolv.conf에 DNS resolution 설정 파일을 가지고 있습니다. 이 파일을 통해 우리는 DNS 서버를 지정할 수 있습니다. 이 파일에 DNS 서버의 IP 주소를 입력하면 해당 서버가 DNS 서버로 사용됩니다. 예를 들어, 우리의 DNS 서버의 IP 주소를 지정하려면 다음과 같이 입력할 수 있습니다:
nameserver 192.168.1.100
이렇게 하면 호스트는 이제 DNS 조회를 위해 이 서버를 사용하게 됩니다. 이는 호스트 이름을 IP 주소로 변환하는 데 사용됩니다. 이 설정이 모든 호스트에 구성이 되면 호스트가 알지 못하는 이름을 만날때 마다 새 IP 주소를 DNS 서버로 부터 탐색하죠.
그러면 이런 의문이 들 수도 있는데요. 로컬 파일 항목에 192.168.1.115 설정하고 이를 test 서버로 /etc/host라고 로컬에 설정하고 DNS 서버에서는 192.168.1.116을 test 서버라고 지칭했다고 생각해봅시다.
이럴 경우 /etc/hosts를 먼저 찾기 때문에 192.168.1.115가 실행되는데요. 그렇다면 아무 목록에도 없는 서버에 ping 요청을 하면 어떻게 될까요? 실패 할 것이지만 만일, google은 알고 있다면요? 이럴때는 /etc/resolv.conf 에 nameserver 8.8.8.8을 설정하면 됩니다. 구글에 연결된 DNS 정보를 모두 내려 받죠
Domain name & Search Domain
nfs, db와 같은 도메인은 실제 http request link 중 찾아 볼 수 없습니다. 실제로는 모두 www. .com 등이 붙는데요 이는 우리가 IP를 기억하기 쉬운 이름으로 선정 한 것입니다. 웹 사이트의 의도를 나타내는등 성질을 나타내고 있습니다.
우리가 이러한 것들을 이야기 한 이유는 /etc/resolv.conf 파일의 항목을 이해하기 위해서 인데요.
만일, DNS 풀 이름을 쓰지 않고 같은 사내에서는 domain만 쳐서 웹에 접속하기 위해서는 아래와 같이 설정 할 수 있겠습니다.
cat /etc/resolv.conf
nameserver 192.168.1.100
search mycompany.com prod.mycompany.com
따로, 레코드를 저장해서 CNAME 레코드를 지정해서 여러 이름으로의 매핑도 가능하다고 합니다. (강의상에서는 이정도만 언급합니다.)
nslookup(/etc/host 미고) , dig 라는 명령어를 통해서 네트워크 테스트를 진행 할 수 있습니다. 어떤 hostname으로 사용되는지 확인이 가능합니다.
'Study > K8S' 카테고리의 다른 글
[K8S - CKA] Service Networking (1) | 2024.02.15 |
---|---|
[K8S] SidecarContainer가 존재하는 Pod의 HPA 적용기 (1) | 2024.01.27 |
[K8S - CKA] Volumes & Persistent Volumes (Claims) (0) | 2024.01.21 |
[K8S - CKA] Storage in Docker (0) | 2024.01.20 |
[K8S - CKA] Network Policy (0) | 2024.01.18 |