ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클라우드: 쿠버네티스 인그레스(Ingress) 실습하기(feat.minikube)
    K8S 2021. 5. 3. 16:57

    이번 포스팅은 쿠버네티스의 Ingress obejct에 대해 다룬다. 

     

    이전에 다루었던 Nodeport service는 외부의 트래픽을 그냥 받아들였다면 

    이번에 사용해볼 Ingress는 외부의 트래픽을 어떻게 처리할 것인지 결정한다. 

     

    인그레스 오브젝트가 담당할 수 있는 기능은 크게 다음과 같은 것들이 있다.  

     

    1. 라우팅

    2. 도메인처리

    3. SSL/TLS 보안처리 

     

     

    그리고 이번 실습은 라우팅만 사용해보면서 인그레스에 대한 감을 익힌다. 

     

    참고로 필자는 미니큐브를 이용하여 인그레스를 사용하고 다음과 같은 구조로 nginx를 배포할 것이다. 

     

    구조에 대해 간략하게 설명하자면 

    클러스터에서 외부의 트래픽을 제일 처음으로 받는 서버는 인그레스 컨트롤러 서버이다. 

     

    그리고 우리는 인그레스 컨트롤러 서버에 원하는 인그레스 규칙을 적용하고, 

    규칙에 맞는 트레픽이 들어왔을 때 그 규칙에 해당하는 서비스의 엔드포인트로 트래픽을 전송하고 이를 파드에서 처리할것이다. 

     

    (참고로 서비스를 통해 트래픽을 직접 전송하는것이 아니고 인그레스에서 서비스의 엔드포인트를 확인하고,

    엔드포인트로 직접 보낸다.)

     

     

     

    실습하기전, 위 구조를 보면 인그레스 없이 서비스만을 이용해도 충분할 것 같은데? 라는 생각이 들 수도 있다. 

     

    하지만 결론적으로 말하면 그렇지 않다. 다음 예시를 생각해보자

     

    내가 배포하고 싶은 어플리케이션이 3개의 디플로이먼트가 필요하다고 할때

    나는 3개의 서비스를 생성해서 각 디플로이먼트에 하나씩 연결해준다. 

    이러한 방식이 잘 동작할 것 같지만

    각 서비스마다 세부적인 설정을 해줘야 할 뿐만아니라 추가적인 복잡성이 증가한다. 

    (각 서비스에 대한 url을 다르게 처리하는 등)

     

    하지만 인그레스를 이용하면 각각의 서비스로 라우팅할 수 있는 url하나만 있어도 되며

    규칙을 추가함으로써 손쉽게 원하는 동작을 재현해 낼 수 있다. 

     

     

     

     

    < 실습하기 >

     

    minikube에서 ingress-nginx controller서버를 지원하므로 이를 사용한다.  

     

    minikube를  start해준 후, NGINX Ingress controller를 사용할 수 있게끔 설정한다. 

     

    minikube addons enable ingress

     

     

    이후 nginx ingress controller가 제대로 설치되었는지 확인한다.

     

    새로 생성된 포드와 서비스는 ingress-nginx namespace에서 생성된다. 

     

     

     

     

    ingrss nginx controller를 생성하면서 따로 nodeport 타입의 서비스가 생성되며

    외부와 Nginx 컨트롤러 서버를 연결해주는 역할을 한다. 

     

     

    즉, 외부에서 접근할때 30966번 포트로 접근할 수 있다. 

     

     

     

    이제 ingress-nginx server에 적용할 나의 ingress object를 apply 해준다.

     

    <ingress-example.yaml>

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - http:
          paths:
          - path: /echo-hostname
            backend:
              serviceName: hostname-service
              servicePort: 80
    

     

    - spec.rules.http.paths.path : /echo-hostname

    /echo-hostname이라는 경로로 요청이 들어올 때 hostname-service의 80번 포트로 연결해준다.

    여기서 80번 포트는 클러스터 내부에서만 사용되는 포트이다.  

     

     

     

    다음은 사용될 디플로이먼트 

     

    <hostname-deployment.yaml>

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hostname-deployment
    
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: hostname-service-label
    
      template:
        metadata:
          labels:
            app: hostname-service-label
    
        spec:
          containers:
            - name: hostname-service-container
              image: alicek106/ingress-annotation-test:0.0
              ports:
              - name: flask-port
                containerPort: 5000
              imagePullPolicy: Always
    

     

     

     

    다음은 위의 디플로이먼트에 대한 서비스 

     

    <hostname-service.yaml>

     

    apiVersion: v1
    kind: Service
    metadata:
      name: hostname-service
    
    spec:
      ports:
        - name: http
          port: 80
          targetPort: flask-port
      selector:
        app: hostname-service-label
    
      type: NodePort
    

     

    NodePort 타입의 서비스로 만들며 내부 포트는 80번포트를 사용한다. 

    참고로 외부에서의 접근이 필요없다면 clusterip 타입으로 사용해도 무관하다.

     

     

    kubectl apply -f ingress-example.yaml
    kubectl apply -f hostname-deployment.yaml
    kubectl apply -f hostname-service.yaml

     

     

     

    hostname-service와 연결된 포드들 

     

     

    Ingress-nginx-controller 서비스는 ingress controller 서버를 엔드포인트로 한다. 

     

     

     

    이후 설정한 인그레스 규칙이 잘 적용되는지 확인한다. 

     

    1) 잘못된 규칙을 접속했을 때 

     

    잘못된 규칙으로 접속하면 404에러가 발생한다. 

     

     

     

    2) 올바른 규칙으로 접근했을 때 

     

    ingress-example.yaml에서 /echo-hostname으로 접속할 때 특정 서비스로 보내는 

    규칙을 추가했으므로 /echo-hostname으로 접속한다. 

     

    다음과 같이 잘 접속이 되며 접속할 때마다 다른 포드들로 접속되는 것을 알 수 있다. 

     

    - 컨테이너1 

    - 컨테이너2 

    - 컨테이너3

     

     

     

     

     

     

    반응형

    댓글

Designed by Tistory.