본문으로 건너뛰기

인그레스 컨트롤러 배포

인그레스(Ingress) 는 클러스터 외부에서 내부 서비스로 들어오는 네트워크를 처리하며, 인그레스 컨트롤러는 인그레스 리소스에 정의된 규칙에 따라 클러스터 외부에서 클러스터 내부 서비스로 HTTP와 HTTPS 경로를 노출합니다. 인그레스에 대한 자세한 설명은 Kubernetes 공식 문서를 참고하시기 바랍니다. 클러스터에 인그레스 컨트롤러를 설정하고 배포하는 방법은 다음과 같습니다.

안내

본 가이드는 인그레스 컨트롤러를 배포하는 예시를 설명하는 가이드로, Kubernetes Engine 서비스는 인그레스 컨트롤러의 지원을 포함하지 않습니다. 인그레스 컨트롤러의 선택 및 배포, 운영은 사용자의 재량에 따릅니다.

Step 1. 사전 작업

인그레스 컨트롤러를 설정 및 배포하기 위해서는 다음의 사전작업이 필요합니다.

  1. 인그레스 컨트롤러를 배포할 클러스터를 생성합니다.

  2. 생성한 클러스터에 인그레스 컨트롤러 배포 명령을 보내기 위한 kubectl 제어 설정을 수행합니다.

Step 2. 인그레스 컨트롤러 배포

오픈소스 Nginx 기반의 인그레스 컨트롤러를 배포합니다.

안내

현재 Kubernetes Engine 서비스에서는 Kubernetes Engine의 Admission Webhook을 지원하지 않습니다. Admission Webhook 설정된 서비스를 배포하려면 hostNetwork: true 설정이 필요합니다.

YAML 파일로 인그레스 컨트롤러 배포

다음의 명령어를 터미널에 입력하여 ingress-nginx를 클러스터에 배포합니다. ingress-nginx에 대한 네임스페이스와 서비스 등 리소스들이 한 번에 배포됩니다. 해당 ingress-nginx 예제 파일은 Deployment 명세에 hostNetwork: true 설정을 한 커스텀 예제입니다.

hostNetwork: true 설정한 커스텀 예제
kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/kakaoicloud-guide/kubernetes-engine/main/guide-samples/settingIC/ingress-nginx/controller-v1.3.1/deploy.yml

Helm을 사용하여 인그레스 컨트롤러 배포

쿠버네티스 패키지 관리 도구인 Helm을 사용하여 인그레스 컨트롤러를 배포합니다.

  1. 인그레스 컨트롤러를 설치하기 전, Helm client를 설치합니다. 운영체제별 Helm 설치에 대한 자세한 설명은 Helm 공식 문서 > 헬름 설치하기를 참고하시기 바랍니다.

  2. 다음의 명령어를 실행하여 공식 ingress-controller Helm chart repository를 추가합니다.

    Helm chart repository 추가 명령어
    $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    "ingress-nginx" has been added to your repositories
    $ helm repo update
    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈Happy Helming!
  3. 다음의 명령어를 터미널에 입력하여 ingress-nginx를 클러스터에 배포합니다. ingress-nginx에 대한 네임스페이스와 서비스 등 리소스들이 한 번에 배포됩니다.

    • 해당 인그레스 컨트롤러 예제 파일은 Deployment명세에 hostNetwork: true설정을 한 커스텀 예제입니다.

    hostNetwork: true 설정한 커스텀 예제
     $ helm install ingress-nginx ingress-nginx/ingress-nginx \
    --version 4.2.5 \
    --set controller.hostNetwork=true \
    --namespace ingress-nginx --create-namespace

    NAME: ingress-nginx
    LAST DEPLOYED: Tue Mar 14 06:51:47 2023
    NAMESPACE: ingress-nginx
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the LoadBalancer IP to be available.
    You can watch the status by running 'kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller'

