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를 통해 라우팅되는 트래픽 요청이 워커 노드의 노드 포트로 전달되도록 허용합니다. 자세한 내용은 기본 클러스터 VPC 네트워킹을 통한 보안 이해하기 및 VPC 보안 그룹 만들기 및 관리하기를 참조하세요.
- VPC 다중 존 클러스터: CLI에서 클러스터를 생성한 후,
ibmcloud oc zone add vpc-gen2명령어를 사용하여 작업자 풀에 존을 수동으로 추가한 경우, Ingress 컨트롤러를 노출하는 VPC 로드 밸런서를 업데이트하여 클러스터 내 모든 존의 서브넷을 포함하도록 해야 합니다. - 클래식 클러스터: IBM Cloud 인프라 계정에 대해 VRF(Virtual Router Function)를 사용으로 설정하십시오. VRF가 이미 사용으로 설정되었는지 확인하려면
ibmcloud account show명령을 사용하십시오. VRF를 활성화할 수 없거나 활성화하고 싶지 않다면, VLAN 스패닝을 활성화하십시오. VRF 또는 VLAN Spanning이 사용으로 설정된 경우 Ingress 제어기는 패킷을 계정의 다양한 서브넷으로 라우팅할 수 있습니다.
퍼블릭 클라우드 서비스 엔드포인트를 사용하여 개인적으로 앱 노출
클래식 클러스터 가상 사설 클라우드
클러스터가 클래식 인프라에서 생성된 경우, 또는 VPC 인프라에서 생성되었으나 클러스터 생성 시 퍼블릭 클라우드 서비스 엔드포인트를 활성화한 경우, 해당 클러스터는 기본적으로 퍼블릭 Ingress 컨트롤러만 포함하도록 생성됩니다. 앱을 개인용으로 노출시키려면 먼저 개인용 Ingress 제어기를 작성해야 합니다. 그런 다음 Ingress 제어기를 하위 도메인에 등록하고 선택적으로 사용자 자신의 TLS 인증서를 가져와야 합니다.
1단계: 앱 배치 및 앱 서비스 작성
앱을 배치하고 앱 노출을 위한 Kubernetes 서비스를 작성하여 시작하십시오.
-
클러스터에 앱을 배치하십시오. 구성 파일의 메타데이터 섹션에서 배치에 레이블(예:
app: code)을 추가했는지 확인하십시오. 이 레이블은 팟(Pod)이 Ingress 로드 밸런싱에 포함될 수 있도록 앱이 실행되는 모든 팟(Pod)을 식별하는 데 필요합니다. -
노출할 각 앱 배치에 대해 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 에서 관리하는 도메인을 위한 팁
-
클래식 클러스터 클래식 클러스터에서 IBM 에서 관리하는 Ingress 도메인을 사용하려면,IBM 에서 제공하는 Ingress 하위 도메인을 위한 TLS 시크릿 설정을 참조하십시오.
-
VPC 클러스터 VPC 클러스터에서 IBM관리 Ingress 도메인을 사용하려면 다음 단계를 따르십시오.
- 클러스터에 있는 기존 하위 도메인을 나열하십시오. 출력의 하위 도메인 열에서
000<n>값이 가장 높은 하위 도메인을 복사하십시오.
이 예제 출력에서는ibmcloud oc nlb-dns ls --cluster CLUSTER_NAME_OR_IDmycluster-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 - 복사한 하위 도메인에서 하위 도메인의
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 제어기를 작성하고 자신의 도메인을 사용하여 이 제어기를 구성해야 합니다.
- 개인 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 - 클러스터의
openshift-ingress-operator프로젝트에 IngressController 리소스를 작성하십시오. IngressController,을 생성하면 이전 단계에서 설정한 IngressController 설정에 따라 비공개 인그레스 컨트롤러가 자동으로 생성되어openshift-ingress프로젝트에 배포됩니다. 또한, Ingress 컨트롤러를 IP 주소(클래식 클러스터) 또는 VPC 호스트 이름(VPC 클러스터)으로 노출하기 위해 Ingress 컨트롤러 서비스가 생성됩니다.oc create -f private-ingress-controller.yaml -n openshift-ingress-operator oc get명령을 실행하고router-private-ingress-controller서비스의 EXTERNAL IP 필드에서 IP 주소 또는 VPC 호스트 이름을 찾으십시오.
클래식 클러스터의 출력 예제입니다.oc get svc router-private-ingress-controller -n openshift-ingress
VPC 클러스터의 출력 예: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 3mNAME 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- 서비스의 외부 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> ``` - 사용자 정의 도메인: DNS 제공자를 통해
3단계: Ingress 리소스 작성
Ingress 리소스는 Ingress 제어기에서 트래픽을 앱 서비스에 라우팅하는 데 사용하는 라우팅 규칙을 정의합니다.
-
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: 80tls-
- TLS 를 사용하려면 리소스에 다음 TLS 섹션을 포함시키세요.
<domain>을 하위 도메인으로 대체하십시오. Ingress 생성 시 오류가 발생하지 않도록 호스트에*을 사용하지 마시고, 호스트 속성을 비워 두지 마십시오. <tls_secret_name>을 사용자 정의 도메인의 TLS 인증서 및 키가 포함된, 이전에 작성한 시크릿이나 IBM 제공 하위 도메인에 대해 자동으로 생성된 TLS 시크릿으로 대체하십시오.
- TLS 를 사용하려면 리소스에 다음 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 서비스를 작성했을 때 정의한 동일한 포트를 사용하십시오.
-
클러스터에 대한 Ingress 리소스를 작성하십시오. 리소스가 리소스에 정의한 앱 서비스와 동일한 프로젝트에 배치되는지 확인하십시오.
oc apply -f myingressresource.yaml -n <project> -
Ingress 리소스가 작성되었는지 확인하십시오. 이벤트에 표시된 메시지가 리소스 구성의 오류를 나타내는 경우, 리소스 파일의 값을 수정한 후 해당 리소스에 파일을 다시 적용하십시오.
oc describe ingress myingressresource
Ingress 리소스는 앱 서비스와 동일한 프로젝트에서 작성되며 앱은 Ingress 제어기에 등록됩니다.
5단계: 사설 네트워크에서 앱에 액세스
-
클래식 클러스터: 앱에 액세스할 수 있으려면 우선 DNS 서비스에 액세스할 수 있는지 확인하십시오. 기본 외부 DNS 공급자를 사용하려면, 공용 액세스가 가능한 에지 노드를 구성하고 Virtual Router Appliance 을 설정해야 합니다.
-
사설 네트워크 내에서 웹 브라우저에 앱 서비스의 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 서비스를 작성하여 시작하십시오.
-
클러스터에 앱을 배치하십시오. 구성 파일의 메타데이터 섹션에서 배치에 레이블(예:
app: code)을 추가했는지 확인하십시오. 이 레이블은 팟(Pod)이 Ingress 로드 밸런싱에 포함될 수 있도록 앱이 실행되는 모든 팟(Pod)을 식별하는 데 필요합니다. -
노출할 각 앱 배치에 대해 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 ’ 시크릿으로 저장되어야 합니다.
-
IBM 에서 관리하는 Ingress 도메인을 사용하려면, ‘ IBM 에서 제공하는 Ingress 하위 도메인을 위한 TLS 시크릿 설정’을 참조하십시오.
-
외부 제공업체에 등록한 도메인 등 직접 생성한 도메인을 사용하려면 ‘사용자 지정 하위 도메인에 대한 TLS 시크릿 설정’을 참조하세요.
3단계: Ingress 리소스 작성
Ingress 리소스는 Ingress 제어기에서 트래픽을 앱 서비스에 라우팅하는 데 사용하는 라우팅 규칙을 정의합니다.
-
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: 80tls-
- 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 서비스를 작성했을 때 정의한 동일한 포트를 사용하십시오.
-
클러스터에 대한 Ingress 리소스를 작성하십시오. 리소스가 리소스에 정의한 앱 서비스와 동일한 프로젝트에 배치되는지 확인하십시오.
oc apply -f myingressresource.yaml -n <project> -
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 문제점 해결을 시도하십시오.