Ingress를 통해 앱 공개하기

Red Hat® OpenShift® on IBM Cloud® 클러스터 내의 여러 앱을 Ingress 컨트롤러가 관리하는 Ingress 리소스를 생성하여 외부에서 접근할 수 있도록 공개합니다.

전제조건

Ingress를 시작하기 전에 다음 전제조건을 검토하십시오.

  • Ingress를 설정하려면 다음 IBM Cloud IAM 역할이 필요합니다.
    • IBM Cloud Kubernetes Service 에서 클러스터에 대한 관리자 플랫폼 액세스 역할.
    • 모든 IBM Cloud Kubernetes Service 네임스페이스( Red Hat OpenShift 프로젝트)에서 관리자 서비스 액세스 역할.
  • 구역에서 장애가 발생하는 경우, 해당 구역의 Ingress 제어기가 노출하는 앱에 대한 요청에서 간헐적인 장애가 나타날 수 있습니다.
  • 고가용성을 보장하기 위해 구역당 최소한 두 개의 작업자 노드를 권장합니다.

퍼블릭 클라우드 서비스 엔드포인트를 사용하여 클러스터 내 앱을 공개적으로 노출하기

클래식 클러스터 가상 사설 클라우드

클러스터가 클래식 인프라에서 생성된 경우, 또는 VPC 인프라에서 생성되었으나 생성 시 퍼블릭 클라우드 서비스 엔드포인트를 활성화한 경우, 기본 퍼블릭 Ingress 컨트롤러를 사용하여 클러스터 내 애플리케이션을 노출시키고 퍼블릭 네트워크에서 오는 요청을 수신할 수 있습니다.

시작하기 전에:

1단계: 앱 배치 및 앱 서비스 작성

앱을 배치하고 앱 노출을 위한 Kubernetes 서비스를 작성하여 시작하십시오.

  1. 클러스터에 앱을 배치하십시오. 구성 파일의 메타데이터 섹션에서 배치에 레이블(예: app: code)을 추가했는지 확인하십시오. 이 레이블은 팟(Pod)이 Ingress 로드 밸런싱에 포함될 수 있도록 앱이 실행되는 모든 팟(Pod)을 식별하는 데 필요합니다.

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

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

2단계: TLS 인증서와 Kubernetes 시크릿을 사용하여 TLS 종단 설정을 구성합니다

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

3단계: Ingress 리소스 작성

