쿠버네티스 Ingress 실습
인그레스의 핵심 구조: 컨트롤러와 리소스
인그레스는 반드시 두 가지 핵심 요소가 함께 있어야 동작한다
- 인그레스 컨트롤러 (Ingress Controller) 🧑🍳
- 역할: 실제 트래픽을 받고 규칙에 따라 요청을 분배하는 실행기(엔진) Nginx, Traefik, HAProxy 등 다양한 종류가 있으며, 클러스터에 반드시 하나 이상 설치되어 있어야 한다
- 비유: 레시피를 보고 실제로 요리를 하는 ‘셰프’
- 인그레스 리소스 (Ingress Resource) 📜
- 역할: 사용자가 YAML 파일로 작성하는 라우팅 규칙서 “어떤 도메인으로 요청이 오면 어떤 서비스로 보내라”는 내용이 담겨있다
- 비유: 셰프가 따라야 할 ‘레시피’
최종 목표
외부 인터넷 브라우저에서 http://hello.example.com 이라는 가상 도메인으로 접속했을 때, 우리가 만든 간단한 HTML 웹 페이지가 보이도록 만드는 것
graph TD
subgraph "💻 사용자 PC"
A["🌐 사용자<br>웹 브라우저"] -->|"hello.example.com 요청"| B["📄 로컬<br>/etc/hosts 파일"];
B -->|"워커 노드 IP 주소 반환"| A;
end
subgraph "🏢 쿠버네티스 클러스터"
C["🌐 NodePort Service<br>(Ingress Controller)"] -->|트래픽 전달| D["👮 Ingress Controller<br>Pod"];
D -->|"Ingress 규칙 조회"| E["📜 Ingress 리소스"];
E -->|"서비스로 라우팅"| F["🌐 my-web-service<br>(ClusterIP)"];
F -->|"로드 밸런싱"| G["📦 NGINX Pod 1"];
F -->|"로드 밸런싱"| H["📦 NGINX Pod 2"];
end
A -->|"HTTP 요청 전송<br>To: 워커 노드 IP"| C;
style A fill:#f9f,stroke:#333
style C fill:#bbf,stroke:#333
style E fill:#9f9,stroke:#333
1. 웹 페이지 만들기 (ConfigMap)
먼저, 웹 서버가 보여줄 간단한 HTML 파일을 만들어야 한다 별도의 이미지를 빌드하지 않고, ConfigMap을 사용하여 HTML 코드를 클러스터에 직접 저장하는 방식을 사용
- 명령어의 역할: 아래 YAML 파일은
my-html이라는 이름의ConfigMap을 생성 이ConfigMap은index.html이라는 키(key)에 우리가 원하는 HTML 코드를 값(value)으로 저장 web-configmap.yaml파일 작성: 아래 내용으로 YAML 파일을 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: ConfigMap
metadata:
name: my-html
data:
index.html: |
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Kubernetes Ingress!</title>
<style>
body { font-family: sans-serif; text-align: center; margin-top: 100px; background-color: #f0f8ff; }
h1 { color: #005a9c; }
p { font-size: 1.2em; }
</style>
</head>
<body>
<h1>hello</h1>
<p>success connecting!</p>
</body>
</html>
- 파일 적용:
1
kubectl apply -f web-configmap.yaml
2. 웹 서버 띄우기 (Deployment)
이제 위에서 만든 HTML 파일을 서빙할 NGINX 웹 서버를 Deployment를 통해 생성한다.
- 명령어의 역할:
my-web-deployment라는 이름의Deployment를 생성 이Deployment는 NGINX 컨테이너를 실행하며, 1단계에서 만든ConfigMap을 볼륨(Volume)으로 마운트하여 NGINX의 기본 웹 페이지 경로(/usr/share/nginx/html)에 덮어씌운다 web-deployment.yaml파일 작성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web-deployment
spec:
replicas: 2 # 안정성을 위해 2개의 Pod을 실행합니다.
selector:
matchLabels:
app: my-web
template:
metadata:
labels:
app: my-web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts: # 컨테이너 내부에 볼륨을 연결(마운트)합니다.
- name: html-volume
mountPath: /usr/share/nginx/html
volumes: # Pod이 사용할 볼륨을 정의합니다.
- name: html-volume
configMap:
name: my-html # 'my-html' ConfigMap을 볼륨으로 사용합니다.
- 파일 적용:
1
kubectl apply -f web-deployment.yaml

3. 내부 주소 부여하기 (Service)
Deployment의 Pod들은 언제든 죽고 새로 생성될 수 있어서 IP가 계속 바뀜 따라서 Ingress가 안정적으로 찾아갈 수 있도록 고정된 내부 주소를 가진 Service를 생성해야 한다
명령어의 역할:
my-web-service라는 이름의Service를 생성 이 서비스는app: my-web이라는 라벨을 가진 Pod들(2단계에서 만든 NGINX Pod들)을 찾아내고, 그들에게80번 포트로 요청을 전달한다type: ClusterIP는 이 서비스가 클러스터 내부에서만 사용됨을 의미web-service.yaml파일 작성:1 2 3 4 5 6 7 8 9 10 11 12
apiVersion: v1 kind: Service metadata: name: my-web-service spec: selector: app: my-web # 이 라벨을 가진 Pod을 찾습니다. ports: - protocol: TCP port: 80 # 서비스 자체의 포트 targetPort: 80 # Pod의 컨테이너 포트 type: ClusterIP
파일 적용:
1
kubectl apply -f web-service.yaml

4. Ingress Controller 설치하기
이제 외부 요청을 받아줄 ‘경비원’, 즉 NGINX Ingress Controller를 설치한다
명령어의 역할: 아래
apply명령어는 NGINX Ingress Controller 공식 GitHub에 있는 YAML 파일을 통해 설치를 진행 이 파일은ingress-nginx네임스페이스를 만들고, 그 안에 ControllerDeployment,Service, 각종 권한 설정(RBAC) 등을 자동으로 생성한다설치 명령어:
1
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/baremetal/deploy.yaml외부 접속 포트 확인: 설치 후,
ingress-nginx네임스페이스의 서비스를 확인하여 외부 접속 포트(NodePort)를 알아내야 한다(자동 설정했기 때문에)1
kubectl get service -n ingress-nginx
결과에서
ingress-nginx-controller서비스의PORT(S)부분을 확인80:32096/TCP와 같이 표시된 부분에서 32096가 우리가 사용할 포트 번호이다 32096으로 들어오는것을 80으로 보낸다 의미
5. 안내판 세우기 (Ingress)
드디어 “https://=hello.example.com:32096으로 온 요청은 my-web-service로 보내라”는 규칙을 담은 Ingress 리소스를 생성
명령어의 역할:
my-web-ingress라는 이름의Ingress를 생성ingressClassName: nginx는 이 규칙을 NGINX Ingress Controller가 처리해야 함을 명시한다host와path규칙에 따라 들어온 요청을my-web-service의80번 포트로 전달web-ingress.yaml파일 작성:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-web-ingress spec: ingressClassName: nginx # NGINX Ingress Controller를 사용 rules: - host: "hello.example.com" http: paths: - path: / pathType: Prefix backend: service: name: my-web-service # 3단계에서 만든 서비스 이름 port: number: 80 # 서비스의 포트 번호
파일 적용:
1
kubectl apply -f web-ingress.yaml

6. 외부와 연결하기 (hosts 파일 수정)
마지막으로, 내 컴퓨터의 웹 브라우저가 hello.example.com이라는 도메인을 어디로 찾아가야 할지 알려줘야 한다 인터넷에는 존재하지 않는 주소이므로, 내 컴퓨터의 hosts 파일을 수정하여 직접 지정
명령어의 역할:
hosts파일에<워커노드_IP> hello.example.com라인을 추가하면, 내 컴퓨터는 이 도메인에 대한 요청을 인터넷 DNS에 묻지 않고 지정된 IP로 즉시 보낸다수정 방법:
- 워커 노드 IP 확인:
kubectl get nodes -o wide명령어로 워커 노드 중 하나의INTERNAL-IP를 확인
hosts파일 열기: 관리자 권한으로 파일연다- Linux / macOS:
sudo nano /etc/hosts - Windows: 메모장을 ‘관리자 권한으로 실행’한 후
C:\Windows\System32\drivers\etc\hosts파일 수정
- Linux / macOS:
내용 추가: 파일 맨 아래에 다음 라인을 추가하고 저장
<워커노드_IP>부분은 1번에서 확인한 실제 IP로 변경해야 한다1 2
<워커노드_IP> hello.example.com # 예시: 192.168.56.11 hello.example.com
- 워커 노드 IP 확인:
최종 확인
이제 웹 브라우저를 열고 주소창에 아래 주소를 입력
