Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Low Level #3] Service 및 Ingress를 활용한 외부 트래픽 라우팅

ygtoken 2025. 3. 16. 18:53
728x90

 

쿠버네티스에서 애플리케이션을 외부에 노출하려면 Service와 Ingress를 올바르게 설정해야 합니다.

이 글에서는 ClusterIP, NodePort, LoadBalancer 유형의 Service를 활용하여 트래픽을 라우팅하는 방법과, Ingress를 이용한 도메인 기반 라우팅 적용 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. ClusterIP, NodePort, LoadBalancer를 이용한 트래픽 노출 방법

2. Ingress를 활용하여 도메인 기반 라우팅 적용

3. Ingress TLS 설정을 통한 HTTPS 적용

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ ClusterIP, NodePort, LoadBalancer를 이용한 트래픽 노출 방법

 

❓ 문제 상황

 

운영팀에서 애플리케이션을 외부에서 접근할 수 있도록 서비스 유형을 설정해야 합니다.

ClusterIP, NodePort, LoadBalancer를 활용하여 적절한 트래픽 노출 방법을 선택해야 합니다.

서비스 이름: web-service

노출할 포트: 80 -> 8080

ClusterIP: 내부에서만 접근 가능

NodePort: 외부에서 특정 노드의 포트로 접근 가능

LoadBalancer: 클라우드 환경에서 공인 IP를 부여하여 외부 접근 가능

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. 각각의 서비스 유형에 맞게 Service 리소스를 생성합니다.

 

2. kubectl을 사용하여 서비스가 정상적으로 생성되었는지 확인합니다.

 


✅ 정답 Manifest (Service 생성 - ClusterIP, NodePort, LoadBalancer)

 

🔹 ClusterIP (내부 접근)

apiVersion: v1
kind: Service
metadata:
  name: web-service-clusterip
spec:
  type: ClusterIP  # 내부 네트워크에서만 접근 가능
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80  # Service가 받을 포트
    targetPort: 8080  # Pod 내부 포트

 

🔹 NodePort (외부 접근)

apiVersion: v1
kind: Service
metadata:
  name: web-service-nodeport
spec:
  type: NodePort  # 특정 노드의 포트로 외부 접근 허용
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080  # 외부에서 접근할 포트 (30000-32767 범위)

 

🔹 LoadBalancer (외부 접근)

apiVersion: v1
kind: Service
metadata:
  name: web-service-loadbalancer
spec:
  type: LoadBalancer  # 공인 IP 부여하여 외부에서 접근 가능
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

 

 


📌 적용 후 예상 결과 값

 

1. Service 목록 확인

kubectl get svc

 

💡 예상 출력 값

NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
web-service-clusterip    ClusterIP      10.96.120.12    <none>        80/TCP         5s
web-service-nodeport     NodePort       10.96.120.14    <none>        80:30080/TCP   5s
web-service-loadbalancer LoadBalancer   10.96.120.20    <pending>     80/TCP         5s

 

2. NodePort를 통해 외부에서 접근 테스트

curl http://<노드 IP>:30080

 

💡 예상 출력 값

<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
<body>
<h1>Success!</h1>
</body>
</html>

 

 


2️⃣ Ingress를 활용하여 도메인 기반 라우팅 적용

 

❓ 문제 상황

 

운영팀에서 하나의 LoadBalancer를 여러 서비스가 공유할 수 있도록 Ingress를 설정해야 합니다.

/app1 요청은 app1 서비스로, /app2 요청은 app2 서비스로 전달되도록 해야 합니다.

도메인: example.com

/app1app1-service

/app2app2-service

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Ingress 리소스를 생성하여 요청을 올바른 서비스로 전달하도록 설정합니다.

 

2. kubectl을 사용하여 Ingress가 정상적으로 동작하는지 확인합니다.

 


✅ 정답 Manifest (Ingress 생성 - 도메인 기반 라우팅 적용)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: example.com  # 도메인 지정
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 80
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80

 

 


📌 적용 후 예상 결과 값

 

1. Ingress 리소스 확인

kubectl get ingress

 

💡 예상 출력 값

NAME          CLASS    HOSTS          ADDRESS         PORTS   AGE
web-ingress   nginx    example.com    192.168.1.100   80      5s

 

2. 도메인 기반 라우팅 테스트

curl -H "Host: example.com" http://192.168.1.100/app1

 

💡 예상 출력 값

Welcome to App1!
curl -H "Host: example.com" http://192.168.1.100/app2

 

💡 예상 출력 값

Welcome to App2!

 

 


3️⃣ Ingress TLS 설정을 통한 HTTPS 적용

 

❓ 문제 상황

 

운영팀에서 보안 강화를 위해 HTTPS를 적용해야 합니다.

Ingress에 TLS 인증서를 설정하여 HTTPS 트래픽을 지원해야 합니다.

TLS 인증서 Secret 이름: web-tls

HTTPS 포트로만 접속 가능해야 함

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. TLS 인증서를 Secret으로 생성합니다.

 

2. Ingress 리소스에서 TLS를 적용합니다.

 


✅ 정답 Manifest (Ingress에 TLS 적용)

 

🔹 TLS 인증서 Secret 생성

kubectl create secret tls web-tls --cert=cert.pem --key=key.pem

 

🔹 Ingress 리소스에서 TLS 적용

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress-tls
spec:
  tls:
  - hosts:
    - example.com
    secretName: web-tls  # TLS 인증서 Secret 적용
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

 

 


📌 적용 후 예상 결과 값

 

1. Ingress 리소스 확인

kubectl get ingress

 

💡 예상 출력 값

NAME             CLASS    HOSTS          ADDRESS         PORTS     AGE
web-ingress-tls  nginx    example.com    192.168.1.100   80, 443   5s

 

2. HTTPS 요청 테스트

curl -k https://example.com

 

💡 예상 출력 값

Welcome to Secure Web!

 

728x90