IBM Cloud Docs
Ingress 설정

Ingress 설정

Ingress 리소스를 작성하여 Ingress 컴포넌트를 구성하고, 라우팅 요청에 대한 규칙을 정의하고, 앱 서비스에 대한 경로를 지정하십시오. 노출하려는 앱 또는 서비스를 포함하는 각 네임스페이스에 대해 별도의 Ingress 리소스가 필요합니다.

시작하기 전에

시작하기 전에 다음 준비 단계를 수행하십시오.

  1. 인그레스를 설정할 수 있는 올바른 권한이 있는지 확인하세요. 다음 IBM Cloud IAM 역할 이 필요합니다.

    • 클러스터에 대한 관리자 플랫폼 액세스 역할
    • 모든 네임스페이스의 관리자 서비스 액세스 역할
  2. IBM제공 Ingress 하위 도메인을 사용할지 여부를 판별하십시오. 제공된 하위 도메인을 사용하지 않으려면 사용자 고유의 사용자 정의 도메인 을 작성하고 등록해야 합니다.

    사설 ALB를 통해 앱을 노출하려면 사용자 정의 도메인이 필요합니다.

  3. 사설 ALB를 통해 앱을 노출하는 경우 CLI에서 각 사설 ALB를 사용으로 설정해야 합니다. ALB ID를 가져오려면 ibmcloud ks ingress alb ls --cluster CLUSTER 을 실행합니다.

    클래식 클러스터 자세한 정보 및 명령 옵션은CLI 참조 를 참조하십시오.

    ibmcloud ks ingress alb enable classic --alb <alb_id> --cluster <cluster_name>
    

    VPC 클러스터 자세한 정보 및 명령 옵션은CLI 참조 를 참조하십시오.

    ibmcloud ks ingress alb enable vpc-gen2 --alb <alb_id> --cluster <cluster_name>
    
  4. 고가용성을 보장하고 정기적인 업데이트를 적용하기 위해 클러스터에 구역당 두 개 이상의 작업자 노드가 포함되어 있는지 확인하십시오. 구역에 작업자 노드가 하나만 있으면 ALB는 자동 업데이트를 수신할 수 없습니다. 자세한 정보는 ALB에 대한 작업자 노드 요구사항 을 참조하십시오.

  5. 클래식 클러스터를 사용하는 경우 IBM Cloud 인프라 계정에 대해 VRF(Virtual Router Function) 를 사용으로 설정하십시오. VRF를 사용으로 설정하려면 VRF 사용을 참조하십시오. VRF가 이미 사용으로 설정되었는지 확인하려면 ibmcloud account show 명령을 사용하십시오. VRF를 사용할 수 없거나 사용하지 않으려면 VLAN Spanning을 사용으로 설정하십시오. VRF 또는 VLAN Spanning이 사용으로 설정된 경우, ALB가 패킷을 계정의 다양한 서브넷으로 라우팅할 수 있습니다.

  6. VPC 클러스터를 사용 중인 경우 작업자 노드의 노드 포트로 Ingress에 의해 라우팅되는 트래픽 요청이 VPC 보안 그룹 에서 허용되는지 확인하십시오.

  7. 자동화 또는 테스트 등의 이유로 7일 내에 동일하거나 유사한 이름의 클러스터를 5회 이상 작성하고 삭제하는 경우에는 Let's Encrypt 중복 인증서 속도 한계에 도달할 수 있습니다. Ingress 서브도메인 및 인증서가 올바르게 등록되도록 하기 위해, 클러스터 이름의 처음 24자는 서로 달라야 합니다.

  8. 에지 작업자 노드로 네트워크 트래픽을 제한하는 경우에는 ALB가 균등하게 배치되도록 각 구역에서 최소한 두 개의 에지 작업자 노드가 사용으로 설정되었는지 확인하십시오.

구역에서 장애가 발생하는 경우, 해당 구역의 Ingress ALB에 대한 요청에서 간헐적인 장애가 나타날 수 있습니다.

설정 단계

단계에 따라 Ingress를 설정하십시오.

1단계: ClusterIP 서비스 작성

외부 요청을 앱 팟 (Pod) 으로 전달할 수 있도록 클러스터 내에서 앱에 도달할 수 있도록 하려면 ClusterIP 서비스가 필요합니다. Ingress 로드 밸런싱에 포함되도록 앱을 노출하는 ClusterIP 서비스의 이름은 클러스터의 모든 네임스페이스 간에 고유해야 합니다.