Step 3. 인그레스 컨트롤러 배포 확인

  1. 인그레스 컨트롤러가 정상적으로 배포되었는지 확인하기 위해 다음의 명령어를 터미널에 입력하고 파드의 상태를 관찰합니다. 이때 ingress-controller 파드가 정상적으로 실행되는지 확인합니다.
    • ingress-controller 파드가 running 상태로 실행되고 있다면 Ctrl+C 키를 눌러서 명령을 취소합니다.

      파드 정상 실행 확인
      kubectl --kubeconfig=$KUBE_CONFIG get pods -n ingress-nginx \
      -l app.kubernetes.io/name=ingress-nginx --watch
      실행 결과
      NAME                                        READY   STATUS      RESTARTS   AGE
      ingress-nginx-admission-create-r7v2q 0/1 Completed 0 30s
      ingress-nginx-admission-patch-v7dmf 0/1 Completed 1 30s
      ingress-nginx-controller-74fd5565fb-6gv9g 1/1 Running 0 30s
  2. 생성된 ingress-controller 리소스를 확인합니다.

Step 4. 인그레스 컨트롤러 엔드포인트 확인

인그레스 컨트롤러 YAML을 배포하면 인그레스 컨트롤러 서비스를 위한 로드밸런서가 함께 생성됩니다. 생성된 로드밸런서의 IP를 통해 인그레스 서비스를 오픈할 수 있습니다.

  1. 다음의 명령어를 실행하여 ingress-nginx 서비스를 확인합니다.

    ingress-nginx 서비스 확인
    kubectl --kubeconfig=$KUBE_CONFIG get svc -n ingress-nginx
  2. 실행 결과에서 ingress-nginx-controller의 EXTERNAL-IP를 확인합니다. EXTERNAL-IP는 이후 Ingress 객체를 만들어서 오픈하는 서비스의 엔드포인트가 됩니다.

    • 하단의 예제에서는 EXTERNAL-IP10.187.5.42임을 확인할 수 있습니다.

      실행 결과
      NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
      ingress-nginx-controller LoadBalancer 10.109.189.56 10.187.5.42 80:30391/TCP,443:30000/TCP 86s
      ingress-nginx-controller-admission ClusterIP 10.99.111.97 <none> 443/TCP 86s

인그레스 컨트롤러로 생성된 로드밸런서에 공인 IP 설정하기

  • 인그레스 컨트롤러를 배포하여 생성된 로드밸런서의 외부 통신이 필요할 경우, 해당 로드밸런서의 공인 IP 사용 여부를 설정할 수 있습니다.

    • 다음의 명령어를 실행하여 인그레스 컨트롤러를 배포해 생성된 로드밸런서 타입 서비스를 확인합니다.
    로드밸런서 타입 서비스 확인
    kubectl --kubeconfig=$KUBE_CONFIG get svc -n ingress-nginx ingress-nginx-controller
  • 로드밸런서 타입 Service 객체의 metadata.annotations 하위 service.beta.kubernetes.io/openstack-internal-load-balancer 값을 설정하여 로드밸런서의 공인 IP 사용을 설정합니다.

    • 사설 IP를 갖는 로드밸런서를 생성하려면 값을 true로 설정 (기본값)
    • 공인 IP를 갖는 로드밸런서를 생성하려면 값을 false로 설정
안내

로드밸런서 상세 옵션에 대한 자세한 내용은 로드밸런서 생성 및 삭제 > 부록. 로드밸런서 상세 옵션 설정하기 문서를 참고하시기 바랍니다.

주의
  • service.beta.kubernetes.io/openstack-internal-load-balancer 설정값에 따라, 로드밸런서의 공인 IP가 새로운 공인 IP를 생성하여 연결 또는 연결 해제됩니다. false로 설정하여 로드밸런서에 사용한 공인 IP가 있었다면, 이후 true로 설정값을 변경하여도 공인 IP 연결 해제 상태가 되어 공인 IP 과금 대상에 포함되니 유의해 주세요.
  • Kubernetes Engine 로드밸런서에 사용한 공인 IP 삭제는 카카오클라우드 콘솔의 VPC 메뉴의 퍼블릭 IP 메뉴에서 가능합니다. 자세한 설명은 퍼블릭 IP 생성 및 관리를 참고하시기 바랍니다.