Kubernetes Ingress 실습을 하다 보면 이런 주소를 만난다.
apache.192.168.164.4.sslip.io
apache는 뭔가 서비스 이름 같고, 192.168.164.4는 IP 주소 같고, sslip.io는 도메인 같은데 이게 왜 한 줄에 붙어 있는 걸까?
이번 글에서는 이 주소를 기준으로 Apache가 무엇인지, sslip.io가 왜 필요한지, 그리고 Kubernetes Ingress에서 이 주소가 어떻게 동작하는지 정리해본다.
apache.192.168.164.4.sslip.io
이 주소는 대충 이렇게 나눠볼 수 있다.
apache / 192.168.164.4 / sslip.io
각각의 의미는 다음과 같다.
apache → 어떤 서비스로 보낼지 구분하는 이름
192.168.164.4 → 실제로 접속할 IP 주소
sslip.io → IP를 도메인처럼 쓸 수 있게 해주는 DNS 서비스
즉 이 주소는 한 줄로 말하면 이렇다.
192.168.164.4라는 IP로 접속하되,
Host 이름이 apache로 시작하는 요청은 Apache 서비스로 보내기 위한 실습용 도메인
Apache는 보통 Apache HTTP Server를 의미한다.
Apache HTTP Server는 웹 서버다. 공식 프로젝트 설명에서도 Apache httpd는 여러 운영체제에서 동작하는 빠르고 안정적인 오픈소스 웹 서버라고 설명한다. (Apache HTTP Server)
웹 서버는 브라우저가 요청을 보냈을 때 HTML, 이미지, CSS, JavaScript 같은 웹 리소스를 응답해주는 서버다.
예를 들어 사용자가 브라우저에서 다음 주소로 접속했다고 해보자.
http://example.com
그러면 브라우저는 서버에게 이렇게 요청한다.
example.com에 해당하는 웹 페이지 주세요
이때 서버 쪽에서 요청을 받아서 웹 페이지를 돌려주는 역할을 하는 프로그램 중 하나가 Apache다.
Kubernetes 실습에서는 보통 nginx와 apache를 같이 띄워놓고 비교하는 경우가 많다.
예를 들면 이런 식이다.
nginx.192.168.164.4.sslip.io
apache.192.168.164.4.sslip.io
둘 다 웹 서버지만, Ingress 실습에서는 보통 “서로 다른 백엔드 서비스”를 구분하기 위해 사용한다.
nginx 주소로 접속하면 nginx 서비스로 이동
apache 주소로 접속하면 apache 서비스로 이동
즉 여기서 중요한 건 Apache 자체의 깊은 구조가 아니라, Apache라는 웹 서버가 하나의 백엔드 서비스로 떠 있다는 점이다.
Kubernetes에서는 Apache를 직접 서버에 설치하기보다는 보통 컨테이너 이미지로 실행한다.
예를 들면 이런 구조다.
Apache 컨테이너
↓
Apache Pod
↓
Apache Service
↓
Ingress
↓
브라우저 접속
Deployment 예시는 대충 이런 모양이다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache
spec:
replicas: 1
selector:
matchLabels:
app: apache
template:
metadata:
labels:
app: apache
spec:
containers:
- name: apache
image: httpd
ports:
- containerPort: 80
여기서 httpd가 Apache HTTP Server 이미지다.
그리고 이 Pod를 외부에서 접근할 수 있게 Service를 만든다.
apiVersion: v1
kind: Service
metadata:
name: apache-service
spec:
selector:
app: apache
ports:
- port: 80
targetPort: 80
그다음 Ingress에서 특정 도메인으로 들어온 요청을 apache-service로 보내게 만든다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: apache-ingress
spec:
rules:
- host: apache.192.168.164.4.sslip.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: apache-service
port:
number: 80
이제 브라우저에서 아래 주소로 접속하면:
apache.192.168.164.4.sslip.io
Ingress가 요청을 보고 이렇게 판단한다.
Host가 apache.192.168.164.4.sslip.io네?
그럼 apache-service로 보내야겠다.
sslip.io는 DNS 서비스다.
DNS는 도메인 이름을 IP 주소로 바꿔주는 시스템이다.
예를 들어 우리가 브라우저에 google.com을 입력하면 컴퓨터는 실제로는 구글 서버의 IP 주소를 찾아서 접속한다.
google.com
↓ DNS 조회
실제 IP 주소
sslip.io도 비슷한 역할을 한다.
다만 sslip.io는 조금 특이하다.
주소 안에 IP를 넣으면, 그 IP로 자동 변환해준다. sslip.io 공식 설명에서도 hostname 안에 IP 주소가 포함되어 있으면 그 IP 주소를 반환하는 DNS 서비스라고 설명한다. (Sslip)
예를 들어:
192.168.164.4.sslip.io
이 주소를 DNS에 물어보면:
192.168.164.4
를 돌려준다.
즉 따로 DNS 설정을 하지 않아도 IP를 도메인처럼 쓸 수 있다.
그냥 이렇게 접속하면 안 될까?
http://192.168.164.4
가능할 때도 있다.
하지만 Ingress 실습에서는 보통 Host 기반 라우팅을 한다.
Host 기반 라우팅은 이런 것이다.
nginx.192.168.164.4.sslip.io → nginx-service
apache.192.168.164.4.sslip.io → apache-service
grafana.192.168.164.4.sslip.io → grafana-service
즉 같은 IP로 들어오더라도, 앞에 붙은 도메인 이름에 따라 서로 다른 서비스로 보내는 방식이다.
문제는 그냥 IP로 접속하면 Host 이름이 없다.
http://192.168.164.4
이렇게 접속하면 Ingress 입장에서는 이런 구분을 하기 어렵다.
이 요청을 nginx로 보내야 하나?
apache로 보내야 하나?
grafana로 보내야 하나?
그래서 실습에서는 도메인 형태가 필요하다.
그런데 매번 실제 도메인을 사고 DNS 설정을 하기는 귀찮다.
이때 sslip.io를 쓰면 된다.
apache.192.168.164.4.sslip.io
이 주소는 도메인처럼 생겼지만, 실제로는 자동으로 192.168.164.4를 가리킨다.
브라우저에서 다음 주소로 접속한다고 해보자.
http://apache.192.168.164.4.sslip.io
전체 흐름은 이렇게 된다.
1. 브라우저가 apache.192.168.164.4.sslip.io로 접속 시도
2. DNS가 sslip.io를 보고 IP를 해석
3. apache.192.168.164.4.sslip.io → 192.168.164.4
4. 요청이 192.168.164.4에 있는 Ingress Controller로 도착
5. Ingress Controller가 Host 헤더 확인
6. Host가 apache.192.168.164.4.sslip.io이므로 apache-service로 전달
7. apache-service가 Apache Pod로 트래픽 전달
8. Apache Pod가 웹 페이지 응답
그림처럼 보면 이렇다.
Browser
|
| http://apache.192.168.164.4.sslip.io
v
DNS
|
| apache.192.168.164.4.sslip.io = 192.168.164.4
v
Ingress Controller
|
| Host 확인: apache.192.168.164.4.sslip.io
v
apache-service
|
v
Apache Pod
이제 이 주소를 다시 보면 덜 이상하다.
apache.192.168.164.4.sslip.io
이건 이런 뜻이다.
apache라는 이름의 서비스로 보내고 싶은 요청이다.
실제 접속 IP는 192.168.164.4다.
sslip.io가 이 도메인을 192.168.164.4로 해석해준다.
즉 apache는 실제 IP가 아니다.
apache는 Ingress가 Host를 구분할 때 쓰는 이름에 가깝다.
실제 IP는 이 부분이다.
192.168.164.4
그리고 이 IP를 도메인처럼 쓸 수 있게 해주는 게 이 부분이다.
sslip.io
Ingress 실습에서는 이런 주소들이 자주 나온다.
nginx.192.168.164.4.sslip.io
apache.192.168.164.4.sslip.io
grafana.192.168.164.4.sslip.io
prometheus.192.168.164.4.sslip.io
이 주소들은 모두 최종적으로 같은 IP를 가리킬 수 있다.
192.168.164.4
하지만 Ingress는 Host 이름을 보고 서로 다른 서비스로 보낸다.
nginx.192.168.164.4.sslip.io → nginx-service
apache.192.168.164.4.sslip.io → apache-service
grafana.192.168.164.4.sslip.io → grafana-service
prometheus.192.168.164.4.sslip.io → prometheus-service
그래서 하나의 IP로 여러 서비스를 구분해서 접속할 수 있다.
Apache는 웹 서버다.
브라우저가 요청을 보내면 웹 페이지를 응답해주는 서버 프로그램이다. Kubernetes에서는 보통 Apache 컨테이너를 Pod로 띄우고, Service와 Ingress를 통해 외부에서 접근하게 만든다.
sslip.io는 IP를 도메인처럼 쓸 수 있게 해주는 DNS 서비스다.
192.168.164.4.sslip.io
처럼 주소 안에 IP를 넣으면, sslip.io가 자동으로 그 IP를 반환해준다.
그래서 실습 환경에서는 실제 도메인을 구매하거나 DNS 설정을 하지 않고도 Ingress Host 기반 라우팅을 테스트할 수 있다.
마지막으로 이 주소를 한 문장으로 정리하면 다음과 같다.
apache.192.168.164.4.sslip.io는
192.168.164.4라는 IP로 접속하면서,
Ingress에게 “이 요청은 apache 서비스로 보내줘”라고 알려주는 실습용 도메인이다.
Kubernetes Ingress를 공부할 때 이 주소 구조를 이해하면, host, service, pod, dns, ip가 어떻게 연결되는지 훨씬 선명하게 보인다.