Ingress 리소스는 Ingress 제어기에서 트래픽을 앱 서비스에 라우팅하는 데 사용하는 라우팅 규칙을 정의합니다.

  1. IBM 제공 도메인 또는 사용자 정의 도메인을 사용하여 수신 네트워크 트래픽을 이전에 작성한 서비스로 라우팅하는 Ingress 리소스 구성 파일을 정의하십시오.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingressresource
    spec:
      tls:
      - hosts:
        - <domain>
        secretName: <secret_name>
      rules:
      - host: <domain>
        http:
          paths:
          - path: /<app1_path>
            pathType: Prefix
            backend:
                service:
                    name: test
                    port:
                        number: 80
          - path: /<app2_path>
            backend:
                service:
                    name: <app2_service>
                    port:
                        number: 80
    
    tls
    TLS 를 사용하려면 리소스에 다음 TLS 섹션을 포함시키세요. <domain>을 하위 도메인으로 대체하십시오. Ingress 생성 시 오류가 발생하지 않도록 호스트에 * 을 사용하지 마시고, 호스트 속성을 비워 두지 마십시오. <tls_secret_name> 을 사용자 지정 도메인의 TLS 인증서 및 키가 포함된 앞서 생성한 시크릿으로, 또는 IBM 에서 제공하는 하위 도메인을 위해 자동 생성된 TLS 시크릿으로 대체하십시오.
    host
    <domain>을 IBM 제공 Ingress 하위 도메인 또는 사용자 정의 도메인으로 대체하십시오. 클러스터에 앱이 노출되는 여러 프로젝트가 있는 경우에는 프로젝트당 하나의 Ingress 리소스가 필요합니다. 각 리소스에서 동일한 하위 도메인을 사용하거나 각 리소스에서 다른 하위 도메인을 사용할 수 있습니다. 예를 들어, 와일드카드 도메인을 사용하는 경우 와일드카드 하위 도메인을 도메인의 시작 부분에 추가할 수 있습니다(예: subdomain1.custom_domain.net 또는 subdomain1.mycluster-<hash>-0000.us-south.containers.appdomain.cloud). Ingress 작성 중에 실패하지 않으려면 호스트에 *를 사용하거나 호스트 특성을 비워 두지 마십시오.
    path
    <app_path> 을 앱이 수신 대기 중인 경로로 바꾸십시오. 앱에 대한 고유 라우트를 작성하기 위해 경로가 IBM 제공 또는 사용자 정의 도메인에 추가됩니다. 이 라우트를 웹 브라우저에 입력하면 네트워크 트래픽이 Ingress 제어기로 라우팅됩니다. Ingress 제어기는 연관된 서비스를 검색하고 네트워크 트래픽을 이 서비스에 전송합니다. 그 후 이 서비스는 트래픽을 앱이 실행되는 팟(Pod)에 전달합니다. 많은 앱이 특정 경로에서 청취하지는 않지만 루트 경로와 특정 포트를 사용합니다. 이 경우 루트 경로를 /로 정의하고 앱에 대한 개별 경로를 지정하지 마십시오. http://domain/의 경우 /를 경로로 입력하십시오. http://domain/app1_path의 경우 /app1_path를 경로로 입력하십시오.
    pathType
    URL 경로 일치 방법입니다. 지원되는 값은 ImplementationSpecific, Exact 또는 Prefix입니다. 각 경로 유형에 대한 자세한 내용과 예시는 커뮤니티의 ‘ Kubernetes ’ 문서를 참조하십시오.
    name
    <app1_service><app2_service> 등을 앱을 노출하기 위해 작성한 서비스의 이름으로 대체하십시오. 클러스터에 있는 여러 프로젝트의 서비스에서 앱을 노출한 경우 동일한 프로젝트에 있는 앱 서비스만 포함하십시오. 노출할 앱이 있는 프로젝트마다 하나의 Ingress 리소스를 작성해야 합니다.
    port
    서비스가 청취하는 포트입니다. 앱에 대한 Kubernetes 서비스를 작성했을 때 정의한 동일한 포트를 사용하십시오.
  2. 클러스터에 대한 Ingress 리소스를 작성하십시오. 리소스가 리소스에 정의한 앱 서비스와 동일한 프로젝트에 배치되는지 확인하십시오.

    oc apply -f myingressresource.yaml -n <project>
    
  3. Ingress 리소스가 작성되었는지 확인하십시오. 이벤트에 표시된 메시지가 리소스 구성의 오류를 나타내는 경우, 리소스 파일의 값을 수정한 후 해당 리소스에 파일을 다시 적용하십시오.

    oc describe ingress myingressresource
    

Ingress 리소스는 앱 서비스와 동일한 프로젝트에서 작성되며 앱은 Ingress 제어기에 등록됩니다.

4단계: 인터넷에서 앱에 액세스

웹 브라우저에서 액세스할 앱 서비스의 URL을 입력하십시오.

https://<domain>/<app1_path>

여러 앱을 노출한 경우 URL에 추가되는 경로를 변경하여 해당 앱에 액세스하십시오.

https://<domain>/<app2_path>

와일드카드 도메인을 사용하는 경우 고유 하위 도메인을 통해 해당 앱에 액세스하십시오.

http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>

Ingress를 통해 앱에 연결할 수 없습니까? Ingress 문제점 해결을 시도하십시오.

프라이빗 클라우드 서비스 엔드포인트만 있는 VPC 클러스터에서 공용으로 앱 노출

가상 사설 클라우드

클러스터가 VPC 인프라에서 생성되었고, 생성 시 프라이빗 클라우드 서비스 엔드포인트만 활성화한 경우, 해당 클러스터는 기본적으로 프라이빗 Ingress 컨트롤러만 포함하도록 생성됩니다. 앱을 공용으로 노출시키려면 먼저 공용 Ingress 제어기를 작성해야 합니다. 그런 다음 Ingress 제어기를 하위 도메인에 등록하고 선택적으로 사용자 자신의 TLS 인증서를 가져와야 합니다.

