새소식

Kubernetes

[Cloud Compute] Kubernetes 구축하기 - 6. Ingress 적용하기

  • -

지난 시간 nginx를 배포했을 때, NodePort를 이용해 외부에서 접근할 수 있었다.

쉽게 접근할 수 있는 방법이지만 문제가 있다.

 

1. 가용포트범위가 한정적이다.(기본설정 기준)

알다시피 기본설정에서는 30000-32767의 범위만 사용할 수 있다. 

 

2. 관리가 불편해진다.

클러스터 내 각 Node는 해당 포트를 서비스로 프록시한다.

모든 Node에서 동일한 포트 번호가 사용된다는 것으로 사용자 스스로 포트 충돌의 가능성을 고려해야 한다는 의미이다.

 

물론 자유롭게 자체 로드 밸런싱 솔루션을 설정할 수 있는 장점 또한 존재한다.

 

중점은 진입구간이 너무 따로 논다는 것에 있다.

그래서 이런 진입구간을 모아서 Reverse-Proxy 처럼 서비스에 진입할 수 있게 해주는 것이 Ingress다.

 

1. Ingress 정의

Ingress는 서비스에 대한 외부 접근을  관리하는 리소스로 HTTP(S)을 관리할 수 있다.

로드밸런싱, TLS/SSL  인증, 이름-기반의 가상 호스팅을 사용할 수 있다.

 

 

 

2. Ingress 구현

Ingress를 사용하기 위해서는 리소스와 컨트롤러를 설치해야 한다.

Ingress 리소스는 표지판과 같이 어떤 경로가 어떤 서비스에 연결될지 적혀있는 것이고,

이 규칙을 실제로 실행하는 것이 컨트롤러이기 때문에 컨트롤러의 설치는 필수다.

컨트롤러의 종류는 다양하니 공식문서를 참조하자.

여기서는 기본적인 Ingress-nginx 컨트롤러를 사용하는 Ingress를 구현할 것이다.

 

1. 컨트롤러 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/baremetal/deploy.yaml

 

명령어를 실행하면 아래와 같이 많은 것이 설치되는 것을 볼 수 있다.

 

 

Ingress-nginx 컨트롤러를 설치하면 Namespace ingress-nginx 가 생성되며 그곳을 통해 필요한 리소스들이 생성된다.

이제 단일 진입점이 생겼기 때문에 확인해보자

 

2. Ingress 포트 확인

kubectl get svc,ep -n ingress-nginx

 

 

ingress-nginx 네임스페이스를 지정해서 endpoint를 확인해보자

service/ingress-nginx-controller 의 PORT를 보면 80:31210, 443:31679 라고 되어있다.

HTTP(S) 프로토콜 타입에 따라 사용하는 NodePort인데 이곳을 통해 이름기반 가상호스팅이 이루어질 것이다.

 

 

3. Ingress 규칙 생성

먼저 리소스 템플릿을 확인해보자.

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

내용이 은근히 길지만 구성은 심플하다.

rules속성에 나열한 규칙목록에 따라 진입경로가 달라진다.

  • http : http 프로토콜로 처리됨을 알려준다
  • paths: http 프로토콜을 사용하는 진입경로목록이다
  • path: 진입경로로 이 값을 통해 가상호스팅이 이루어진다.
  • pathType: 경로 유형은 공식문서로 확인하자. 유형에 따라 subPath에 대한 처리가 달라지니 유의하자.
  • backend: Request가 전달될 백엔드를 정의한다.

이하 내용은 쉽기 때문에 skip.

 

정리하면 URL 경로가    /  로 시작하는 HTTP 요청을 받으면 해당 요청을 nginx-service라는 이름의 서비스의 80번 포트로 전달하는 Ingress 리소스를 정의한 것이다.

 

리소스를 생성해보자

kubectl create -f ingress.yaml

 

 

리소스를 생성하는데 오류가 발생했다.

이 오류는 리소스 validatingwebhookconfiguration/ingress-nginx-admission 에서 유효성 검증을 진행해야하는데 통신 문제가 있어 진행이 되지 않아서 발생한다. 

 

일반적인 해결법은 제거하여 유효성 검증을 배제하고 진행하는 것이다.

kubectl delete validatingwebhookconfiguration ingress-nginx-admission

 

 

이렇게 제거하고 난 후 다시 배포를 해보자

 

 

이번에는 오류없이 생성되었다. 상세설명도 봐보자

 

kubectl describe ingress test-ingress

 

 

Path / 에 nginx-service가 연결되어있는 것을 확인할 수 있다.

 

3. Ingress 테스트

NodePort를 통해 구현되기 때문에 현재 ingress-controller가 설치되어 있는 node의 ip를 통해 접근하면 된다.

2-2를 통해 알 수 있던 HTTP의 외부포트 31210으로 접속했더니 nginx가 반갑게 맞이한다!

드디어 다양한 경로, 경로 유형을 이용해 많은 어플리케이션과 편하게 통신할 수 있게 되었다!


시리즈를 마치며

사실 빅테크들의 클라우드 서비스로 Kubernetes를 구축하는 것이 더할나위없이 편하지만 금액적인 부분도 간과할 수는 없는 법이다.

지금 회사도 여유롭다고는 못하는 상황이라 지원받은 서버에 구축하여 사용하고 있다.

필요에 의해 Kubernetes를 도입하게 되었지만 혼자서 구축해야 되는 상황에 여러 문제들을 직면했었다.

이 글에도 초기 구축단계에 그런 부분들이 꽤나 녹아들어있다.

혹시나 서버를 옮겨야되면 다시 구축해야 될 수도 있어 빠르고 안정적으로 구축할 수 있게 따라가기만 하면 되는 메뉴얼을 적어가며 구축했던 기억이 새록새록 떠오른다.

 

이 시리즈가 많은 사람들에게 도움이 되기를 바란다.

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.