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

업데이트:

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

참고 링크

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를 사용합니다. 따라서 위와 같은 코드를 작성할 수 있는 것입니다. 이를 그림으로 나타내면 다음과 같습니다.