1단계: 앱 배치 및 앱 서비스 작성

앱을 배치하고 앱 노출을 위한 Kubernetes 서비스를 작성하여 시작하십시오.

  1. 클러스터에 앱을 배치하십시오. 구성 파일의 메타데이터 섹션에서 배치에 레이블(예: app: code)을 추가했는지 확인하십시오. 이 레이블은 팟(Pod)이 Ingress 로드 밸런싱에 포함될 수 있도록 앱이 실행되는 모든 팟(Pod)을 식별하는 데 필요합니다.

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

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

2단계: TLS 인증서와 Kubernetes 시크릿을 사용하여 TLS 종단 설정을 구성합니다

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

TLS Ingress 맞춤 도메인 설정의 비결

외부 제공업체에 등록된 도메인 등 직접 생성한 도메인을 사용하려면 ‘사용자 지정 하위 도메인을 위한 TLS 시크릿 설정’을 참조하세요.

TLS IBM 에서 관리하는 Ingress 도메인을 위한 팁

다음 단계에 따라 IBM 에서 관리하는 Ingress 도메인에 대한 ‘ TLS ’ 시크릿을 설정하십시오.

  1. 클러스터에 있는 기존 하위 도메인을 나열하십시오. 출력의 하위 도메인 열에서 000<n> 값이 가장 높은 하위 도메인을 복사하십시오.
    ibmcloud oc nlb-dns ls --cluster CLUSTER_NAME_OR_ID
    
    이 예제 출력에서는 mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud 하위 도메인의 000<n> 값이 가장 높은 값인 0002입니다.
    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0000
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["5678efgh-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0001
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud     ["9012ijkl-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0002
    
  2. 복사한 하위 도메인에서 하위 도메인의 000<n> 값을 000<n+1>로 변경하십시오. 예를 들어, mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud 서브도메인이 mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloud 로 변경됩니다. n+1 값은 이 클러스터에서 작성하는 다음 연속 서브도메인을 표시합니다. 이 하위 도메인은 후속 단계에서 등록합니다. 도메인을 등록하면 해당 도메인에 대한 TLS 시크릿이 자동으로 생성됩니다. 시크릿 이름은 하위 도메인을 자른 형식(예: mycluster-a1b2cdef345678g9hi012j3kl4567890-0003)을 따릅니다.

3단계: 공용 Ingress 제어기 작성 및 구성

자신의 도메인 및 TLS 인증서를 준비한 후에는 공용 Ingress 제어기를 작성하고 자신의 도메인을 사용하여 이 제어기를 구성해야 합니다.

  1. 공용 Ingress 제어기에 대한 구성 파일을 작성하십시오.

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: public-ingress-controller
      namespace: openshift-ingress-operator
    spec:
      replicas: 2
      domain: <domain>
      endpointPublishingStrategy:
        loadBalancer:
          scope: External
        type: LoadBalancerService
    
  2. 클러스터의 openshift-ingress-operator 프로젝트에 IngressController 리소스를 작성하십시오. IngressController를 작성하면 IngressController 설정에 따라 공용 Ingress 제어기가 자동으로 작성되어 openshift-ingress 프로젝트에 배치됩니다. 또한 Ingress 제어기를 노출시키기 위해 Ingress 제어기 서비스가 작성됩니다.

    oc create -f public-ingress-controller.yaml -n openshift-ingress-operator
    
  3. oc get 명령을 실행하고 router-public-ingress-controller 서비스의 EXTERNAL IP 필드에서 VPC 호스트 이름을 찾으십시오. VPC 클러스터에서 서비스의 외부 IP 주소는 비정적이며 대신 VPC 지정 호스트 이름 뒤에 숨겨집니다.

    oc get svc router-public-ingress-controller -n openshift-ingress
    

    출력 예

    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP                             PORT(S)                      AGE
    router-public-ingress-controller     LoadBalancer   172.21.57.132    1234abcd-us-south.lb.appdomain.cloud    80/TCP,443/TCP,1940/TCP      3m
    
  4. 서비스의 VPC 호스트 이름을 이전에 선택한 도메인에 등록하십시오.

    • 사용자 정의 도메인: DNS 제공자를 통해 router-public-ingress-controller 서비스의 VPC 호스트 이름을 사용자 정의 도메인에 맵핑되는 CNAME으로 추가하십시오.
    • IBM 제공 도메인: router-public-ingress-controller 서비스의 VPC 호스트 이름에 대한 DNS 항목을 작성하십시오. 다음 명령을 실행하면 public-ingress-controller.yaml 파일에 지정한 하위 도메인이 자동으로 생성되며 router-public-ingress-controller 서비스에 등록됩니다. 도메인에 대한 TLS 시크릿은 앱이 실행되는 위치를 지정하는 프로젝트에 자동으로 생성됩니다. 시크릿 이름은 하위 도메인을 자른 형식(예: mycluster-a1b2cdef345678g9hi012j3kl4567890-0003)을 따릅니다.
        ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <VPC_hostname> --secret-namespace <project>
        ```
    
    

3단계: Ingress 리소스 작성

Ingress 리소스는 Ingress 제어기에서 트래픽을 앱 서비스에 라우팅하는 데 사용하는 라우팅 규칙을 정의합니다.

  1. IBM 제공 도메인 또는 사용자 정의 도메인을 사용하여 수신 네트워크 트래픽을 이전에 작성한 서비스로 라우팅하는 Ingress 리소스 구성 파일을 정의하십시오.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingressresource
    spec:
      tls:
      - hosts:
        - <subdomain>
        secretName: <custom_secret_name>
      rules:
      - host: <subdomain>
        http:
          paths:
          - path: /<app1_path>
            pathType: Prefix
            backend:
                service:
                  name: <app1_service>
                  port:
                    number: 80
          - path: /<app2_path>
            backend:
                service:
                  name: <app2_service>
                  port:
                    number: 80
    
    tls
    TLS 를 사용하려면 리소스에 다음 TLS 섹션을 포함시키세요.
    <domain>을 하위 도메인으로 대체하십시오. Ingress 작성 중에 실패하지 않으려면 호스트에 *를 사용하거나 호스트 특성을 비워 두지 마십시오.
    <tls_secret_name>을 사용자 정의 도메인의 TLS 인증서 및 키가 포함된, 이전에 작성한 시크릿이나 IBM 제공 하위 도메인에 대해 자동으로 생성된 TLS 시크릿으로 대체하십시오.
    host
    <domain>을 하위 도메인으로 대체하십시오. 클러스터에 앱이 노출되는 여러 프로젝트가 있는 경우에는 프로젝트당 하나의 Ingress 리소스가 필요합니다. 각 리소스에서 동일한 하위 도메인을 사용하거나 각 리소스에서 다른 하위 도메인을 사용할 수 있습니다. 예를 들어, 와일드카드 도메인을 사용하는 경우 와일드카드 하위 도메인을 도메인의 시작 부분에 추가할 수 있습니다(예: subdomain1.custom_domain.net). Ingress 작성 중에 실패하지 않으려면 호스트에 *를 사용하거나 호스트 특성을 비워 두지 마십시오.
    path
    <app_path> 을 앱이 수신 대기 중인 경로로 바꾸십시오. 앱에 대한 고유 라우트를 작성하기 위해 경로가 IBM 제공 또는 사용자 정의 도메인에 추가됩니다. 이 라우트를 웹 브라우저에 입력하면 네트워크 트래픽이 Ingress 제어기로 라우팅됩니다. Ingress 제어기는 연관된 서비스를 찾고 네트워크 트래픽을 이 서비스에 전송합니다. 그 후 이 서비스는 트래픽을 앱이 실행되는 팟(Pod)에 전달합니다. 많은 앱이 특정 경로에서 청취하지는 않지만 루트 경로와 특정 포트를 사용합니다. 이 경우 루트 경로를 /로 정의하고 앱에 대한 개별 경로를 지정하지 마십시오. 예를 들어 http://domain/ 을 사용하려면 경로에 / 를 입력합니다. http://domain/app1_path의 경우 /app1_path를 경로로 입력하십시오.
    pathType
    URL 경로 일치 방법입니다. 지원되는 값은 ImplementationSpecific, Exact 또는 Prefix입니다. 각 경로 유형에 대한 자세한 내용과 예시는 커뮤니티의 ‘ Kubernetes ’ 문서를 참조하십시오.
    name
    <app1_service><app2_service> 등을 앱을 노출하기 위해 작성한 서비스의 이름으로 대체하십시오. 클러스터에 있는 여러 프로젝트의 서비스에서 앱을 노출한 경우 동일한 프로젝트에 있는 앱 서비스만 포함하십시오. 노출할 앱이 있는 프로젝트마다 하나의 Ingress 리소스를 작성해야 합니다.
    port
    서비스가 청취하는 포트입니다. 앱에 대한 Kubernetes 서비스를 작성했을 때 정의한 동일한 포트를 사용하십시오.
  2. 클러스터에 대한 Ingress 리소스를 작성하십시오. 리소스가 리소스에 정의한 앱 서비스와 동일한 프로젝트에 배치되는지 확인하십시오.

    oc apply -f myingressresource.yaml -n <project>
    
  3. Ingress 리소스가 작성되었는지 확인하십시오. 이벤트에 표시된 메시지가 리소스 구성의 오류를 나타내는 경우, 리소스 파일의 값을 수정한 후 해당 리소스에 파일을 다시 적용하십시오.

    oc describe ingress myingressresource
    

Ingress 리소스는 앱 서비스와 동일한 프로젝트에서 작성되며 앱은 Ingress 제어기에 등록됩니다.

5단계: 인터넷에서 앱에 액세스

웹 브라우저에서 액세스할 앱 서비스의 URL을 입력하십시오.

https://<domain>/<app1_path>

여러 앱을 노출한 경우 URL에 추가되는 경로를 변경하여 해당 앱에 액세스하십시오.

https://<domain>/<app2_path>

와일드카드 도메인을 사용하는 경우 고유 하위 도메인을 통해 해당 앱에 액세스하십시오.

http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>

Ingress를 통해 앱에 연결할 수 없습니까? Ingress 문제점 해결을 시도하십시오.

클러스터 외부에 있는 앱을 공용으로 노출

클러스터 외부에 있는 앱을 공용 Ingress 로드 밸런싱에 포함하여 공용으로 노출합니다. IBM 제공 또는 사용자 정의 도메인의 수신 공용 요청이 외부 앱으로 자동으로 전달됩니다.

시작하기 전에, 클러스터 부하 분산에 포함하려는 외부 앱에 공용 IP 주소를 통해 액세스할 수 있는지 확인하십시오.

클러스터 외부에 있는 앱을 일반에 공개하려면 다음 단계를 따르세요.

  1. Ingress 컨트롤러가 노출하는 앱에 대한 ‘ Kubernetes ’ 서비스 구성 파일을 정의합니다. 이 서비스는 후속 단계에서 작성하는 외부 엔드포인트로 수신 요청을 전달합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: myexternalservice
    spec:
      ports:
       - protocol: TCP
         port: <app_port>
    
  2. 클러스터에 서비스를 작성하십시오.

    oc apply -f myexternalservice.yaml
    
  3. 외부 엔드포인트 구성 파일을 정의하십시오. 외부 앱에 액세스하기 위해 사용할 수 있는 모든 공인 IP 주소 및 포트를 포함하십시오. 엔드포인트의 이름은 이전 단계에서 생성한 서비스의 이름과 동일해야 합니다. 예를 들어, myexternalservice 과 같이 설정해야 합니다.

    kind: Endpoints
    apiVersion: v1
    metadata:
      name: myexternalservice
    subsets:
      - addresses:
          - ip: <external_IP1>
          - ip: <external_IP2>
        ports:
          - port: <external_port>
    
    name
    <myexternalendpoint>를 이전에 작성한 Kubernetes 서비스의 이름으로 대체하십시오.
    ip
    <external_IP>를 외부 앱에 연결하기 위한 공인 IP 주소로 대체하십시오.
    port
    <external_port>를 외부 앱이 청취하는 포트로 대체하십시오.
  4. 클러스터에서 엔드포인트를 작성하십시오.

    oc apply -f myexternalendpoint.yaml
    
  5. 사설 클라우드 서비스 엔드포인트만 있는 VPC 클러스터의 앱 공개 노출 또는 공용 클라우드 서비스 엔드포인트가 있는 클러스터의 앱 공개 노출 의 두 번째 단계를 계속하십시오.