[Infra] 쿠버네티스(kubernetes)(4) 컨테이너 IP와 파드 IP의 관계
업데이트:
도커 사용시 컨테이너 IP와 쿠버네티스 사용시 파드 IP의 관계
참고링크
참고 링크
- (0)도커의 개념
- (1)도커 설치하기, hello world!
- (2)도커 컨테이너 조작 기초(pull, run, ps)
- (3)도커 이미지 변경 후 저장(commit)
- (4)도커 컨테이너 네트워크
- (5)도커 API 이미지 빌드 및 컨테이너 실행
- (6)도커 컴포즈를 활용한 여러 개의 Flask, Nginx 배포
- (7)도커 볼륨을 이용한 데이터 관리
- (8)도커 장고 이미지 살펴보기
- (9)도커 PostgreSQL 컨테이너 배포
- (1)쿠버네티스 구조
- (2)쿠버네티스 설치
- (3)쿠버네티스 서비스 배포하기
- (4)컨테이너 IP와 파드 IP의 관계
- (5)퍼시스턴트 볼륨 스토리지
- (6)쿠버네티스 에러 메시지
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를 사용합니다. 따라서 위와 같은 코드를 작성할 수 있는 것입니다. 이를 그림으로 나타내면 다음과 같습니다.