[Infra] 쿠버네티스(kubernetes)(4) 컨테이너 IP와 파드 IP의 관계

업데이트:

도커 사용시 컨테이너 IP와 쿠버네티스 사용시 파드 IP의 관계

참고링크

운영체제 프론트엔드 백엔드 데이터베이스 인프라
리눅스구조 js필터 아파치에러로그 행삭제 아파치스쿱
프로세스 헬로월드 웹서버개념 ES기초 로그분석
네임스페이스 프로젝트생성 아파치설치 MySQL기초 beeline
디렉토리 헤더생성 flask연동 큐브리드 하둡기초
리다이렉션 async-get 장고MsSQL연결 null공백 나이파이
쓰레드 async-post 장고MySQL연결 MySQL설치(win) 백본
라즈베리파이설치 로그인페이지 장고inpectdb MySQL테이블생성 제플린
OSI7계층소개   장고read   SSL인증
OSI1계층   장고insert   커버로스
OSI2계층   장고put   도커개념
OSI3계층   장고del   도커설치
OSI4계층   flask한글요청   도커기초
OSI5,6,7계층       도커이미지
DNS서버       컨테이너네트워크
DHCP       도커API
bashrc       도커컴포즈
bash       도커볼륨
ifconfig       장고이미지
소켓프로그래밍       도커postgre
리눅스유저생성       도커이미지삭제
netstat포트열기       도커Redis
컴파일러       k8s구조
운영체제vs커널       k8s설치
작업스케쥴링       k8s서비스배포
디스크추가       POD네트워크
aws유저추가       퍼시스턴트볼륨
기초명령어       k8s에러
포트번호        

참고 링크

1. 상황 설명

flask와 nginx를 컨테이너로 띄운 후 서로 연동시켜 flask api 서비스를 제공하는 상황입니다. 이때 배포는 도커 컴포즈를 사용하는 방법이 있고 쿠버네티스를 사용하는 방법이 있는데, 이때 파일 작성 법이 조금 달라질수 있습니다.



2. 도커 컴포즈 사용시 nginx-default.conf

배포를 하기 전에 nginx 내부에 default.conf 파일을 만들어줘야하는데 이 파일은 다음과 같이 작성합니다.


server{
        listen 9001;
        server_name 10.1.55.220;

        location /{
        proxy_read_timeout 3000;
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        send_timeout 3000;
        proxy_pass http://model_test:6001;
        }
}

위 파일의 의미는 nginx는 9001로 받아서 model_test의 6001번 포트로 포트포워딩한다는 의미입니다. 이를 그림으로 나타내면 다음과 같습니다.

위 그림을 보면 nginx 쪽에서 먼저 요청을 받고 flask 한테 넘겨줘야하는데, 이때 중요한건 nginx가 flask를 어떻게 아느냐 입니다. 위 파일 내용에서는 주소에 컨테이너 이름을 썼기 때문에 컨테이너 찾아서 요청을 넘겨주는데, 이때 위 파일을 다음과 같이 쓰면 안됩니다.


server{
        listen 9001;
        server_name 10.1.55.220;

        location /{
        proxy_read_timeout 3000;
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        send_timeout 3000;
        proxy_pass http://127.0.0.1:6001;
        }
}

위와 같이 proxy_pass에 로컬 주소(127.0.0.1)을 쓰면 안되는 이유는 nginx 컨테이너와 flask 컨테이너는 서로 ip주소가 다르기 때문입니다. 즉, 위와 같이 proxy_pass에 로컬 주소를 쓰면 flask 컨테이너의 6001번 포트로 요청을 주는게 아니라 nginx 자기 자신의 6001번 포트로 요청을 주기 때문에 서비스를 제대로 배포할 수 없습니다. 이를 그림으로 나타내면 다음과 같습니다.

두 컨테이너의 ip 주소가 다르다는 것은 다음과 같이 확인 할 수 있습니다.

$ docker inspect nginx-test02 | grep IP
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
                    "IPAMConfig": null,
                    "IPAddress": "192.168.48.3",
                    "IPPrefixLen": 20,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
$ docker inspect model-test02 | grep IP
                "PYTHON_PIP_VERSION=20.2.3",
                "PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/fa7dc83944936bf09a0e4cb5d5ec852c0d256599/get-pip.py",
                "PYTHON_GET_PIP_SHA256=6e0bb0a2c2533361d7f297ed547237caf1b7507f197835974c0dd7eba998c53c"
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
                    "IPAMConfig": null,
                    "IPAddress": "192.168.48.2",
                    "IPPrefixLen": 20,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,

3. 쿠버네티스 사용시 nginx-default.conf

반면 쿠버네티스를 사용한다면 이야기가 조금 다릅니다. 쿠버네티스를 이용해 nginx와 flask를 연동할때는 다음과 같은 default.conf 파일을 사용할 수 있습니다.


server{
        listen 9001;
        server_name 10.1.55.220;

        location /{
        proxy_read_timeout 3000;
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        send_timeout 3000;
        proxy_pass http://127.0.0.1:6001;
        }
}

위에서는 안된다고 했던 proxy_pass에 127.0.0.1을 쓸 수 있는 것입니다. 그 이유는 쿠버네티스에서 pod 내에 존재하는 컨테이너는 서로 동일한 ip를 사용합니다. 따라서 위와 같은 코드를 작성할 수 있는 것입니다. 이를 그림으로 나타내면 다음과 같습니다.