Kubernetes

[ Kans 3 Study - 1w ] 컨테이너 네트워크 & IP Tables(3)

su''@ 2024. 9. 1. 03:37
CloudNetaStudy - Kubernets Networtk 3기 실습 스터디 게시글입니다.

 

[2. 도커 네트워크 모델]

2.2 Host 모드
  • 호스트의 환경을 그대로 사용 가능. 호스트 드라이버의 네트워크는 별도로 생성할 필요 없이 기존의 host 라는 이름의 네트워크를 사용 - 링크 링크2
    • 컨테이너의 호스트 이름도 호스트 머신의 이름과 동일. 네트워크도 동일. 애플리케이션 별도 포트 포워딩 없이 바로 서비스 할 수 있음.
      # 컨테이너 실행
      docker run --rm -d --network host --name my_nginx nginx
      
      # HostConfig.NetworkMode "host" , Config.ExposedPorts "80/tcp" , NetworkSettings.Networks "host" 확인
      docker inspect my_nginx
      
      # curl 접속 확인
      curl -s localhost | grep -o '<title>.*</title>'
      
      # 호스트에서 tcp 80 listen 확인
      ss -tnlp
      State            Recv-Q           Send-Q                     Local Address:Port                       Peer Address:Port           Process
      LISTEN           0                511                              0.0.0.0:80                              0.0.0.0:*               users:(("nginx",pid=3694,fd=7),("nginx",pid=3693,fd=7),("nginx",pid=3649,fd=7))
      
      # 추가 실행 시도
      docker run -d --network host --name my_nginx_2 nginx
      
      # 확인
      docker ps -a
      CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES
      369c40cf6dfd   nginx     "/docker-entrypoint.…"   7 seconds ago   Exited (1) 3 seconds ago             my_nginx_2
      ...
      
      # 삭제
      docker container stop my_nginx
  • 쿠버네티스 환경에서는 주로 어떤 파드(애플리케이션)이 Host 모드로 사용될까요? 적합한 이유 보완 사항이 무엇이 있을까요?

 

2.3 컨테이너 외부에 노출
  • 설정 및 확인 : bridge mode - 링크
    https://youtu.be/SJFO2w5Q2HI
    # nginx:alpine 웹 컨테이너 3대 실행
    # -p 옵션은 컨테이너 포트를 호스트 포트와 바인딩 연결 [호스트의 포트]:[컨테이너의 포트]
    ## -p 80 만 사용 시 호스트 포트 중 하나(랜덤)과 컨테이너의 80포트와 연결
    ## -p 여러개 사용하여 여러개 포트 개방
    docker run -d --name=web1 -p 10001:80 --rm nginx:alpine
    docker run -d --name=web2 -p 10002:80 --rm nginx:alpine
    docker run -d --name=web3 -p 10003:80 --rm nginx:alpine
    
    # 컨테이너 확인
    docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                     NAMES
    5747f508fe0b   nginx:alpine   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:10003->80/tcp, :::10003->80/tcp   web3
    222390d43aa5   nginx:alpine   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:10002->80/tcp, :::10002->80/tcp   web2
    b10d8e163c77   nginx:alpine   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:10001->80/tcp, :::10001->80/tcp   web1
    
    # iptables 정보 확인
    iptables -t nat -S | grep :80
    	-A DOCKER ! -i docker0 -p tcp -m tcp --dport 10001 -j DNAT --to-destination 172.17.0.2:80
    	-A DOCKER ! -i docker0 -p tcp -m tcp --dport 10002 -j DNAT --to-destination 172.17.0.3:80
    	-A DOCKER ! -i docker0 -p tcp -m tcp --dport 10003 -j DNAT --to-destination 172.17.0.4:80
    
    iptables -t filter -S
    	-A FORWARD -o docker0 -j DOCKER
    	-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
    	-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
    	-A DOCKER -d 172.17.0.4/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
      ...
    
    # 외부(자신의 PC)에서 접속(curl 혹은 웹브라우저)
    curl -s 192.168.50.10:10001 | grep -o '<title>.*</title>'
    curl -s 192.168.50.10:10002 | grep -o '<title>.*</title>'
    curl -s 192.168.50.10:10003 | grep -o '<title>.*</title>'
    
    # 연결 정보 확인
    conntrack -L
    iptables -t nat -L -n -v
    
    # 삭제
    docker stop $(docker ps -a -q)

실습 환경 삭제