Ingress 사용하기



Kubernetes 를 통해서 Service 를 생성하면, 기본적으로 NodePort 방식으로 만들어집니다.

이 경우 서비스에 접근하기 위해서는 http://{IP}:{NodePort} 형태로 해야하지요.


실제로 서비스하기에는 부적접한 url 입니다.

http://{service.domain.com} 형태로 서비스에 접근하려면 어떻게 해야 할까요?




Nginx-Ingress 설치하기



이를 Ingress Controller 를 설치해 주어야 합니다.

Ingress Controller 를 구현한 것들이 여러개 있습니다.


궁금하시다면 아래 주소를 확인해 주세요

https://github.com/kubernetes/ingress-nginx/blob/master/README.md


그 중에서 제일 많이 쓰이고, 권장하는 nginx ingress 를 사용하도록 하겠습니다.

공식 주소는 다음과 같습니다.

https://kubernetes.github.io/ingress-nginx/


그리고 github 는

https://github.com/kubernetes/ingress-nginx/blob/master/README.md

입니다.



아무튼 설치방법은 간단합니다.


kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml


이렇게 설치하면 됩니다.


기본적으로 kubernetes 의 ingress-nginx 라는 네임스페이스에 서비스가 생깁니다.

이런 형태로요.




만약 서비스가 생성되지 않았다면, 아래처럼 서비스를 생성 해 줍니다.


kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
  - name: port-1
    port: 80
    targetPort: 80
  - name: port-2
    port: 443
    targetPort: 443

[ingress-nginx-service.yaml]



kubectl apply -f ingress-nginx-service.yaml







Nginx-Ingress 에 대한 Service 수정하기



앞에서 만들어진 nginx-ingress 는 domain 이 들어왔을때, 이것을 서비스에 redirect 해 주는게 전부입니다.

실제로 아래처럼 bash 에 접근한 뒤에, nginx.conf 를 열어보면 설정한 것이 들어가 있습니다.


kubectl get pods -n ingress-nginx

kubectl -n ingress-nginx exec -it nginx-ingress-controller-12345 /bin/bash

# cat /etc/nginx/nginx.conf



지금 상태에서는 반쪽짜리 ingress 입니다.

어찌되었든 nginx-ingress 에 접근한 뒤에, 하위 path 를 통해서 서비스를 접근해야 한다는 것이죠.

아래와 같은 형태가 되겠습니다.



http://{IP}:{Nginx-Ingress Service Port}/server1

http://{IP}:{Nginx-Ingress Service Port}/server2

http://{IP}:{Nginx-Ingress Service Port}/server3


뭔가 거지같죠?

이를 해결하기 위해서 Nginx-Ingress 의 service 를 수정해 주어야 합니다.


기본적으로 Kubernetes 의 Service 는 type 이 NodePort 로 되어 있습니다.

이것을 아래와 비슷하게 수정해 줍니다.




핵심은 
1. "type": "NodePort" 를 "ClusterIP" 로 바꿉니다.
2. 각 ports 에서 "ServicePort" 를 지웁니다.
3. "externalIPs": [ "IP주소" ] 를 추가시킵니다.

여기서 "IP주소" 란 Kubernetes Master 의 IP 주소입니다.






Service 의 Ingress 만들기



이제 도메인과 Path 를 통한 Ingress 를 사용할 수 있게 되었습니다.

확인해 보죠.


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: test.crystalcube.co.kr
      http:
        paths:
          - backend:
              serviceName: test1-service
              servicePort: 3000
            path: /

test-service 라는 이름의 서비스가 있을때, 이것에 대한 ingress 는 위 처럼 만들수 있습니다.

이제 test.crystalcube.co.kr 주소를 입력하면, test-service 에 접근할 수 있습니다.


물론 path 를 지정할 수도 있습니다. :)