쿠버네티스 서비스와 인그레스 이해하기

쿠버네티스 서비스와 인그레스 이해하기


서론


쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 쿠버네티스를 활용하여 다양한 애플리케이션을 효율적으로 운영하려면 서비스(Service)와 인그레스(Ingress)에 대한 이해가 필수적입니다. 서비스는 파드(Pod) 간의 네트워크 연결을 제공하고, 인그레스는 외부 트래픽을 클러스터 내부의 서비스로 라우팅하는 데 사용됩니다. 이번 포스팅에서는 서비스와 인그레스의 개념과 설정 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


쿠버네티스 서비스 개념


서비스란 무엇인가?


서비스는 쿠버네티스 클러스터 내에서 실행되는 파드 집합에 대한 네트워크 접근을 제공하는 추상화된 개념입니다. 파드는 동적으로 생성되고 삭제되기 때문에, 서비스는 안정적인 네트워크 엔드포인트를 제공하여 파드의 IP 주소 변화에 영향을 받지 않도록 합니다. 서비스는 클러스터 내부와 외부에서 접근할 수 있는 방법을 모두 제공합니다.


서비스의 주요 유형


쿠버네티스 서비스에는 여러 유형이 있으며, 각 유형은 다양한 사용 사례에 적합합니다.


  1. 클러스터IP (ClusterIP): 기본 서비스 유형으로, 클러스터 내부에서만 접근할 수 있는 내부 IP 주소를 제공합니다.
  2. 노드포트 (NodePort): 각 워커 노드의 포트를 통해 외부에서 접근할 수 있도록 설정합니다.
  3. 로드밸런서 (LoadBalancer): 클라우드 서비스 제공업체의 로드 밸런서를 통해 외부 트래픽을 분산시킵니다.
  4. 헤드리스 서비스 (Headless Service): 로드 밸런싱 없이 파드의 IP 주소를 직접 노출합니다.

서비스 설정 방법


다음은 Nginx 웹 서버를 노출하는 ClusterIP 유형의 서비스를 설정하는 YAML 파일 예시입니다.


apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

이 YAML 파일을 사용하여 서비스를 생성하려면 다음 명령어를 실행합니다.


kubectl apply -f nginx-service.yaml

이 명령어를 실행하면 nginx-service라는 이름의 서비스가 생성되고, 클러스터 내부에서 nginx 라벨을 가진 파드로 트래픽을 전달합니다.


쿠버네티스 인그레스 개념


인그레스란 무엇인가?


인그레스는 클러스터 외부에서 내부 서비스로의 HTTP 및 HTTPS 트래픽을 관리하는 쿠버네티스 리소스입니다. 인그레스는 경로 기반 라우팅을 지원하여, 특정 URL 패턴에 따라 트래픽을 다른 서비스로 라우팅할 수 있습니다. 인그레스를 사용하면 클러스터 내부의 여러 서비스에 대한 접근을 하나의 외부 IP 주소로 통합할 수 있습니다.


인그레스 컨트롤러


인그레스를 사용하려면 인그레스 컨트롤러가 필요합니다. 인그레스 컨트롤러는 인그레스 리소스를 모니터링하고, 트래픽을 적절한 서비스로 라우팅합니다. 대표적인 인그레스 컨트롤러로는 Nginx, Traefik, HAProxy 등이 있습니다.


인그레스 설정 방법


다음은 Nginx 인그레스 컨트롤러를 사용하여 인그레스를 설정하는 YAML 파일 예시입니다.


  1. 인그레스 컨트롤러 설치

Nginx 인그레스 컨트롤러를 설치합니다.


kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

  1. 인그레스 리소스 설정

다음은 인그레스 리소스를 설정하는 YAML 파일 예시입니다.


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

이 YAML 파일을 사용하여 인그레스를 생성하려면 다음 명령어를 실행합니다.


kubectl apply -f example-ingress.yaml

이 명령어를 실행하면 my-app.example.com 도메인으로 들어오는 HTTP 트래픽이 nginx-service로 라우팅됩니다.


서비스와 인그레스의 활용 예


애플리케이션 배포 시나리오


다음은 Nginx 웹 서버 애플리케이션을 배포하고, 서비스와 인그레스를 통해 외부에서 접근할 수 있도록 설정하는 예시입니다.


  1. Nginx 디플로이먼트 설정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

  1. Nginx 서비스 설정

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

  1. Nginx 인그레스 설정

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: nginx.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

위의 YAML 파일들을 사용하여 디플로이먼트, 서비스, 인그레스를 차례로 생성합니다.


kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml

이렇게 설정하면 nginx.example.com 도메인으로 들어오는 트래픽이 Nginx 웹 서버로 라우팅됩니다.


고급 인그레스 설정


TLS 설정


인그레스를 통해 HTTPS 트래픽을 처리하려면 TLS 설정을 추가해야 합니다. 이를 위해서는 인증서와 비밀(Secret)을 생성하고, 인그레스 리소스에 이를 참조해야 합니다.


  1. TLS 비밀 생성

kubectl create secret tls example-tls --cert=path/to/tls.crt --key=path/to/tls.key

  1. TLS 인그레스 설정

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
spec:
  tls:
  - hosts:
    - nginx.example.com
    secretName: example-tls
  rules:
  - host: nginx.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

이 YAML 파일을 사용하여 인그레스를 생성하면, nginx.example.com 도메인으로 들어오는 HTTPS 트래픽이 Nginx 서비스로 라우팅됩니다.


서비스와 인그레스의 모니터링 및 디버깅


서비스 모니터링


서비스의 상태를 모니터링하려면 다음 명령어를 사용합니다.


kubectl get services
kubectl describe service nginx-service

kubectl describe 명령어를 사용하여 서비스의 상세 정보를 확인할 수 있습니다.


인그레스 모니터링


인그레스의 상태를 모니터링하려면 다음 명령어를 사용합니다.


kubectl get ingress
kubectl describe ingress nginx-ingress

kubectl describe 명령어를 사용하여 인그레스의 상세 정보를 확인하고, 설정이 올바른지 확인할 수 있습니다.


로그 확인


인그레스 컨트롤러의 로그를 확인하여 문제를 디버깅할 수 있습니다.


kubectl logs -n ingress-nginx deploy/controller

이 명령어를 사용하여 Nginx 인그레스 컨트롤러의 로그를 확인할 수 있습니다.


결론


쿠버네티스에서 서비스와 인그레스를 이해하고 설정하는 것은 애플리케이션 배포와 운영의 핵심 요소입니다. 서비스는 파드 간의 안정적인 네트워크 연결을 제공하고, 인그레스는 외부 트래픽을 클러스터 내부의 서비스로 라우팅합니다. 이번 포스팅에서는 서비스와 인그레스의 개념, 설정 방법, 그리고 다양한 활용 예시를 통해 초보자도 쉽게 이해할 수 있도록 설명했습니다. 이를 바탕으로 쿠버네티스 클러스터에서 효과적으로 애플리케이션을 운영할 수 있기를 바랍니다.

다음 이전