본문 바로가기
개발 이야기/Kubernetes

Kubernetes, Ingress 구성 해보기

by 농개 2024. 3. 8.

Ingress는 쿠버네티스 클러스터 외부에서 내부 서비스로 HTTP와 HTTPS 경로를 노출하기 위해 사용합니다.

위 핵심 기능 외에도 Ingress 리소스에 라우팅 규칙을 정의하여 로드밸런서로서의 역할을 할 수도 있습니다.

참고: https://kubernetes.io/ko/docs/concepts/services-networking/ingress/

 

이번 포스팅에서는 Minikube를 통해 Ingress를 설정하는 방법을 정리합니다.

그 전에 Minikube 및 간단한 Service, Deployment는 구성되어 있다고 가정합니다.

 

이전 포스팅👉

1.  Ingress 설치

아래처럼 minikube 명령어를 통해 ingress를 클러스터에 설치해줍니다.

 ~ minikube addons enable ingress
💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.9.4
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
🔎  ingress 애드온을 확인 중입니다 ...
🌟  'ingress' 애드온이 활성화되었습니다

 

그리고 파드를 조회해보면 아래처럼 추가된 것을 확인 할 수 있습니다.

 ~ kubectl get po -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-2lvhc        0/1     Completed   0          36m
ingress-nginx-admission-patch-49b89         0/1     Completed   0          36m
ingress-nginx-controller-7c6974c4d8-krb8c   1/1     Running     0          36m

 

2. 접근 테스트

아래 minikube 명령어로 Ingress-controller를 외부에 노출(NodePort) 시키고

접근 가능한 포트를 확인 할 수 있습니다.

minikube service ingress-nginx-controller -n ingress-nginx --url
http://127.0.0.1:49123
http://127.0.0.1:49124

위처럼 정상 접근 되는 것을 확인 할수 있습니다.

 

하지만 아무런  라우팅 정의를 하지 않아서

nginx default 404 페이지가 뜹니다.

 

이제 라우팅을 정의하여 실제 Service 및 파드와 연결해보겠습니다.

 

3. Ingress.yml 작성

아래와 같이 ingress.yml을 작성해줬습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    # - host: my.domain.com # if it is not configure, connect with ip address.
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: springboot-app-svc
                port: 
                  number: 8080

어노테이션을 봅시다.

  • nginx.ingress.kubernetes.io/rewrite-target: /

nginx 서버 라우팅 정의에서 rewrite를 사용하고 있습니다.

이러한 어노테이션은 다양한 종류가 있을 것입니다.

참고: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md

위 캡쳐와 같이 쿠버네티스에서 nginx 관련 설정을

어노테이션을 사용 할 수 있도록 지원하고 있습니다.

 

그리고 spec.rules 항목에는

실제 라우팅 정의 항목을 기입하고 있습니다.

http://{호스트}/ 에 대한 request를 springboot-app-svc 백엔드 서비스로 프록시 해주고 있습니다.

그리고 pathTypeprefix로 명시해줬기 때문에 /** 패턴의 URL Path 요청을 모두 프록시 할 것입니다.

pathType 또한 여러가지 형태를 지원합니다.

  • Prefix
  • Exact
  • ImplementationSpecific

자세한 내용은 공식문서에서 확인 가능합니다.

 

4. Ingress  적용

아래와 같이 kubectl 명령어로 Ingress 리소스를 적용해봅시다.

 ~ kubectl apply -f ingress.yml
ingress.networking.k8s.io/nginx-ingress created

 

이 후 다시 minikube service ingress-nginx-controller -n ingress-nginx --url 를 통해

포트 확인 합니다.

 

아래와 같이 접근해보면 정상적으로 클러스터 내 백엔드 서비스로 프록시 되고

정상 응답이 오는 것을 확인 할 수있습니다.