데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Kong Ingress Controller for Kubernetes 사용하기

      KIDO 21.05.07
      1,336 9 2

      Kong Ingress Controller for Kubernetes 사용하기

      여기서는 Kong공식 가이드 를 바탕으로 Local 의 Docker Desktop 을 활용하여 Kong Ingress Controller 을 설치하여 API Gateway 서비스를 수행해 볼 것이다.

       

      간단한 REST API POD 생성하기. .

      간단한 REST API Service 작성

      foo.py

      from flask import Flask
      app = Flask(__name__)
       
      @app.route('/foo')
      def hello():
          return '{"msg":"Hello from the foo microservice"}'
       
      if __name__ == "__main__":
          app.run(debug=True, host='0.0.0.0')

      간단하게 Flask 를 활용하여 /foo 엔드포인트에 대해서 JSON 포맷의 메시지를 내려 보내는 API 이다.

       

      Dockerfile 작성하기.

      FROM python:3-alpine
       
      WORKDIR /app
       
      RUN echo "Flask==1.1.1" > requirements.txt
      RUN pip install -r requirements.txt
      COPY foo.py .
       
      EXPOSE 5000
       
      CMD ["python", "foo.py"]

      위와 같이 bar 역시 동일하게 작업한다.

      관련 샘플은 이미 Docker hub에 올라와 있기 때문에 우린 그것을 그대로 이용할 것이다.

       

      Service 배포 하기.

      이제는 Docker desktop K8S 에 Service 를 배포해 보자.

      foo.yaml 을 다음과 같이 작성한다.

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: foo-deployment
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: foo
        template:
          metadata:
            labels:
              app: foo
          spec:
            containers:
            - name: api
              image: digitalronin/foo-microservice:0.1
              ports:
              - containerPort: 5000
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: foo-service
        labels:
          app: foo-service
      spec:
        ports:
        - port: 5000
          name: http
          targetPort: 5000
        selector:
          app: foo

      보는 바와 같이 Deployment 를 우선 작성했다.

      • replicas: 1 오직 하나의 pod 만 실행하도록 했다.
      • image: digital.... 이 부분은 이미 존재하는 Docker Hub 에서 이미지를 가져올 것이다.
      • port: 포트는 5000으로 K8S에 노출할 포트를 서비스에 정의했다.
      • targetPort: 컨테이너 포트 역시 5000 설정했다.
      • 즉, 서비스 타입을 지정하지 않았으므로 ClusterIP 를 통한 연결을 수행한다.

       

      배포

      kubectl apply -f foo.yaml
      kubectl apply -f bar.yaml
      

      foo/bar 2개의 Deployment 를 배포 했다.

       

      테스트하기.

      테스트를 위해서는 port-forward 를 수행해서 테스트 해 볼 것이다.

      kubectl port-forward service/foo-service 5000:5000

      위와 같이 port-forwarding 을 수행했다.

      curl http://localhost:5000/foo
      
      {"msg":"Hello from the foo microservice"}
      

      정상으로 결과가 넘어오는 것을 알 수 있다.

      bar 역시 동일한 방법으로 배포 해 보자.

       

      Install Kong for Kubernetes

      이제는 K8S Ingress Controller 를 설치할 것이다.

      Ingress 는 외부에서 K8S 로 요청을 전달하는 API Gateway 역할을 수행한다. 이를 위해서는 Ingress Controller 가 필요하며, 대표적으로 Ngins Ingress Controller 가 있다.

      우리는 Kong 을 Ingress Controller 로 이용할 것이므로 아래와 같이 Kong Ingress Controller 를 설치할 것이다.

      kubectl create -f https://bit.ly/k4k8s
      

       

      결과보기

      ...
      service/kong-proxy created
      service/kong-validation-webhook created
      deployment.apps/ingress-kong created
      

       

      Check Kong Ingress Controller 정보 살펴보기

      kubectl -n kong get service kong-proxy
      
      NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
      kong-proxy   LoadBalancer   10.107.46.227   localhost     80:30238/TCP,443:31353/TCP   26s
      

       

      Another Objects for Kong Ingress Controller

      이제는 kong 네임스페이스에 설치된 각 객체들을 확인해보자.

      kubectl -n kong get all
      
      NAME                                READY   STATUS    RESTARTS   AGE
      pod/ingress-kong-58b996687d-jxcbl   2/2     Running   0          56s
      
      NAME                              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
      service/kong-proxy                LoadBalancer   10.107.46.227   localhost     80:30238/TCP,443:31353/TCP   56s
      service/kong-validation-webhook   ClusterIP      10.111.61.154           443/TCP                      56s
      
      NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/ingress-kong   1/1     1            1           56s
      
      NAME                                      DESIRED   CURRENT   READY   AGE
      replicaset.apps/ingress-kong-58b996687d   1         1         1       56s
      

      보는 바와 같이 ingress-kong 컨트롤러를 위한 pod가 떠있다.

      서비스는 kong-proxy, kong-validation-webhook 가 떠있다. kong-proxy 는 LoadBalancer임을 알 수 있으며, 우리는 EXTERNAL-IP 를 통해서 접근할 수 있다. localhost 라는 것을 확인할 수 있다.

      제공되는 port 는 80, 443 포트로 접속이 가능하다.

      deployment 는 ingress-kong 이 동작하며, replicaset 역시 ingress-kong-xxx 으로 1개의 pod를 관리함을 알 수 있다.

       

      Kong Ingress Controller 테스트 하기.

      curl http://localhost
      
      {"message":"no Route matched with those values"}
      

      위와 같이 아직 라우트 설정을 하지 않았음을 알 수 있다. 즉 요청에 대해서 처리할 대상을 설정해 주지 않았기 때문이다.

       

      Kong Config 수행하기.

      이제 요청에 대해서, K8S 서비스로 요청을 전달할 수 있도록 Kong 설정을 해보자.

      foo-ingress.yaml

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: foo
        namespace: default
       
      spec:
        ingressClassName: kong
        rules:
        - http:
            paths:
            - path: /foo
              pathType: Prefix
              backend:
                service:
                  name: foo-service
                  port:
                    number: 5000

      apiVersion은 networking.k8s.io/v1 에 있는 버젼을 사용한다.

      kind: Ingress 이므로 우리는 들어오는 요청에 대한 라우팅 정의를 할 것이다.

      rules.http.paths.path: /foo 요청이 /foo로 들어온다면 foo-service 이전에 지정한 서비스로 전달할 것이다.

      해당 서비스는 포트 번호가 5000 이다.

       

      ingress 배포하기.

      kubectl apply -f foo-ingress.yaml
      kubectl apply -f bar-ingress.yaml
      

       

      테스트하기.

      curl http://localhost/foo
      
      {"msg":"Hello from the foo microservice"}
      
      curl http://localhost/bar
      
      {"msg":"Hello from the bar microservice"}
      

       

      Wrap Up

      지금까지 Local Docker Desktop 환경에서 Kong Ingress Controller 를 활용하여, 요청을 적절한 서비스로 라우팅 했다.

      • 우선 간단한 서비스를 만든다.
      • Dockerfile 을 통해서 Docker 이미지를 생성하고, Docker Hub에 등록한다.
      • 등록된 Docker 이미지를 활용하여 Deployment 메니페스트 파일로 K8S에 배포한다.
      • Kong Ingress Controller 를 설치했다. 네임스페이스는 kong 였음을 확인했다.
      • Kong Ingress Config 를 지정하고, 배포를 수행했다.
      • /foo요청은 foo-service 로 요청을 전달하고, /bar요청은 bar-service로 요청을 전달하도록 설정했다.
      • 테스트를 통해서 정상적인 결과를 확인할 수 있게 되었다.

      이렇게 Kong Ingress 로 MSA 의 필수 요소인 API Gateway와 K8S 연동을 해 보았다. 의외로 간단하다는 것을 알 수 있었다.

       

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      KIDO 님의 최신 블로그

      더보기
      동영상 기고하기