노출할 각 앱 배치에 대해 Kubernetes ClusterIP 서비스를 작성하십시오. Ingress 로드 밸런싱에 포함하려면 앱을 Kubernetes 서비스에서 노출해야 합니다.

kubectl expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>

2단계: TLS 인증서 및 Kubernetes 시크릿을 사용하여 TLS 종료 설정

TLS 인증서는 앱이 존재하는 각 네임스페이스에서 Kubernetes 시크릿으로 저장되어야 합니다.

3단계: Ingress 리소스 작성

인그레스 리소스를 생성하여 인그레스 컨트롤러가 앱 서비스로 트래픽을 라우팅하는 데 사용하는 라우팅 규칙을 정의합니다.

  1. YAML 파일에서 Ingress 리소스를 작성하십시오.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress-resource
    spec:
      ingressClassName: nginx-example
      tls:
      - hosts:
        - <domain_name>
        secretName: <tls_secret_name>
      rules:
      - host: HOSTNAME
        http:
          paths:
          - path: <app_path_1>
            pathType: Prefix
            backend:
              service:
                name: <app_service_1>
                port:
                  number: 80
          - path: <app_path_2>
            pathType: Prefix
            backend:
              service:
                name: <app_service_2>
                port:
                  number: 80
    
    
    annotations
    kubernetes.io/ingress.class: 적용할 Ingress 클래스를 지정하십시오. IBM제공 Ingress 클래스는 공용 ALB의 경우 "public-iks-k8s-nginx" 이고 사설 ALB의 경우 "private-iks-k8s-nginx" 입니다.
    IngressClass 자원 및 ibm-ingress-deploy-config configmap에서 이 사용자 정의 클래스를 지정하십시오. 인그레스에 대한 라우팅을 사용자 정의하려면, Kubernetes NGINX 어노테이션(nginx.ingress.kubernetes.io/<annotation>)을 추가할 수 있습니다. 사용자 정의 IBM Cloud Kubernetes Service 어노테이션(ingress.bluemix.net/<annotation>)은 지원되지 않습니다.
    주: 다른 구성 요소가 인그레스 ALB를 관리하는 구성의 경우(예: 인그레스가 Helm 차트의 일부로 배포되는 경우) 이 어노테이션을 지정하지 마세요. 대신 구성에 대한 인그레스 클래스를 찾아 spec.ingressClassName: <class_name> 필드에 해당 클래스를 지정합니다.
    ingressClassName
    Ingress 클래스 이름입니다. IBM제공 Ingress 클래스는 공용 ALB의 경우 public-iks-k8s-nginx 이고 사설 ALB의 경우 private-iks-k8s-nginx 입니다.
    tls.hosts
    TLS를 사용하려면 <domain>을(를) IBM에서 제공하는 Ingress 하위 도메인 또는 사용자 정의 도메인으로 바꾸십시오.
    tls.secretName
    <tls_secret_name>TLS 인증서 가 저장된 Kubernetes 시크릿의 이름으로 대체하십시오.
    host
    <domain>을 IBM 제공 Ingress 하위 도메인 또는 사용자 정의 도메인으로 대체하십시오.
    path
    <app_path>를 슬래시 또는 앱이 청취 중인 경로로 대체하십시오. 경로가 지정된 인그레스 도메인에 추가되어 앱에 대한 고유 경로가 생성됩니다. 이 라우트를 웹 브라우저에 입력하면 네트워크 트래픽이 애플리케이션 ALB로 라우팅됩니다. ALB는 연관된 서비스를 찾고 네트워크 트래픽을 이 서비스에 전송합니다. 그 후 이 서비스는 트래픽을 앱이 실행되는 팟(Pod)에 전달합니다.
    pathType
    URL 경로 일치 방법입니다. 지원되는 값은 ImplementationSpecific, Exact 또는 Prefix입니다. 각 경로 유형에 대한 자세한 내용과 예시는 커뮤니티 Kubernetes 문서를 참조하세요.
    service.name
    app1_serviceapp2_service 등을 앱을 노출하기 위해 작성한 서비스의 이름으로 대체하십시오. 지정한 앱이 동일한 네임스페이스에 있는지 확인하십시오.
    service.name
    <app1_service><app2_service> 등을 앱을 노출하기 위해 작성한 서비스의 이름으로 대체하십시오. 지정한 앱이 동일한 네임스페이스에 있는지 확인하십시오.
    service.port.number
    서비스가 청취하는 포트입니다. 앱에 대한 Kubernetes 서비스를 작성했을 때 정의한 동일한 포트를 사용하십시오.
  2. 클러스터에 인그레스 리소스를 적용합니다. 리소스가 리소스에 정의한 앱 서비스와 동일한 네임스페이스에 배치되는지 확인하십시오.

    kubectl apply -f community-ingress-resource.yaml -n <namespace>
    

