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 컨트롤러만 포함하도록 생성됩니다. 앱을 개인용으로 노출시키려면 먼저 개인용 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 맞춤 도메인 활용 비결

외부 제공업체에 등록된 도메인 등 직접 생성한 도메인에 대해 ‘ TLS ’ 시크릿을 설정하려면, ‘사용자 지정 하위 도메인에 대한 TLS 시크릿 설정’을 참조하세요. 이 단계들은 클래식 클러스터와 VPC 클러스터 모두에 적용됩니다.

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

  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: private-ingress-controller
      namespace: openshift-ingress-operator
    spec:
      #defaultCertificate: If you are using a custom domain, specify the domain certificate
        #name: custom-certs-default
      replicas: 2
      domain: <domain>
      endpointPublishingStrategy:
        loadBalancer:
          scope: Internal
        type: LoadBalancerService
    
  2. 클러스터의 openshift-ingress-operator 프로젝트에 IngressController 리소스를 작성하십시오. IngressController,을 생성하면 이전 단계에서 설정한 IngressController 설정에 따라 비공개 인그레스 컨트롤러가 자동으로 생성되어 openshift-ingress 프로젝트에 배포됩니다. 또한, Ingress 컨트롤러를 IP 주소(클래식 클러스터) 또는 VPC 호스트 이름(VPC 클러스터)으로 노출하기 위해 Ingress 컨트롤러 서비스가 생성됩니다.
    oc create -f private-ingress-controller.yaml -n openshift-ingress-operator
    
  3. oc get 명령을 실행하고 router-private-ingress-controller 서비스의 EXTERNAL IP 필드에서 IP 주소 또는 VPC 호스트 이름을 찾으십시오.
    oc get svc router-private-ingress-controller -n openshift-ingress
    
    클래식 클러스터의 출력 예제입니다.
    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
    router-private-ingress-controller     LoadBalancer   172.21.57.132    10.XX.XX.XX    80/TCP,443/TCP,1940/TCP      3m
    
    VPC 클러스터의 출력 예:
    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP                             PORT(S)                      AGE
    router-private-ingress-controller     LoadBalancer   172.21.57.132    1234abcd-us-south.lb.appdomain.cloud    80/TCP,443/TCP,1940/TCP      3m
    
  4. 서비스의 외부 IP 주소 또는 VPC 호스트 이름을 이전에 선택한 도메인에 등록하십시오.
    • 사용자 정의 도메인: DNS 제공자를 통해 router-private-ingress-controller 서비스의 외부 IP 주소를 사용자 정의 도메인에 맵핑되는 A 레코드(클래식 클러스터)로 추가하거나, VPC 호스트 이름을 사용자 정의 도메인에 맵핑되는 CNAME(VPC 클러스터)으로 추가하십시오.
    • IBM 제공 도메인: router-private-ingress-controller 서비스의 VPC 호스트 이름에 대한 DNS 항목을 작성하십시오. 다음 명령을 실행하면 private-ingress-controller.yaml 파일에 지정한 하위 도메인이 자동으로 생성되며 router-private-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>
            backend:
                service:
                    name: <app1_service>
                    port:
                        number: 80
          - path: /<app2_path>
            backend:
                serivce:
                  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를 경로로 입력하십시오.
    serviceName
    <app1_service><app2_service> 등을 앱을 노출하기 위해 작성한 서비스의 이름으로 대체하십시오. 클러스터에 있는 여러 프로젝트의 서비스에서 앱을 노출한 경우 동일한 프로젝트에 있는 앱 서비스만 포함하십시오. 공개하려는 앱이 포함된 각 프로젝트마다 Ingress 리소스를 하나씩 생성해야 합니다.
    servicePort
    서비스가 청취하는 포트입니다. 앱에 대한 Kubernetes 서비스를 작성했을 때 정의한 동일한 포트를 사용하십시오.
  2. 클러스터에 대한 Ingress 리소스를 작성하십시오. 리소스가 리소스에 정의한 앱 서비스와 동일한 프로젝트에 배치되는지 확인하십시오.

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

    oc describe ingress myingressresource
    

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

5단계: 사설 네트워크에서 앱에 액세스

  1. 클래식 클러스터: 앱에 액세스할 수 있으려면 우선 DNS 서비스에 액세스할 수 있는지 확인하십시오. 기본 외부 DNS 공급자를 사용하려면, 공용 액세스가 가능한 에지 노드를 구성하고 Virtual Router Appliance 을 설정해야 합니다.

  2. 사설 네트워크 내에서 웹 브라우저에 앱 서비스의 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 컨트롤러를 사용하여 클러스터 내 애플리케이션을 프라이빗 네트워크의 요청에 노출할 수 있습니다.

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:
        - <custom_domain>
        secretName: <custom_secret_name>
      rules:
      - host: <domain>
        http:
          paths:
          - path: /<app1_path>
            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>을 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를 경로로 입력하십시오.
    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 문제점 해결을 시도하십시오.