4단계: Ingress 설정 확인

  1. ALB를 나열하고 Kubernetes 인그레스 이미지를 실행하는 하나의 ALB에 대한 IP 주소(클래식) 또는 호스트 이름(VPC)을 복사합니다. 출력에서 <community_version>_<ibm_build>_iks 형식의 빌드가 있는 ALB를 선택하십시오.

    ibmcloud ks ingress alb ls -c <cluster>
    
  2. ALB의 IP 주소(클래식) 또는 호스트 이름(VPC), 앱 경로 및 도메인을 사용하여 이 ALB를 통해 앱으로 트래픽을 성공적으로 전송할 수 있는지 확인합니다.

    curl http://<ALB_IP>/<app_path> -H "Host: <ingress_subdomain>"
    

    예를 들어 기본 인그레스 하위 도메인을 사용하여 myapp 이라는 앱으로 요청을 보내려면 다음 명령을 실행합니다.

    curl http://169.X.X.X/myapp -H "Host: mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud"
    

Ingress를 통해 앱에 연결하는 데 문제가 있습니까? Ingress 문제점 해결을 시도하십시오. ibmcloud ks ingress status-report get -c <cluster_name_or_ID>을(를) 실행하여 Ingress 컴포넌트의 상태를 확인할 수 있습니다.

Ingress가 있는 사용자 정의 도메인

IBM제공 Ingress 하위 도메인을 사용하지 않으려는 경우 Ingress 리소스에서 지정하는 자체 사용자 정의 도메인을 사용할 수 있습니다. 사설 ALB를 통해 Ingress에 노출된 앱에는 사용자 정의 도메인이 필요합니다.

공용 ALB에 대한 사용자 정의 도메인 작성

다음 단계에 따라 공용 ALB에 대한 사용자 정의 도메인을 작성하십시오.

  1. 사용자 정의 도메인을 작성하십시오. 사용자 정의 도메인을 등록하려면 DNS(Domain Name Service) 제공자 또는 IBM Cloud DNS를 통해 작업하십시오. Ingress에서 노출할 앱이 하나의 클러스터의 여러 네임스페이스에 있는 경우 사용자 정의 도메인을 와일드카드 도메인(예: *.custom_domain.net)으로 등록하십시오. 도메인은 Kubernetes 버전 1.20 이상에서 130자이하로 제한됩니다.

  2. 표준 이름 레코드(CNAME)로 IBM 제공 도메인을 지정하여 사용자 정의 도메인의 별명을 정의하십시오. IBM 제공 Ingress 도메인을 찾으려면 ibmcloud ks cluster get --cluster <cluster_name>을 실행하고 Ingress subdomain 필드를 찾으십시오.

    IBM제공 하위 도메인을 CNAME으로 지정하면 DNS 응답에서 실패한 IP를 제거하고 ALB를 추가하거나 제거할 때 사용자 정의 도메인이 업데이트되는지 확인하기 위한 자동 상태 검사에 필요합니다.

사설 ALB에 대한 사용자 정의 도메인 작성

단계에 따라 사설 ALB에 대한 사용자 정의 도메인을 작성하십시오. 사설 ALB에서 Ingress를 사용하려면 사용자 정의 도메인이 필요합니다.

사설 VLAN만 있는 클래식 클러스터가 있는 경우 먼저 사용자 고유의 사설 네트워크에서 사용 가능한 DNS 서비스를 구성해야 합니다.

  1. DNS 서비스 제공자를 통해 사용자 정의 도메인을 작성하십시오. Ingress URL은 130자이하여야 합니다.

  2. IP 주소를 A 레코드(클래식 클러스터)로 추가하거나 해당 VPC 호스트 이름을 CNAME(VPC 클러스터)으로 추가하여 사용자 정의 도메인을 사설 ALB에 맵핑하십시오. ALB IP 주소(클래식) 또는 호스트 이름(VPC)을 찾으려면 ibmcloud ks ingress alb ls -c <cluster_name_or_ID>을(를) 실행하십시오.