서빙


Red Hat OpenShift Serverless 1.35

Knative Serving 시작하기 및 서비스 구성

Red Hat OpenShift Documentation Team

초록

이 문서에서는 Knative Serving을 시작하는 방법에 대한 정보를 제공합니다. 애플리케이션을 구성하고 자동 스케일링, 트래픽 분할, 외부 및 수신 라우팅과 같은 기능을 다룹니다.

1장. Knative Serving 시작하기

1.1. 서버리스 애플리케이션 생성

서버리스 애플리케이션은 경로 및 구성으로 정의되고 YAML 파일에 포함된 Kubernetes 서비스로 생성 및 배포됩니다. OpenShift Serverless를 사용하여 서버리스 애플리케이션을 배포하려면 Knative Service 오브젝트를 생성해야 합니다.

Knative Service 오브젝트 YAML 파일의 예

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: showcase 
1

  namespace: default 
2

spec:
  template:
    spec:
      containers:
        - image: quay.io/openshift-knative/showcase 
3

          env:
            - name: GREET 
4

              value: Ciao
Copy to Clipboard Toggle word wrap

1
애플리케이션 이름입니다.
2
애플리케이션에서 사용하는 네임스페이스입니다.
3
애플리케이션 이미지입니다.
4
샘플 애플리케이션에서 출력한 환경 변수입니다.

다음 방법 중 하나를 사용하여 서버리스 애플리케이션을 생성합니다.

  • OpenShift Container Platform 웹 콘솔에서 Knative 서비스를 생성합니다.

    OpenShift Container Platform의 경우 자세한 내용은 애플리케이션 생성 을 참조하십시오.

  • Knative(kn) CLI를 사용하여 Knative 서비스를 생성합니다.
  • oc CLI를 사용하여 Knative Service 오브젝트를 YAML 파일로 생성하고 적용합니다.

1.1.1. Knative CLI를 사용하여 서버리스 애플리케이션 생성

Knative(kn) CLI를 사용하여 서버리스 애플리케이션을 생성하면 YAML 파일을 직접 수정하는 것보다 간소화되고 직관적인 사용자 인터페이스가 제공됩니다. kn service create 명령을 사용하여 기본 서버리스 애플리케이션을 생성할 수 있습니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • Knative(kn) CLI가 설치되어 있습니다.
  • 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.

프로세스

  • Knative 서비스를 생성합니다.

    $ kn service create <service-name> --image <image> --tag <tag-value>
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    • --image 는 애플리케이션의 이미지 URI입니다.
    • --tag 는 서비스와 함께 생성된 초기 버전에 태그를 추가하는 데 사용할 수 있는 선택적 플래그입니다.

      명령 예

      $ kn service create showcase \
          --image quay.io/openshift-knative/showcase
      Copy to Clipboard Toggle word wrap

      출력 예

      Creating service 'showcase' in namespace 'default':
      
        0.271s The Route is still working to reflect the latest desired specification.
        0.580s Configuration "showcase" is waiting for a Revision to become ready.
        3.857s ...
        3.861s Ingress has not yet been reconciled.
        4.270s Ready to serve.
      
      Service 'showcase' created with latest revision 'showcase-00001' and URL:
      http://showcase-default.apps-crc.testing
      Copy to Clipboard Toggle word wrap

1.1.2. YAML을 사용하여 서버리스 애플리케이션 생성

YAML 파일을 사용하여 Knative 리소스를 생성하면 선언적 API를 사용하므로 선언적 및 재현 가능한 방식으로 애플리케이션을 설명할 수 있습니다. YAML을 사용하여 서버리스 애플리케이션을 생성하려면 Knative Service 오브젝트를 정의하는 YAML 파일을 생성한 다음 oc apply 를 사용하여 적용해야 합니다.

서비스가 생성되고 애플리케이션이 배포되면 Knative에서 이 버전의 애플리케이션에 대해 변경할 수 없는 버전을 생성합니다. Knative는 네트워크 프로그래밍을 수행하여 애플리케이션의 경로, 수신, 서비스 및 로드 밸런서를 생성하고 트래픽에 따라 Pod를 자동으로 확장합니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
  • OpenShift CLI(oc)를 설치합니다.

프로세스

  1. 다음 샘플 코드를 포함하는 YAML 파일을 생성합니다.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: showcase
      namespace: default
    spec:
      template:
        spec:
          containers:
            - image: quay.io/openshift-knative/showcase
              env:
                - name: GREET
                  value: Bonjour
    Copy to Clipboard Toggle word wrap
  2. YAML 파일이 포함된 디렉터리로 이동한 후 YAML 파일을 적용하여 애플리케이션을 배포합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap

1.1.3. 오프라인 모드를 사용하여 서비스 생성

클러스터에서 변경 사항이 발생하지 않도록 kn service 명령을 오프라인 모드에서 실행할 수 있으며 대신 로컬 시스템에 서비스 설명자 파일이 생성됩니다. 설명자 파일이 생성되면 파일을 수정한 후 클러스터의 변경 사항을 전파할 수 있습니다.

중요

Knative CLI의 오프라인 모드는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • Knative(kn) CLI가 설치되어 있습니다.

프로세스

  1. 오프라인 모드에서 로컬 Knative 서비스 설명자 파일을 생성합니다.

    $ kn service create showcase \
        --image quay.io/openshift-knative/showcase \
        --target ./ \
        --namespace test
    Copy to Clipboard Toggle word wrap

    출력 예

    Service 'showcase' created in namespace 'test'.
    Copy to Clipboard Toggle word wrap

    • --target ./ 플래그는 오프라인 모드를 활성화하고 새 디렉터리 트리를 저장하는 디렉토리로./를 지정합니다.

      기존 디렉터리를 지정하지 않고 --target my-service.yaml과 같은 파일 이름을 사용하면 디렉터리 트리가 생성되지 않습니다. 대신 서비스 설명자 파일 my-service.yaml만 현재 디렉터리에 생성됩니다.

      파일 이름에는. .yaml, .yml, 또는 .json 확장을 사용할 수 있습니다. .json을 선택하면 JSON 형식으로 서비스 설명자 파일을 생성합니다.

    • --namespace test 옵션은 새 서비스를 test 네임스페이스에 배치합니다.

      --namespace를 사용하지 않고 OpenShift Container Platform 클러스터에 로그인한 경우 현재 네임스페이스에 설명자 파일이 생성됩니다. 그렇지 않으면 설명자 파일이 default 네임스페이스에 생성됩니다.

  2. 생성된 디렉터리 구조를 확인합니다.

    $ tree ./
    Copy to Clipboard Toggle word wrap

    출력 예

    ./
    └── test
        └── ksvc
            └── showcase.yaml
    
    2 directories, 1 file
    Copy to Clipboard Toggle word wrap

    • --target에서 지정된 현재 ./ 디렉터리에는 지정된 네임스페이스를 바탕으로 이름이 지정된 test/ 디렉터리가 포함되어 있습니다.
    • test/ 디렉터리에는 리소스 유형의 이름에 따라 이름이 지정된 ksvc 디렉터리가 포함되어 있습니다.
    • ksvc 디렉터리에는 지정된 서비스 이름에 따라 이름이 지정된 설명자 파일 showcase.yaml 이 포함되어 있습니다.
  3. 생성된 서비스 기술자 파일을 확인합니다.

    $ cat test/ksvc/showcase.yaml
    Copy to Clipboard Toggle word wrap

    출력 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      creationTimestamp: null
      name: showcase
      namespace: test
    spec:
      template:
        metadata:
          annotations:
            client.knative.dev/user-image: quay.io/openshift-knative/showcase
          creationTimestamp: null
        spec:
          containers:
          - image: quay.io/openshift-knative/showcase
            name: ""
            resources: {}
    status: {}
    Copy to Clipboard Toggle word wrap

  4. 새 서비스에 대한 정보를 나열합니다.

    $ kn service describe showcase --target ./ --namespace test
    Copy to Clipboard Toggle word wrap

    출력 예

    Name:       showcase
    Namespace:  test
    Age:
    URL:
    
    Revisions:
    
    Conditions:
      OK TYPE    AGE REASON
    Copy to Clipboard Toggle word wrap

    • target ./ 옵션은 네임스페이스 하위 디렉터리를 포함하는 디렉터리 구조의 루트 디렉터리를 지정합니다.

      또는 --target 옵션을 사용하여 YAML 또는 JSON 파일 이름을 직접 지정할 수 있습니다. 허용된 파일 확장자는 .yaml, .yml, .json입니다.

    • --namespace 옵션은 필요한 서비스 기술자 파일을 포함하는 하위 디렉터리를 kn와 통신하는 네임스페이스를 지정합니다.

      --namespace를 사용하지 않고 OpenShift Container Platform 클러스터에 로그인한 경우 kn은 현재 네임스페이스를 바탕으로 이름이 지정된 하위 디렉터리에서 서비스를 검색합니다. 그렇지 않으면 kndefault/ 하위 디렉터리에서 검색합니다.

  5. 서비스 설명자 파일을 사용하여 클러스터에 서비스를 생성합니다.

    $ kn service create -f test/ksvc/showcase.yaml
    Copy to Clipboard Toggle word wrap

    출력 예

    Creating service 'showcase' in namespace 'test':
    
      0.058s The Route is still working to reflect the latest desired specification.
      0.098s ...
      0.168s Configuration "showcase" is waiting for a Revision to become ready.
     23.377s ...
     23.419s Ingress has not yet been reconciled.
     23.534s Waiting for load balancer to be ready
     23.723s Ready to serve.
    
    Service 'showcase' created to latest revision 'showcase-00001' is available at URL:
    http://showcase-test.apps.example.com
    Copy to Clipboard Toggle word wrap

1.1.4. 서버리스 애플리케이션 배포 확인

서버리스 애플리케이션이 성공적으로 배포되었는지 확인하려면 Knative에서 생성한 애플리케이션 URL을 가져와서 해당 URL로 요청을 보낸 후 출력을 관찰해야 합니다. OpenShift Serverless에서는 HTTP 및 HTTPS URL을 모두 사용하지만 oc get ksvc 의 출력은 항상 http:// 형식을 사용하여 URL을 출력합니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • oc CLI를 설치했습니다.
  • Knative 서비스를 생성했습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.

프로세스

  1. 애플리케이션 URL을 찾습니다.

    $ oc get ksvc <service_name>
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME       URL                                   LATESTCREATED    LATESTREADY      READY   REASON
    showcase   http://showcase-default.example.com   showcase-00001   showcase-00001   True
    Copy to Clipboard Toggle word wrap

  2. 클러스터에 요청한 후 출력을 확인합니다.

    HTTP 요청의 예(HTTPie 툴 사용)

    $ http showcase-default.example.com
    Copy to Clipboard Toggle word wrap

    HTTPS 요청의 예

    $ https showcase-default.example.com
    Copy to Clipboard Toggle word wrap

    출력 예

    HTTP/1.1 200 OK
    Content-Type: application/json
    Server: Quarkus/2.13.7.Final-redhat-00003 Java/17.0.7
    X-Config: {"sink":"http://localhost:31111","greet":"Ciao","delay":0}
    X-Version: v0.7.0-4-g23d460f
    content-length: 49
    
    {
        "artifact": "knative-showcase",
        "greeting": "Ciao"
    }
    Copy to Clipboard Toggle word wrap

  3. 선택 사항입니다. 시스템에 HTTPie 툴이 설치되어 있지 않은 경우 대신 curl 툴을 사용할 수 있습니다.

    HTTPS 요청의 예

    $ curl http://showcase-default.example.com
    Copy to Clipboard Toggle word wrap

    출력 예

    {"artifact":"knative-showcase","greeting":"Ciao"}
    Copy to Clipboard Toggle word wrap

  4. 선택 사항입니다. 인증서 체인에서 자체 서명된 인증서와 관련된 오류가 발생하면 HTTPie 명령에 --verify=no 플래그를 추가하여 오류를 무시할 수 있습니다.

    $ https --verify=no showcase-default.example.com
    Copy to Clipboard Toggle word wrap

    출력 예

    HTTP/1.1 200 OK
    Content-Type: application/json
    Server: Quarkus/2.13.7.Final-redhat-00003 Java/17.0.7
    X-Config: {"sink":"http://localhost:31111","greet":"Ciao","delay":0}
    X-Version: v0.7.0-4-g23d460f
    content-length: 49
    
    {
        "artifact": "knative-showcase",
        "greeting": "Ciao"
    }
    Copy to Clipboard Toggle word wrap

    중요

    프로덕션 배포에는 자체 서명된 인증서를 사용해서는 안 됩니다. 이 방법은 테스트 목적으로만 사용됩니다.

  5. 선택 사항입니다. OpenShift Container Platform 클러스터가 CA(인증 기관)에서 서명한 인증서로 구성되어 있지만 아직 시스템에 전역적으로 구성되지 않은 경우 curl 명령으로 이 인증서를 지정할 수 있습니다. 인증서 경로는 --cacert 플래그를 사용하여 curl 명령에 전달할 수 있습니다.

    $ curl https://showcase-default.example.com --cacert <file>
    Copy to Clipboard Toggle word wrap

    출력 예

    {"artifact":"knative-showcase","greeting":"Ciao"}
    Copy to Clipboard Toggle word wrap

2장. OpenShift Serverless Serving의 확장성 및 성능

OpenShift Serverless는 리소스 요구 사항과 스케일링 동작이 다른 여러 구성 요소로 구성됩니다. 이러한 구성 요소는 수평 및 수직으로 확장되지만 리소스 요구 사항과 구성은 실제 사용 사례에 따라 크게 달라집니다.

Control-plane 구성 요소
이러한 구성 요소는 사용자 정의 리소스를 관찰 및 대응하고 시스템을 지속적으로 재구성합니다(예: 컨트롤러 Pod).
데이터 플레인 구성 요소
이러한 구성 요소는 요청 및 응답 처리(예: Knative Servings 활성화 구성 요소)에 직접 연결됩니다.

다음 테스트 설정을 사용하여 다음 메트릭 및 결과가 기록되었습니다.

  • OpenShift Container Platform 4.13을 실행하는 클러스터
  • 시스템 유형 m6.xlarge를 사용하여 AWS에서 4개의 컴퓨팅 노드를 실행하는 클러스터
  • OpenShift Serverless 1.30

2.1. OpenShift Serverless Serving 오버헤드

OpenShift Serverless Serving의 구성 요소는 데이터 플레인의 일부이므로 클라이언트의 요청이 다음을 통해 라우팅됩니다.

  • ingress-gateway(Kourier 또는 Service Mesh)
  • 활성화기 구성 요소
  • 각 Knative 서비스의 queue-proxy 사이드카 컨테이너

이러한 구성 요소는 네트워킹에 추가 홉을 도입하고 추가 작업을 수행합니다(예: 관찰 기능 및 요청 대기열 추가). 다음은 측정된 대기 시간 오버헤드입니다.

  • 각 추가 네트워크 홉은 요청에 0.5ms ~ 1ms 대기 시간을 추가합니다. Knative 서비스의 현재 로드에 따라 Knative 서비스가 요청 전에 0으로 스케일링된 경우 활성화기 구성 요소는 항상 데이터 플레인의 일부가 아닙니다.
  • 페이로드 크기에 따라 각 구성 요소는 초당 2500개의 요청을 처리하기 위해 최대 1개의 CPU vCPU를 사용합니다.

2.2. OpenShift Serverless Serving의 알려진 제한 사항

생성할 수 있는 최대 Knative 서비스 수는 3000입니다. 1개의 Knative 서비스에서 3개의 Kubernetes 서비스를 생성하기 때문에 OpenShift Container Platform Kubernetes 서비스 제한 10,000에 해당합니다.

2.3. OpenShift Serverless Serving의 확장 및 성능

OpenShift Serverless Serving은 다음 매개변수를 기반으로 확장 및 구성해야 합니다.

  • Knative 서비스 수
  • 버전 수
  • 시스템의 동시 요청 수
  • 요청 페이로드 크기
  • 사용자의 웹 애플리케이션에서 추가한 Knative 서비스의 startup-latency 및 응답 대기 시간
  • 시간 경과에 따른 KnativeService CR(사용자 정의 리소스) 변경 횟수

2.3.1. KnativeServing 기본 구성

기본적으로 OpenShift Serverless Serving은 고가용성 및 중간 크기의 CPU 및 메모리 요청 및 제한으로 모든 구성 요소를 실행하도록 구성됩니다. 즉 KnativeServing CR의 high-available 필드가 자동으로 2 값으로 설정되고 모든 시스템 구성 요소는 두 개의 복제본으로 확장됩니다. 이 구성은 중간 워크로드 시나리오에 적합하며 다음을 사용하여 테스트되었습니다.

  • 170 Knative 서비스
  • Knative 서비스당 1-2 버전
  • 89 테스트 시나리오는 주로 컨트롤 플레인 테스트에 중점을 두고 있습니다.
  • 48 Knative 서비스가 삭제되고 다시 생성되는 시나리오
  • 41 안정적인 시나리오: 요청이 느리지만 지속적으로 시스템으로 전송됨

이러한 테스트 사례에서는 시스템 구성 요소가 효과적으로 소비됩니다.

Expand
Component측정 리소스

프로젝트 openshift-serverless에서 Operator

1GB 메모리, 0.2 코어의 CPU

프로젝트 knative-serving의 구성 요소 제공

5GB 메모리, 2.5 코어의 CPU

2.3.2. OpenShift Serverless Serving의 최소 요구 사항

기본 설정은 중간 규모의 워크로드에 적합하지만 더 작은 설정이나 높은 워크로드 시나리오의 경우 크기가 초과될 수 있습니다. 최소 워크로드 시나리오를 위해 OpenShift Serverless Serving을 구성하려면 시스템 구성 요소의 유휴 사용량을 알아야 합니다.

2.3.2.1. 유휴 사용

유휴 사용은 Knative 서비스 수에 따라 다릅니다. knative-serving 및 knative-serving -ingress OpenShift Container Platform 프로젝트의 구성 요소에 대해 다음 메모리 사용량이 측정되었습니다.

Expand
Component0 서비스100개의 서비스500개의 서비스1000개의 서비스

activator

55Mi

86Mi

300Mi

450Mi

autoscaler

52Mi

102Mi

225Mi

350Mi

controller

100Mi

135Mi

310Mi

500Mi

webhook

60Mi

60Mi

60Mi

60Mi

3scale-kourier-gateway

20Mi

60Mi

190Mi

330Mi

net-kourier-controller

90Mi

170Mi

340Mi

430Mi

참고

3scale-kourier-gatewaynet-kourier-controller 구성 요소 또는 istio-ingressgatewaynet-istio-controller 구성 요소가 설치됩니다.

net-istio 의 메모리 사용은 메시 내의 총 Pod 수를 기반으로 합니다.

2.3.3. 최소 워크로드에 대한 Serving 구성

프로세스

  • KnativeServing 사용자 정의 리소스(CR)를 사용하여 최소 워크로드에 대해 Knative Serving 을 구성할 수 있습니다.

    KnativeServing CR의 최소 워크로드 구성

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      high-availability:
        replicas: 1 
    1
    
      workloads:
        - name: activator
          replicas: 2 
    2
    
          resources:
            - container: activator
              requests:
                cpu: 250m 
    3
    
                memory: 60Mi 
    4
    
              limits:
                cpu: 1000m
                memory: 600Mi
        - name: controller
          replicas: 1 
    5
    
          resources:
            - container: controller
              requests:
                cpu: 10m
                memory: 100Mi
              limits: 
    6
    
                cpu: 200m
                memory: 300Mi
        - name: webhook
          replicas: 2
          resources:
            - container: webhook
              requests:
                cpu: 100m 
    7
    
                memory: 60Mi
              limits:
                cpu: 200m
                memory: 200Mi
      podDisruptionBudgets: 
    8
    
        - name: activator-pdb
          minAvailable: 1
        - name: webhook-pdb
          minAvailable: 1
    Copy to Clipboard Toggle word wrap

    1
    이 값을 1 로 설정하면 모든 시스템 구성 요소가 하나의 복제본으로 확장됩니다.
    2
    다운타임을 방지하려면 활성기를 항상 최소 2 개의 인스턴스로 스케일링해야 합니다.
    3
    HorizontalPodAutoscaler 는 이를 확장 및 축소하기 위한 참조로 사용하므로 활성화기 CPU 요청을 250m 미만으로 설정해야 합니다.
    4
    이전 표의 유휴 값으로 메모리 요청을 조정합니다. 또한 예상 로드에 따라 메모리 제한을 조정합니다(최고의 값을 찾으려면 사용자 지정 테스트가 필요할 수 있음).
    5
    하나의 Webhook와 하나의 컨트롤러가 최소 워크로드 시나리오에 충분합니다.
    6
    이러한 제한은 최소 워크로드 시나리오에는 충분하지만 구체적인 워크로드에 따라 조정이 필요할 수 있습니다.
    7
    HorizontalPodAutoscaler는 이를 확장 및 축소하기 위한 참조로 사용하므로 Webhook CPU 요청을 100m 미만으로 설정하지 않아야 합니다.
    8
    노드 유지보수 중 문제를 방지하기 위해 PodDistruptionBudgets복제본 보다 낮은 값으로 조정합니다.

2.3.4. 높은 워크로드에 대한 Serving 구성

KnativeServing 사용자 정의 리소스(CR)를 사용하여 높은 워크로드에 대해 Knative Serving 을 구성할 수 있습니다. 다음 결과는 높은 워크로드에 대해 Knative Serving을 구성하는 것과 관련이 있습니다.

참고

이러한 결과는 페이로드 크기가 0-32 kb인 요청으로 테스트되었습니다. 해당 테스트에 사용되는 Knative 서비스 백엔드에는 0~10초 간 시작 대기 시간과 0~5초의 응답 시간이 있었습니다.

  • 모든 데이터 플레인 구성 요소는 높은 요청 및 페이로드 시나리오에서 CPU 사용량이 크게 증가하므로 CPU 요청 및 제한을 테스트해야 하며 잠재적으로 증가할 수 있습니다.
  • 또한 활성화 구성 요소에 더 많은 요청 페이로드를 버퍼링해야 하는 경우 더 많은 메모리가 필요할 수 있으므로 메모리 요청 및 제한도 늘려야 할 수 있습니다.
  • 하나의 activator Pod는 대기 시간을 늘리기 전에 초당 약 2500 건의 요청을 처리할 수 있으며 어느 시점에서 오류가 발생합니다.
  • 1개의 3scale-kourier-gateway 또는 istio-ingressgateway Pod는 대기 시간을 늘리기 전에 초당 약 2500개의 요청을 처리할 수 있으며 어느 시점에서 오류가 발생할 수도 있습니다.
  • 각 데이터 플레인 구성 요소는 초당 2500개의 요청을 처리하기 위해 최대 1개의 CPU vCPU를 사용합니다. 이는 Knative 서비스 백엔드의 페이로드 크기 및 응답 시간에 따라 달라집니다.
중요

Knative 서비스 사용자 워크로드의 빠른 시작 및 빠른 응답 시간은 전체 시스템의 우수한 성능을 위해 중요합니다. Knative Serving 구성 요소는 Knative 서비스 사용자 백엔드가 확장되거나 요청 동시성이 용량에 도달했을 때 들어오는 요청을 버퍼링하고 있습니다. Knative 서비스 사용자 워크로드에서 긴 시작 또는 요청 대기 시간이 발생하는 경우 활성화 구성 요소(CPU 및 메모리 구성이 너무 낮은 경우)를 오버로드하거나 호출 클라이언트에 오류가 발생합니다.

프로세스

  • 설치를 미세 조정하려면 자체 테스트 결과와 결합된 이전 결과를 사용하여 KnativeServing 사용자 정의 리소스를 구성합니다.

    KnativeServing CR의 높은 워크로드 구성

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      high-availability:
        replicas: 2 
    1
    
      workloads:
        - name: component-name 
    2
    
          replicas: 2 
    3
    
          resources:
            - container: container-name
              requests:
                cpu: 
    4
    
                memory:
              limits:
                cpu:
                memory:
      podDisruptionBudgets: 
    5
    
        - name: name-of-pod-disruption-budget
          minAvailable: 1
    Copy to Clipboard Toggle word wrap

    1
    이 매개변수를 최소 2 개로 설정하여 모든 구성 요소의 인스턴스가 항상 두 개 이상 실행되고 있는지 확인합니다. 워크로드를 사용하여 특정 구성 요소의 복제본을 덮어쓸 수도 있습니다.
    2
    워크로드 목록을 사용하여 특정 구성 요소를 구성합니다. 구성 요소의 배포 이름을 사용하고 replicas 필드를 설정합니다.
    3
    HPA(수평 Pod 자동 스케일러)를 사용하는 activator,webhook, 3scale-kourier-gateway 구성 요소의 경우 replicas 필드는 최소 복제본 수를 설정합니다. 실제 복제본 수는 HPA에서 수행하는 CPU 로드 및 스케일링에 따라 다릅니다.
    4
    이전 결과 및 자체 테스트 결과를 고려하여 최소한 유휴 사용량에 따라 요청된 CPU 및 메모리를 설정합니다.
    5
    노드 유지보수 중 문제를 방지하려면 PodDistruptionBudgets복제본 보다 낮은 값으로 조정합니다. 기본 minAvailable1 로 설정되어 있으므로 필요한 복제본을 늘리는 경우 minAvailable 도 늘려야 합니다.
중요

각 환경은 매우 구체적이므로 고유한 이상적인 구성을 테스트하고 찾아야 합니다. OpenShift Container Platform의 모니터링 및 경고 기능을 사용하여 실제 리소스 사용을 지속적으로 모니터링하고 필요한 경우 조정합니다.

OpenShift Serverless 및 Service Mesh 통합을 사용하는 경우 istio-proxy 사이드카 컨테이너에 의해 추가 CPU 처리가 추가됩니다. 이에 대한 자세한 내용은 Service Mesh 설명서를 참조하십시오.

3장. 자동 확장

3.1. 자동 확장

Knative Serving은 들어오는 수요와 일치하도록 애플리케이션의 자동 스케일링 또는 자동 스케일링을 제공합니다. 예를 들어 애플리케이션에 트래픽이 수신되지 않고 scale-to-zero가 활성화된 경우 Knative Serving은 애플리케이션을 복제본 0으로 축소합니다. 스케일 투 0이 비활성화된 경우 애플리케이션은 클러스터의 애플리케이션에 대해 구성된 최소 복제본 수로 축소됩니다. 애플리케이션에 대한 트래픽이 증가하는 경우 필요에 따라 복제본을 확장할 수도 있습니다.

Knative 서비스의 자동 스케일링 설정은 클러스터 관리자(또는 AWS 및 OpenShift Dedicated의 Red Hat OpenShift Service 전용 관리자) 또는 개별 서비스에 대해 구성된 모니터링별 설정일 수 있습니다.

OpenShift Container Platform 웹 콘솔을 사용하거나 서비스의 YAML 파일을 수정하거나 Knative(kn) CLI를 사용하여 서비스에 대한 감독별 설정을 수정할 수 있습니다.

참고

서비스에 설정한 제한 또는 대상은 애플리케이션의 단일 인스턴스에 대해 측정됩니다. 예를 들어 target 주석을 50 으로 설정하면 각 버전에서 50개의 요청을 처리할 수 있도록 애플리케이션을 스케일링하도록 자동 스케일러를 구성합니다.

3.2. 스케일링 경계

스케일 경계는 언제든지 애플리케이션을 제공할 수 있는 최소 및 최대 복제본 수를 결정합니다. 애플리케이션의 스케일 범위를 설정하여 콜드 시작 또는 컴퓨팅 비용을 제어할 수 있습니다.

3.2.1. 최소 스케일 경계

애플리케이션을 제공할 수 있는 최소 복제본 수는 min-scale 주석에 따라 결정됩니다. scale to zero가 활성화되지 않은 경우 min-scale 값은 기본적으로 1 입니다.

다음 조건이 충족되면 min-scale 값은 기본적으로 0 개의 복제본으로 설정됩니다.

  • min-scale 주석이 설정되지 않음
  • 0으로 스케일링이 활성화됨
  • KPA 클래스 사용

min-scale 주석이 있는 서비스 사양의 예

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: showcase
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/min-scale: "0"
...
Copy to Clipboard Toggle word wrap

3.2.1.1. Knative CLI를 사용하여 min-scale 주석 설정

Knative(kn) CLI를 사용하여 min-scale 주석을 설정하면 YAML 파일을 직접 수정하는 것보다 간소화되고 직관적인 사용자 인터페이스가 제공됩니다. kn service 명령을 --scale-min 플래그와 함께 사용하여 서비스의 min-scale 값을 생성하거나 수정할 수 있습니다.

사전 요구 사항

  • Knative Serving이 클러스터에 설치되어 있습니다.
  • Knative(kn) CLI가 설치되어 있습니다.

프로세스

  • --scale-min 플래그를 사용하여 서비스의 최소 복제본 수를 설정합니다.

    $ kn service create <service_name> --image <image_uri> --scale-min <integer>
    Copy to Clipboard Toggle word wrap

    명령 예

    $ kn service create showcase --image quay.io/openshift-knative/showcase --scale-min 2
    Copy to Clipboard Toggle word wrap

3.2.2. 최대 스케일 경계

애플리케이션을 제공할 수 있는 최대 복제본 수는 max-scale 주석에 따라 결정됩니다. max-scale 주석이 설정되지 않은 경우 생성된 복제본 수에 대한 상한이 없습니다.

max-scale 주석이 있는 서비스 사양의 예

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: showcase
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/max-scale: "10"
...
Copy to Clipboard Toggle word wrap

3.2.2.1. Knative CLI를 사용하여 max-scale 주석 설정

Knative(kn) CLI를 사용하여 max-scale 주석을 설정하면 YAML 파일을 직접 수정하는 것보다 간소화되고 직관적인 사용자 인터페이스가 제공됩니다. kn service 명령을 --scale-max 플래그와 함께 사용하여 서비스의 max-scale 값을 생성하거나 수정할 수 있습니다.

사전 요구 사항

  • Knative Serving이 클러스터에 설치되어 있습니다.
  • Knative(kn) CLI가 설치되어 있습니다.

프로세스

  • --scale-max 플래그를 사용하여 서비스의 최대 복제본 수를 설정합니다.

    $ kn service create <service_name> --image <image_uri> --scale-max <integer>
    Copy to Clipboard Toggle word wrap

    명령 예

    $ kn service create showcase --image quay.io/openshift-knative/showcase --scale-max 10
    Copy to Clipboard Toggle word wrap

3.3. 동시성

동시성은 언제든지 애플리케이션의 각 복제본에서 처리할 수 있는 동시 요청 수를 결정합니다. 동시성은 소프트 제한 또는 하드 제한으로 구성할 수 있습니다.

  • 소프트 제한은 엄격하게 적용된 바인딩이 아닌 대상 요청 제한입니다. 예를 들어, 트래픽이 갑자기 버스트되는 경우 소프트 제한 대상을 초과할 수 있습니다.
  • 하드 제한은 엄격하게 적용되는 상한 요청 제한입니다. 동시성이 하드 제한에 도달하면 서+ 요청이 버퍼링되며 요청을 실행할 수 있는 사용 가능한 용량이 충분히 있을 때까지 기다려야 합니다.

    중요

    하드 제한 구성을 사용하는 것은 애플리케이션에 명확한 사용 사례가 있는 경우에만 권장됩니다. 지정된 하드 제한이 낮으면 애플리케이션의 처리량 및 대기 시간에 부정적인 영향을 미칠 수 있으며 콜드 시작이 발생할 수 있습니다.

소프트 대상과 하드 제한을 추가하면 자동 스케일러가 동시 요청의 소프트 대상 수를 대상으로 하지만 최대 요청 수에 대한 하드 제한 값을 강제 적용합니다.

하드 제한 값이 소프트 제한 값보다 작으면 실제로 처리할 수 있는 수보다 더 많은 요청을 대상으로 할 필요가 없기 때문에 소프트 제한 값이 조정됩니다.

3.3.1. 소프트 동시성 대상 구성

소프트 제한은 엄격하게 적용된 바인딩이 아닌 대상 요청 제한입니다. 예를 들어, 트래픽이 갑자기 버스트되는 경우 소프트 제한 대상을 초과할 수 있습니다. 사양에서 autoscaling.knative.dev/target 주석을 설정하거나 올바른 플래그와 함께 kn service 명령을 사용하여 Knative 서비스의 소프트 동시성 대상을 지정할 수 있습니다.

프로세스

  • 선택 사항: Service 사용자 정의 리소스의 사양에서 Knative 서비스에 대한 autoscaling.knative.dev/target 주석을 설정합니다.

    서비스 사양의 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: showcase
      namespace: default
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/target: "200"
    Copy to Clipboard Toggle word wrap

  • 선택 사항: kn service 명령을 사용하여 --concurrency-target 플래그를 지정합니다.

    $ kn service create <service_name> --image <image_uri> --concurrency-target <integer>
    Copy to Clipboard Toggle word wrap

    동시성 대상이 50개의 요청으로 서비스를 생성하는 명령 예

    $ kn service create showcase --image quay.io/openshift-knative/showcase --concurrency-target 50
    Copy to Clipboard Toggle word wrap

3.3.2. 하드 동시성 제한 구성

하드 동시성 제한은 엄격하게 적용되는 상한 요청 제한입니다. 동시성이 하드 제한에 도달하면 서+ 요청이 버퍼링되며 요청을 실행할 수 있는 사용 가능한 용량이 충분히 있을 때까지 기다려야 합니다. containerConcurrency 사양을 수정하거나 올바른 플래그와 함께 kn service 명령을 사용하여 Knative 서비스에 대한 하드 동시성 제한을 지정할 수 있습니다.

프로세스

  • 선택 사항: Service 사용자 정의 리소스의 사양에 Knative 서비스의 containerConcurrency 사양을 설정합니다.

    서비스 사양의 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: showcase
      namespace: default
    spec:
      template:
        spec:
          containerConcurrency: 50
    Copy to Clipboard Toggle word wrap

    기본값은 0 이며, 이는 한 번에 하나의 서비스 복제본으로 전달될 수 있는 동시 요청 수에 제한이 없음을 의미합니다.

    0 보다 큰 값은 한 번에 하나의 서비스 복제본으로 전달될 수 있는 정확한 요청 수를 지정합니다. 이 예제에서는 하드 동시성 제한을 50개의 요청을 활성화합니다.

  • 선택 사항: kn service 명령을 사용하여 --concurrency-limit 플래그를 지정합니다.

    $ kn service create <service_name> --image <image_uri> --concurrency-limit <integer>
    Copy to Clipboard Toggle word wrap

    동시성 제한이 50개의 요청으로 서비스를 생성하는 명령 예

    $ kn service create showcase --image quay.io/openshift-knative/showcase --concurrency-limit 50
    Copy to Clipboard Toggle word wrap

3.3.3. 동시성 대상 사용률

이 값은 자동 스케일러가 실제로 대상으로 하는 동시성 제한의 백분율을 지정합니다. 또한 복제본이 실행되는 hotness 를 지정하여 정의된 하드 제한에 도달하기 전에 자동 스케일러를 확장할 수 있습니다.

예를 들어 containerConcurrency 값이 10으로 설정되고 target-utilization-percentage 값이 70%로 설정된 경우, 자동 스케일러는 모든 기존 복제본의 평균 동시 요청 수가 7에 도달하면 새 복제본을 생성합니다. 7에서 10까지 번호가 매겨진 요청은 기존 복제본으로 계속 전송되지만 containerConcurrency 값에 도달한 후에도 추가 복제본이 필요할 것으로 예상됩니다.

target-utilization-percentage 주석을 사용하여 구성된 서비스의 예

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: showcase
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target-utilization-percentage: "70"
...
Copy to Clipboard Toggle word wrap

3.4. Scale-to-zero

Knative Serving은 들어오는 수요와 일치하도록 애플리케이션의 자동 스케일링 또는 자동 스케일링을 제공합니다.

3.4.1. scale-to-zero 활성화

클러스터의 애플리케이션에 대해 enable-scale-to-zero 사양을 사용하여 전역적으로 스케일 투 0을 활성화하거나 비활성화할 수 있습니다.

사전 요구 사항

  • 클러스터에 OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.
  • 기본 Knative Pod Autoscaler를 사용하고 있습니다. Kubernetes Horizontal Pod Autoscaler를 사용하는 경우 0으로 스케일링 기능을 사용할 수 없습니다.

프로세스

  • KnativeServing 사용자 정의 리소스(CR)에서 enable-scale-to-zero 사양을 수정합니다.

    KnativeServing CR의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
    spec:
      config:
        autoscaler:
          enable-scale-to-zero: "false" 
    1
    Copy to Clipboard Toggle word wrap

    1
    enable-scale-to-zero 사양은 "true" 또는 "false" 일 수 있습니다. true로 설정하면 scale-to-zero가 활성화됩니다. false로 설정하면 애플리케이션이 구성된 최소 스케일 바운드 로 축소됩니다. 기본값은 "true" 입니다.

3.4.2. scale-to-zero 유예 기간 구성

Knative Serving에서는 애플리케이션의 Pod가 0개로 자동 스케일링을 제공합니다. scale-to-zero-grace-period 사양을 사용하여 애플리케이션의 마지막 복제본이 제거되기 전에 Knative에서 0으로 스케일링할 때까지 대기하는 상한 시간 제한을 정의할 수 있습니다.

사전 요구 사항

  • 클러스터에 OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.
  • 기본 Knative Pod Autoscaler를 사용하고 있습니다. Kubernetes Horizontal Pod Autoscaler를 사용하는 경우 scale-to-zero 기능을 사용할 수 없습니다.

프로세스

  • KnativeServing CR(사용자 정의 리소스)에서 scale-to-zero-grace-period 사양을 수정합니다.

    KnativeServing CR의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
    spec:
      config:
        autoscaler:
          scale-to-zero-grace-period: "30s" 
    1
    Copy to Clipboard Toggle word wrap

    1
    유예 기간(초)입니다. 기본값은 30초입니다.

4장. OpenShift Serverless 애플리케이션 구성

4.1. Serving에 대한 멀티컨테이너 지원

단일 Knative 서비스를 사용하여 멀티컨테이너 Pod를 배포할 수 있습니다. 이 방법은 애플리케이션 책임을 작고 특수화된 부분으로 분리하는 데 유용합니다.

4.1.1. 멀티컨테이너 서비스 구성

멀티컨테이너 지원은 기본적으로 활성화되어 있습니다. 서비스에서 여러 컨테이너를 지정하여 멀티컨테이너 Pod를 생성할 수 있습니다.

프로세스

  1. 추가 컨테이너를 포함하도록 서비스를 수정합니다. 하나의 컨테이너만 요청을 처리할 수 있으므로 하나의 컨테이너에 대한 포트 를 지정합니다. 다음은 두 개의 컨테이너가 있는 구성의 예입니다.

    여러 컨테이너 구성

    apiVersion: serving.knative.dev/v1
    kind: Service
    ...
    spec:
      template:
        spec:
          containers:
            - name: first-container 
    1
    
              image: gcr.io/knative-samples/helloworld-go
              ports:
                - containerPort: 8080 
    2
    
            - name: second-container 
    3
    
              image: gcr.io/knative-samples/helloworld-java
    Copy to Clipboard Toggle word wrap

    1
    첫 번째 컨테이너 구성
    2
    첫 번째 컨테이너의 포트 사양입니다.
    3
    두 번째 컨테이너 구성.

4.1.2. 멀티컨테이너 서비스 검색

여러 컨테이너에 대한 준비 및 활성 프로브를 지정할 수 있습니다. 이 기능은 기본적으로 활성화되어 있지 않으며 KnativeServing CR(사용자 정의 리소스)을 사용하여 구성해야 합니다.

프로세스

  1. KnativeServing CR에서 multi-container-probing 기능을 활성화하여 서비스에 대한 멀티 컨테이너 프로빙을 구성합니다.

    멀티컨테이너 검사 구성

    ...
    spec:
      config:
        features:
          "multi-container-probing": enabled 
    1
    
    ...
    Copy to Clipboard Toggle word wrap

    1
    Multi-container-probing 기능
  2. 업데이트된 KnativeServing CR을 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  3. 지정된 프로브를 포함하도록 멀티컨테이너 서비스를 수정합니다.

    멀티 컨테이너 검사

    apiVersion: serving.knative.dev/v1
    kind: Service
    ...
    spec:
     template:
       spec:
         containers:
           - name: first-container
             image: ghcr.io/knative/helloworld-go:latest
             ports:
               - containerPort: 8080
             readinessProbe: 
    1
    
               httpGet:
                 port: 8080
           - name: second-container
             image: gcr.io/knative-samples/helloworld-java
             readinessProbe: 
    2
    
               httpGet:
                 port: 8090
    Copy to Clipboard Toggle word wrap

    1
    첫 번째 컨테이너의 준비 상태 프로브
    2
    두 번째 컨테이너의 준비 상태 프로브
4.1.2.1. 추가 리소스

4.2. emptyDir 볼륨

emptyDir 볼륨은 Pod가 생성될 때 생성되는 빈 볼륨이며 임시 작업 디스크 공간을 제공하는 데 사용됩니다. emptyDir 볼륨은 생성된 Pod가 삭제될 때 삭제됩니다.

4.2.1. EmptyDir 확장 구성

kubernetes.podspec-volumes-emptydir 확장은 emptyDir 볼륨을 Knative Serving에서 사용할 수 있는지 여부를 제어합니다. emptyDir 볼륨을 사용하려면 다음 YAML을 포함하도록 KnativeServing CR(사용자 정의 리소스)을 수정해야 합니다.

KnativeServing CR의 예

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
spec:
  config:
    features:
      kubernetes.podspec-volumes-emptydir: enabled
...
Copy to Clipboard Toggle word wrap

4.3. Serving에 대한 영구 볼륨 클레임

일부 서버리스 애플리케이션에는 영구 데이터 스토리지가 필요합니다. 다양한 볼륨 유형을 구성하면 Knative 서비스에 데이터 스토리지를 제공할 수 있습니다. 서비스 제공에서는 보안,configMap,projected, emptyDir 과 같은 볼륨 유형 마운트를 지원합니다.

Knative 서비스에 대한 PVC(영구 볼륨 클레임)를 구성할 수 있습니다. 영구 볼륨 유형은 플러그인으로 구현됩니다. 사용 가능한 영구 볼륨 유형이 있는지 확인하려면 클러스터에 사용 가능한 스토리지 클래스 또는 설치된 스토리지 클래스를 확인할 수 있습니다. 영구 볼륨이 지원되지만 기능 플래그를 활성화해야 합니다.

주의

대용량 볼륨을 마운트하면 애플리케이션 시작 시간이 상당히 지연될 수 있습니다.

4.3.1. PVC 지원 활성화

프로세스

  1. Knative Serving에서 PVC를 사용하고 쓸 수 있도록 하려면 다음 YAML을 포함하도록 KnativeServing CR(사용자 정의 리소스)을 수정합니다.

    쓰기 액세스 권한이 있는 PVC 활성화

    ...
    spec:
      config:
        features:
          "kubernetes.podspec-persistent-volume-claim": enabled
          "kubernetes.podspec-persistent-volume-write": enabled
    ...
    Copy to Clipboard Toggle word wrap

    • kubernetes.podspec-persistent-volume-claim 확장은 Knative Serving에서 PV(영구 볼륨)를 사용할 수 있는지 여부를 제어합니다.
    • kubernetes.podspec-persistent-volume-write 확장은 쓰기 액세스 권한이 있는 Knative Serving에서 PV를 사용할 수 있는지 여부를 제어합니다.
  2. PV를 클레임하려면 PV 구성을 포함하도록 서비스를 수정합니다. 예를 들어 다음 구성이 포함된 영구 볼륨 클레임이 있을 수 있습니다.

    참고

    요청하는 액세스 모드를 지원하는 스토리지 클래스를 사용합니다. 예를 들어 ReadWriteMany 액세스 모드에 ocs-storagecluster-cephfs 스토리지 클래스를 사용할 수 있습니다.

    ocs-storagecluster-cephfs 스토리지 클래스가 지원되며 Red Hat OpenShift Data Foundation 에서 제공됩니다.

    PersistentVolumeClaim 구성

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: example-pv-claim
      namespace: my-ns
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ocs-storagecluster-cephfs
      resources:
        requests:
          storage: 1Gi
    Copy to Clipboard Toggle word wrap

    이 경우 쓰기 액세스 권한이 있는 PV를 클레임하려면 다음과 같이 서비스를 수정합니다.

    Knative 서비스 PVC 구성

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      namespace: my-ns
    ...
    spec:
     template:
       spec:
         containers:
             ...
             volumeMounts: 
    1
    
               - mountPath: /data
                 name: mydata
                 readOnly: false
         volumes:
           - name: mydata
             persistentVolumeClaim: 
    2
    
               claimName: example-pv-claim
               readOnly: false 
    3
    Copy to Clipboard Toggle word wrap

    1
    볼륨 마운트 사양.
    2
    영구 볼륨 클레임 사양.
    3
    읽기 전용 액세스를 활성화하는 플래그입니다.
    참고

    Knative 서비스에서 영구 스토리지를 성공적으로 사용하려면 Knative 컨테이너 사용자의 사용자 권한과 같은 추가 구성이 필요합니다.

4.4. init 컨테이너

Init 컨테이너 는 Pod의 애플리케이션 컨테이너보다 먼저 실행되는 특수 컨테이너입니다. 일반적으로 애플리케이션에 대한 초기화 논리를 구현하는 데 사용되며, 여기에는 설정 스크립트 실행 또는 필수 구성 다운로드가 포함될 수 있습니다. KnativeServing 사용자 정의 리소스(CR)를 수정하여 Knative 서비스에 init 컨테이너 사용을 활성화할 수 있습니다.

참고

Init Container는 애플리케이션 시작 시간이 길어질 수 있으며 서버리스 애플리케이션에 주의하여 사용해야 합니다. 이 기능은 자주 확장 및 축소할 것으로 예상됩니다.

4.4.1. init 컨테이너 활성화

사전 요구 사항

  • 클러스터에 OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.

프로세스

  • kubernetes.podspec-init-containers 플래그를 KnativeServing CR에 추가하여 init 컨테이너 사용을 활성화합니다.

    KnativeServing CR의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
    spec:
      config:
        features:
          kubernetes.podspec-init-containers: enabled
    ...
    Copy to Clipboard Toggle word wrap

4.5. 시작 프로브

시작 프로브는 서비스가 성공적으로 시작되었는지 여부를 확인하여 시작 프로세스가 느려지는 컨테이너의 콜드 시작 시간을 줄일 수 있습니다. 시작 프로브는 컨테이너의 초기화 단계에서만 실행되며 주기적으로 실행되지 않습니다. 시작 프로브가 실패하면 컨테이너가 정의된 restartPolicy 를 따릅니다.

4.5.1. 진행 기한

기본적으로 서비스에는 초기 시작을 완료하는 서비스의 시간 제한을 정의하는 진행 기한이 있습니다. 시작 프로브를 사용하는 경우 진행 기한이 시작 프로브에 필요한 최대 시간을 초과하도록 설정되어 있는지 확인합니다. 진행 기한이 너무 낮으면 시작 프로브가 데드라인에 도달하기 전에 완료되지 않아 서비스가 시작되지 않을 수 있습니다.

배포에 다음 조건이 발생하면 진행 기한을 늘리는 것이 좋습니다.

  • 서비스 이미지는 크기 때문에 가져오는 데 시간이 오래 걸립니다.
  • 초기 캐시 priming으로 인해 서비스가 준비 되기까지 시간이 오래 걸립니다.
  • 클러스터는 자동 스케일링을 사용하여 새 Pod에 리소스를 할당합니다.

4.5.2. 시작 검사 구성

OpenShift Serverless Serving의 경우 시작 프로브가 기본적으로 정의되지 않습니다. 배포 구성에서 컨테이너에 대한 시작 프로브를 정의할 수 있습니다.

프로세스

  • 배포 구성을 수정하여 서비스에 대한 시작 프로브를 정의합니다. 다음 예제에서는 두 개의 컨테이너가 있는 구성을 보여줍니다.

    정의된 별 프로브의 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    # ...
    spec:
      template:
        spec:
           containers:
            - name: first-container
              image: <image>
              ports:
                - containerPort: 8080
              # ...
              startupProbe: 
    1
    
              httpGet:
                port: 8080
                path: "/"
            - name: second-container
              image: <image>
              # ...
              startupProbe: 
    2
    
              httpGet:
                port: 8081
                path: "/"
    Copy to Clipboard Toggle word wrap

    1
    첫 번째 컨테이너 의 시작 프로브입니다.
    2
    두 번째 컨테이너 의 시작 프로브입니다.

4.5.3. 진행률 데드 구성

진행 상황 기한 설정을 구성하여 시스템에서 Knative 버전에 대한 실패를 보고하기 전에 배포에 허용되는 최대 시간을 지정할 수 있습니다. 이 시간 제한은 초 또는 분 단위로 지정할 수 있습니다.

진행 기한을 효과적으로 구성하려면 다음 매개변수를 고려하십시오.

  • initialDelaySeconds
  • failureThreshold
  • periodSeconds
  • timeoutSeconds

지정된 시간 제한 내에서 초기 스케일링을 달성하지 못하면 Knative Autoscaler 구성 요소가 버전을 0 으로 스케일링하고 Knative 서비스는 터미널 실패 상태가 됩니다.

기본적으로 진행 기한은 600초로 설정됩니다. 이 값은 Golang time.Duration 문자열로 지정되며 가장 가까운 초로 반올림해야 합니다.

프로세스

  • 진행률 데드라인 설정을 구성하려면 배포 구성에서 주석을 사용합니다.

    60초로 설정된 진행 상황 기한 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    ...
    spec:
      template:
        metadata:
           annotations:
                serving.knative.dev/progress-deadline: "60s"
        spec:
            containers:
                - image: ghcr.io/knative/helloworld-go:latest
    Copy to Clipboard Toggle word wrap

4.6. 다이제스트로 이미지 태그 확인

Knative Serving 컨트롤러가 컨테이너 레지스트리에 액세스할 수 있는 경우 서비스 버전을 생성할 때 Knative Serving에서 이미지 태그를 다이제스트로 확인합니다. 이를 tag-to-digest resolution 이라고 하며 배포에 대한 일관성을 제공하는 데 도움이 됩니다.

4.6.1. tag-to-digest 해결

OpenShift Container Platform의 컨테이너 레지스트리에 대한 컨트롤러 액세스 권한을 부여하려면 보안을 생성한 다음 컨트롤러 사용자 정의 인증서를 구성해야 합니다. KnativeServing CR(사용자 정의 리소스)에서 controller-custom-certs 사양을 수정하여 컨트롤러 사용자 정의 인증서를 구성할 수 있습니다. 보안은 KnativeServing CR과 동일한 네임스페이스에 있어야 합니다.

KnativeServing CR에 보안이 포함되어 있지 않은 경우 이 설정은 기본적으로 PKI(공개 키 인프라)를 사용합니다. PKI를 사용하면 클러스터 전체 인증서가 config-service-sa 구성 맵을 사용하여 Knative Serving 컨트롤러에 자동으로 삽입됩니다. OpenShift Serverless Operator는 config-service-sa 구성 맵을 클러스터 전체 인증서로 채우고 구성 맵을 컨트롤러의 볼륨으로 마운트합니다.

4.6.1.1. 시크릿을 사용하여 tag-to-digest 확인 구성

controller-custom-certs 사양에서 Secret 유형을 사용하는 경우 보안이 보안 볼륨으로 마운트됩니다. Knative 구성 요소는 보안에 필요한 인증서가 있다고 가정하면 시크릿을 직접 사용합니다.

사전 요구 사항

  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.
  • OpenShift Serverless Operator 및 Knative Serving을 클러스터에 설치했습니다.

프로세스

  1. 보안을 생성합니다.

    명령 예

    $ oc -n knative-serving create secret generic custom-secret --from-file=<secret_name>.crt=<path_to_certificate>
    Copy to Clipboard Toggle word wrap

  2. KnativeServing CR(사용자 정의 리소스)에서 Secret 유형을 사용하도록 controller-custom-certs 사양을 구성합니다.

    KnativeServing CR의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      controller-custom-certs:
        name: custom-secret
        type: Secret
    Copy to Clipboard Toggle word wrap

4.7. 배포 리소스 구성

Knative Serving에서 config-deployment 구성 맵에는 Knative 서비스에 대해 Kubernetes 배포 리소스가 구성된 방식을 결정하는 설정이 포함되어 있습니다. OpenShift Serverless Serving에서는 KnativeServing CR(사용자 정의 리소스)의 배포 섹션에서 이러한 설정을 구성할 수 있습니다.

deployment 섹션을 사용하여 다음을 구성할 수 있습니다.

  • 태그 확인
  • 런타임 환경
  • 진행 기한

4.7.1. 태그 확인 건너뛰기

OpenShift Serverless Serving에서 태그 확인을 건너뛰면 컨테이너 레지스트리에 대한 불필요한 쿼리를 피하여 배포 속도를 높일 수 있으므로 레지스트리 가용성에 대한 대기 시간과 종속성을 줄일 수 있습니다.

KnativeServing 사용자 정의 리소스(CR)의 registriesSkippingTag Re goal 설정을 수정하여 태그 확인을 건너뛰도록 Serving을 구성할 수 있습니다.

프로세스

  • KnativeServing CR에서 태그 resoution을 건너뛸 레지스트리 목록으로 registriesSkippingTag Rery 설정을 수정합니다.

    구성된 태그 확인 건너뛰기 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
    spec:
      config:
        deployment:
          registriesSkippingTagResolving: "registry.example.com, another.registry.com"
    Copy to Clipboard Toggle word wrap

4.7.2. 선택 가능한 RuntimeClassName 구성

KnativeServing 사용자 정의 리소스(CR)에서 runtime-class-name 설정을 업데이트하여 배포에 대한 특정 RuntimeClassName 리소스를 설정하도록 OpenShift Serverless Serving을 구성할 수 있습니다.

이 설정은 서비스 레이블과 상호 작용하여 기본 RuntimeClassName 또는 서비스와 연결된 가장 많은 레이블과 일치하는 항목을 적용합니다.

프로세스

  • KnativeServing CR에서 runtime-class-name 설정을 구성합니다.

    구성된 runtime-class-name 설정의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
    spec:
      config:
        deployment:
          runtime-class-name: |
            kata: {}
            gvisor:
              selector:
                my-label: selector
    Copy to Clipboard Toggle word wrap

4.7.3. 진행 기한

기본적으로 서비스에는 초기 시작을 완료하는 서비스의 시간 제한을 정의하는 진행 기한이 있습니다.

배포에 다음 조건이 발생하면 진행 기한을 늘리는 것이 좋습니다.

  • 서비스 이미지는 크기 때문에 가져오는 데 시간이 오래 걸립니다.
  • 초기 캐시 priming으로 인해 서비스가 준비 되기까지 시간이 오래 걸립니다.
  • 클러스터는 자동 스케일링을 사용하여 새 Pod에 리소스를 할당합니다.

지정된 시간 제한 내에서 초기 스케일링을 달성하지 못하면 Knative Autoscaler 구성 요소가 버전을 0 으로 스케일링하고 서비스는 터미널 실패 상태로 들어갑니다.

4.7.3.1. 진행률 데드 구성

시스템에서 Knative 버전 오류를 보고하기 전에 배포 진행 상황에 대해 허용되는 최대 시간(초) 또는 분을 설정하도록 진행 상황 기한 설정을 구성합니다.

기본적으로 진행 기한은 600초로 설정됩니다. 이 값은 Go time.Duration 문자열로 지정되며 가장 가까운 초로 반올림해야 합니다.

프로세스

KnativeServing 사용자 정의 리소스(CR)를 수정하여 진행 기한을 구성합니다.

  • KnativeServing CR에서 progressDeadline 값을 설정합니다.

    60초로 설정된 진행 상황 기한 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
    spec:
      config:
        deployment:
          progressDeadline: "60s"
    Copy to Clipboard Toggle word wrap

4.8. Kourier 구성

Kourier는 Knative Serving의 경량 Kubernetes 네이티브 Ingress입니다. Kourier는 Knative의 게이트웨이 역할을 하며 HTTP 트래픽을 Knative 서비스로 라우팅합니다.

4.8.1. 현재 Envoy 부트스트랩 구성에 액세스

Kourier의 Envoy 프록시 구성 요소는 Knative 서비스에 대한 인바운드 및 아웃바운드 HTTP 트래픽을 처리합니다. 기본적으로 Kourier에는 knative-serving-ingress 네임스페이스의 kourier-bootstrap 구성 맵에 Envoy 부트스트랩 구성이 포함되어 있습니다.

프로세스

  • 현재 Envoy 부트스트랩 구성을 가져오려면 다음 명령을 실행합니다.

    명령 예

    $ oc get cm kourier-bootstrap -n knative-serving-ingress -o yaml
    Copy to Clipboard Toggle word wrap

    예를 들어 기본 구성을 사용하면 example 명령은 다음 발췌가 포함된 출력을 생성합니다.

    출력 예

    Name:         kourier-bootstrap
    Namespace:    knative-serving-ingress
    Labels:       app.kubernetes.io/component=net-kourier
                  app.kubernetes.io/name=knative-serving
                  app.kubernetes.io/version=release-v1.10
                  networking.knative.dev/ingress-provider=kourier
                  serving.knative.openshift.io/ownerName=knative-serving
                  serving.knative.openshift.io/ownerNamespace=knative-serving
    Annotations:  manifestival: new
    Copy to Clipboard Toggle word wrap

    데이터 출력 예

    dynamic_resources:
      ads_config:
        transport_api_version: V3
        api_type: GRPC
        rate_limit_settings: {}
        grpc_services:
        - envoy_grpc: {cluster_name: xds_cluster}
      cds_config:
        resource_api_version: V3
        ads: {}
      lds_config:
        resource_api_version: V3
        ads: {}
    node:
      cluster: kourier-knative
      id: 3scale-kourier-gateway
    static_resources:
      listeners:
        - name: stats_listener
          address:
            socket_address:
              address: 0.0.0.0
              port_value: 9000
          filter_chains:
            - filters:
                - name: envoy.filters.network.http_connection_manager
                  typed_config:
                    "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                    stat_prefix: stats_server
                    http_filters:
                      - name: envoy.filters.http.router
                        typed_config:
                          "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                    route_config:
                      virtual_hosts:
                        - name: admin_interface
                          domains:
                            - "*"
                          routes:
                            - match:
                                safe_regex:
                                  regex: '/(certs|stats(/prometheus)?|server_info|clusters|listeners|ready)?'
                                headers:
                                  - name: ':method'
                                    string_match:
                                      exact: GET
                              route:
                                cluster: service_stats
      clusters:
        - name: service_stats
          connect_timeout: 0.250s
          type: static
          load_assignment:
            cluster_name: service_stats
            endpoints:
              lb_endpoints:
                endpoint:
                  address:
                    pipe:
                      path: /tmp/envoy.admin
        - name: xds_cluster
          # This keepalive is recommended by envoy docs.
          # https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol
          typed_extension_protocol_options:
            envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
              "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
              explicit_http_config:
                http2_protocol_options:
                  connection_keepalive:
                    interval: 30s
                    timeout: 5s
          connect_timeout: 1s
          load_assignment:
            cluster_name: xds_cluster
            endpoints:
              lb_endpoints:
                endpoint:
                  address:
                    socket_address:
                      address: "net-kourier-controller.knative-serving-ingress.svc.cluster.local."
                      port_value: 18000
          type: STRICT_DNS
    admin:
      access_log:
      - name: envoy.access_loggers.stdout
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
      address:
        pipe:
          path: /tmp/envoy.admin
    layered_runtime:
      layers:
        - name: static-layer
          static_layer:
            envoy.reloadable_features.override_request_timeout_by_gateway_timeout: false
    Copy to Clipboard Toggle word wrap

    BinaryData 출력 예

    Events:  <none>
    Copy to Clipboard Toggle word wrap

4.8.2. Kourier getaways의 kourier-bootstrap 사용자 정의

Kourier의 Envoy 프록시 구성 요소는 Knative 서비스에 대한 인바운드 및 아웃바운드 HTTP 트래픽을 처리합니다. 기본적으로 Kourier에는 knative-serving-ingress 네임스페이스의 kourier-bootstrap 구성 맵에 Envoy 부트스트랩 구성이 포함되어 있습니다. 이 구성 맵을 사용자 정의 맵으로 변경할 수 있습니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.

프로세스

  • KnativeServing CR(사용자 정의 리소스)에서 spec.ingress.kourier.bootstrap-configmap 필드를 변경하여 사용자 정의 부트스트랩 구성 맵을 지정합니다.

    KnativeServing CR의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      config:
        network:
          ingress-class: kourier.ingress.networking.knative.dev
      ingress:
        kourier:
          bootstrap-configmap: my-configmap
          enabled: true
    # ...
    Copy to Clipboard Toggle word wrap

4.8.3. 관리자 인터페이스 액세스 활성화

envoy 부트스트랩 구성을 변경하여 관리자 인터페이스에 액세스할 수 있습니다.

중요

이 절차에서는 envoy 부트스트랩 구성을 변경하면 Knative에 오류가 발생할 수 있으므로 Knative에 대한 충분한 지식이 있다고 가정합니다. Red Hat은 제품에 테스트되거나 제공되지 않는 사용자 정의 구성을 지원하지 않습니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.

프로세스

  1. 관리자 인터페이스 액세스를 활성화하려면 부트스트랩 구성 맵에서 이 구성을 찾습니다.

    pipe:
      path: /tmp/envoy.admin
    Copy to Clipboard Toggle word wrap

    이를 다음 구성으로 대체합니다.

    socket_address: 
    1
    
      address: 127.0.0.1
      port_value: 9901
    Copy to Clipboard Toggle word wrap
    1
    이 구성을 사용하면 루프백 주소(127.0.0.1) 및 포트 9901에서 Envoy 관리자 인터페이스에 액세스할 수 있습니다.
  2. service_stats 클러스터 구성과 admin 구성에 socket_address 구성을 적용합니다.

    1. 첫 번째는 service_stats 클러스터 구성에 있습니다.

      clusters:
        - name: service_stats
          connect_timeout: 0.250s
          type: static
          load_assignment:
            cluster_name: service_stats
            endpoints:
              lb_endpoints:
                endpoint:
                  address:
                    socket_address:
                      address: 127.0.0.1
                      port_value: 9901
      Copy to Clipboard Toggle word wrap
    2. 두 번째는 관리자 구성에 있습니다.

      admin:
        access_log:
          - name: envoy.access_loggers.stdout
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
        address:
          socket_address:
            address: 127.0.0.1
            port_value: 9901
      Copy to Clipboard Toggle word wrap

4.9. 제한적인 네트워크 정책

4.9.1. 제한적인 네트워크 정책이 있는 클러스터

여러 사용자가 액세스할 수 있는 클러스터를 사용하는 경우 클러스터는 네트워크 정책을 사용하여 네트워크를 통해 서로 통신할 수 있는 pod, 서비스 및 네임스페이스를 제어할 수 있습니다. 클러스터에서 제한적인 네트워크 정책을 사용하는 경우 Knative 시스템 Pod가 Knative 애플리케이션에 액세스할 수 없습니다. 예를 들어 네임스페이스에 모든 요청을 거부하는 다음 네트워크 정책이 있는 경우 Knative 시스템 Pod가 Knative 애플리케이션에 액세스할 수 없습니다.

네임스페이스에 대한 모든 요청을 거부하는 NetworkPolicy 오브젝트의 예

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-by-default
  namespace: example-namespace
spec:
  podSelector:
  ingress: []
Copy to Clipboard Toggle word wrap

Knative 시스템 Pod에서 애플리케이션에 액세스할 수 있도록 하려면 각 Knative 시스템 네임스페이스에 레이블을 추가한 다음 이 레이블이 있는 다른 네임스페이스의 네임스페이스에 액세스할 수 있는 애플리케이션 네임스페이스에 NetworkPolicy 오브젝트를 생성해야 합니다.

중요

클러스터의 비Knative 서비스에 대한 요청을 거부하는 네트워크 정책은 이러한 서비스에 대한 액세스를 계속 차단합니다. 그러나 Knative 시스템 네임스페이스에서 Knative 애플리케이션으로의 액세스를 허용하면 클러스터의 모든 네임스페이스에서 Knative 애플리케이션에 액세스할 수 있습니다.

클러스터의 모든 네임스페이스에서 Knative 애플리케이션에 대한 액세스를 허용하지 않으려면 Knative 서비스에 JSON 웹 토큰 인증을 대신 사용할 수 있습니다. Knative 서비스에 대한 JSON 웹 토큰 인증에는 Service Mesh가 필요합니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.

프로세스

  1. 애플리케이션에 액세스해야 하는 각 Knative 시스템 네임스페이스에 knative.openshift.io/system-namespace=true 레이블을 추가합니다.

    1. knative-serving 네임스페이스에 레이블을 지정합니다.

      $ oc label namespace knative-serving knative.openshift.io/system-namespace=true
      Copy to Clipboard Toggle word wrap
    2. knative-serving-ingress 네임스페이스에 레이블을 지정합니다.

      $ oc label namespace knative-serving-ingress knative.openshift.io/system-namespace=true
      Copy to Clipboard Toggle word wrap
    3. knative-eventing 네임스페이스에 레이블을 지정합니다.

      $ oc label namespace knative-eventing knative.openshift.io/system-namespace=true
      Copy to Clipboard Toggle word wrap
    4. knative-kafka 네임스페이스에 레이블을 지정합니다.

      $ oc label namespace knative-kafka knative.openshift.io/system-namespace=true
      Copy to Clipboard Toggle word wrap
  2. 애플리케이션 네임스페이스에 NetworkPolicy 오브젝트를 생성하여 knative.openshift.io/system-namespace 레이블이 있는 네임스페이스에서 액세스를 허용합니다.

    NetworkPolicy 오브젝트 예

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: <network_policy_name> 
    1
    
      namespace: <namespace> 
    2
    
    spec:
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              knative.openshift.io/system-namespace: "true"
      podSelector: {}
      policyTypes:
      - Ingress
    Copy to Clipboard Toggle word wrap

    1
    네트워크 정책의 이름을 제공합니다.
    2
    애플리케이션이 있는 네임스페이스입니다.

4.10. 버전 제한 시간 구성

버전에 대한 시간 초과 기간을 전역적으로 또는 개별적으로 구성하여 요청에 소요되는 시간을 제어할 수 있습니다.

4.10.1. 버전 제한 시간 구성

요청에 따라 버전 시간 초과에 대한 기본 시간(초)을 구성할 수 있습니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한 또는 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 관리자 권한이 있습니다.

프로세스

  • 버전 시간 초과를 구성하는 적절한 방법을 선택합니다.

    • 버전 시간 초과를 전역적으로 구성하려면 KnativeServing 사용자 정의 리소스(CR)에서 revision-timeout-seconds 필드를 설정합니다.

      apiVersion: operator.knative.dev/v1beta1
      kind: KnativeServing
      metadata:
        name: knative-serving
        namespace: knative-serving
      spec:
        config:
          defaults:
            revision-timeout-seconds: "300"
      Copy to Clipboard Toggle word wrap
    • 서비스 정의에서 timeoutSeconds 필드를 설정하여 버전당 시간 제한을 구성하려면 다음을 수행합니다.

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        namespace: my-ns
      spec:
        template:
          spec:
            timeoutSeconds: 300
            containers:
            - image: ghcr.io/knative/helloworld-go:latest
      Copy to Clipboard Toggle word wrap

4.10.2. 최대 버전 제한 시간 구성

최대 버전 제한 시간을 설정하면 버전이 특정 제한을 초과할 수 없도록 할 수 있습니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한 또는 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 관리자 권한이 있습니다.

프로세스

  • 최대 버전 시간 제한을 구성하려면 KnativeServing CR(사용자 정의 리소스)에서 max-revision-timeout-seconds 필드를 설정합니다.

    If this value is increased, the activator `terminationGracePeriodSeconds` should also be increased to prevent in-flight requests being disrupted.
    Copy to Clipboard Toggle word wrap
    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      config:
        defaults:
          max-revision-timeout-seconds: "600"
    Copy to Clipboard Toggle word wrap

5장. 서버리스 애플리케이션 디버깅

다양한 방법을 사용하여 Serverless 애플리케이션의 문제를 해결할 수 있습니다.

5.1. 터미널 출력 확인

배포 명령 출력을 확인하여 배포 성공 여부를 확인할 수 있습니다. 배포 프로세스가 종료되면 배포에 실패한 이유를 설명하는 오류 메시지가 출력에 표시되어야 합니다. 이러한 유형의 오류는 매니페스트가 잘못 구성되었거나 잘못된 명령으로 인해 가장 많이 발생합니다.

프로세스

  • 애플리케이션을 배포하고 관리하는 클라이언트에서 명령 출력을 엽니다. 다음 예제는 실패한 oc apply 명령 뒤에 표시될 수 있는 오류입니다.

    Error from server (InternalError): error when applying patch:
    {"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"serving.knative.dev/v1\",\"kind\":\"Route\",\"metadata\":{\"annotations\":{},\"name\":\"route-example\",\"namespace\":\"default\"},\"spec\":{\"traffic\":[{\"configurationName\":\"configuration-example\",\"percent\":50}]}}\n"}},"spec":{"traffic":[{"configurationName":"configuration-example","percent":50}]}}
    to:
    &{0xc421d98240 0xc421e77490 default route-example STDIN 0xc421db0488 264682 false}
    for: "STDIN": Internal error occurred: admission webhook "webhook.knative.dev" denied the request: mutation failed: The route must have traffic percent sum equal to 100.
    ERROR: Non-zero return code '1' from command: Process exited with status 1
    Copy to Clipboard Toggle word wrap

    이 출력은 경로 트래픽 백분율을 100으로 구성해야 함을 나타냅니다.

5.2. Pod 상태 확인

Serverless 애플리케이션의 문제를 식별하려면 Pod 오브젝트의 상태를 확인해야 할 수 있습니다.

프로세스

  1. 다음 명령을 실행하여 배포의 모든 Pod를 나열합니다.

    $ oc get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                                      READY     STATUS             RESTARTS   AGE
    configuration-example-00001-deployment-659747ff99-9bvr4   2/2       Running            0          3h
    configuration-example-00002-deployment-5f475b7849-gxcht   1/2       CrashLoopBackOff   2          36s
    Copy to Clipboard Toggle word wrap

    출력에서 상태에 대한 선택한 데이터가 있는 모든 Pod를 볼 수 있습니다.

  2. 다음 명령을 실행하여 Pod 상태에 대한 자세한 정보를 확인합니다.

    출력 예

    $ oc get pod <pod_name> --output yaml
    Copy to Clipboard Toggle word wrap

    출력에서 conditionscontainerStatuses 필드는 디버깅에 특히 유용할 수 있습니다.

5.3. 버전 상태 확인

Serverless 애플리케이션의 문제를 식별하려면 버전 상태를 확인해야 할 수 있습니다.

프로세스

  1. Configuration 오브젝트로 경로를 구성하는 경우 다음 명령을 실행하여 배포에 생성된 Revision 오브젝트의 이름을 가져옵니다.

    $ oc get configuration <configuration_name> --output jsonpath="{.status.latestCreatedRevisionName}"
    Copy to Clipboard Toggle word wrap

    OpenShift Route 리소스를 정의하여 라우팅 설정을 지정하는 Route.yaml 파일에서 구성 이름을 찾을 수 있습니다.

    리버전으로 경로를 직접 구성하는 경우 Route.yaml 파일에서 버전 이름을 조회합니다.

  2. 다음 명령을 실행하여 버전 상태를 쿼리합니다.

    $ oc get revision <revision-name> --output yaml
    Copy to Clipboard Toggle word wrap

    준비된 버전에는 ServiceReady,status: "True", type: Ready 조건이 있어야 합니다. 이러한 조건이 있는 경우 Pod 상태 또는 Istio 라우팅을 확인할 수 있습니다. 그렇지 않으면 리소스 상태에 오류 메시지가 포함됩니다.

5.4. Ingress 상태 확인

Serverless 애플리케이션의 문제를 식별하려면 Ingress 상태를 확인해야 할 수 있습니다.

프로세스

  • 다음 명령을 실행하여 Ingress의 IP 주소를 확인합니다.

    $ oc get svc -n istio-system istio-ingressgateway
    Copy to Clipboard Toggle word wrap

    istio-ingressgateway 서비스는 Knative에서 사용하는 LoadBalancer 서비스입니다.

    외부 IP 주소가 없는 경우 다음 명령을 실행합니다.

    $ oc describe svc istio-ingressgateway -n istio-system
    Copy to Clipboard Toggle word wrap

    이 명령은 IP 주소가 프로비저닝되지 않은 이유를 출력합니다. 대부분의 경우 할당량 문제로 인해 발생할 수 있습니다.

5.5. 경로 상태 확인

경우에 따라 Route 오브젝트에 문제가 있습니다. OpenShift CLI(oc)를 사용하여 해당 상태를 확인할 수 있습니다.

프로세스

  • 다음 명령을 실행하여 애플리케이션을 배포한 Route 오브젝트의 상태를 확인합니다.

    $ oc get route <route_name> --output yaml
    Copy to Clipboard Toggle word wrap

    & lt;route_name& gt;을 Route 오브젝트의 이름으로 바꿉니다.

    status 오브젝트의 conditions 오브젝트는 실패의 경우 이유를 표시합니다.

5.6. Ingress 및 Istio 라우팅 확인

Istio를 Ingress 계층으로 사용하면 Ingress 및 Istio 라우팅에 문제가 있습니다. OpenShift CLI(oc)를 사용하여 세부 정보를 확인할 수 있습니다.

프로세스

  1. 다음 명령을 실행하여 모든 Ingress 리소스 및 해당 레이블을 나열합니다.

    $ oc get ingresses.networking.internal.knative.dev -o=custom-columns='NAME:.metadata.name,LABELS:.metadata.labels'
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME            LABELS
    helloworld-go   map[serving.knative.dev/route:helloworld-go serving.knative.dev/routeNamespace:default serving.knative.dev/service:helloworld-go]
    Copy to Clipboard Toggle word wrap

    이 출력에서 serving.knative.dev/routeserving.knative.dev/routeNamespace 는 Ingress 리소스가 있는 경로를 나타냅니다. 경로 및 Ingress가 나열되어야 합니다.

    Ingress가 없는 경우 경로 컨트롤러는 경로 또는 Service 오브젝트에서 대상으로 하는 Revision 오브젝트가 준비되지 않은 것으로 가정합니다. 다른 디버깅 절차를 진행하여 버전 준비 상태를 진단합니다.

  2. Ingress가 나열된 경우 다음 명령을 실행하여 경로에 대해 생성된 ClusterIngress 오브젝트를 검사합니다.

    $ oc get ingresses.networking.internal.knative.dev <ingress_name> --output yaml
    Copy to Clipboard Toggle word wrap

    출력의 status 섹션에서 type=Ready 조건이 True 인 경우 Ingress가 올바르게 작동합니다. 그렇지 않으면 출력에 오류 메시지가 포함됩니다.

  3. Ingress의 상태가 Ready 이면 해당 VirtualService 오브젝트가 있습니다. 다음 명령을 실행하여 VirtualService 오브젝트의 구성을 확인합니다.

    $ oc get virtualservice -l networking.internal.knative.dev/ingress=<ingress_name> -n <ingress_namespace> --output yaml
    Copy to Clipboard Toggle word wrap

    VirtualService 오브젝트의 네트워크 구성이 IngressRoute 오브젝트의 네트워크 구성과 일치해야 합니다. VirtualService 오브젝트가 Status 필드를 노출하지 않기 때문에 설정이 전파될 때까지 기다려야 할 수 있습니다.

6장. Kourier 및 Istio 인그레스

OpenShift Serverless에서는 다음 두 가지 수신 솔루션을 지원합니다.

  • Kourier
  • Red Hat OpenShift Service Mesh를 사용하는 Istio

기본값은 Kourier입니다.

6.1. Kourier 및 Istio 인그레스 솔루션

6.1.1. Kourier

Kourier는 OpenShift Serverless의 기본 수신 솔루션입니다. 다음과 같은 속성이 있습니다.

  • envoy 프록시를 기반으로 합니다.
  • 단순하고 가벼움이 있습니다.
  • Serverless에서 기능 집합을 제공하는 데 필요한 기본 라우팅 기능을 제공합니다.
  • 기본 관찰 기능 및 메트릭을 지원합니다.
  • Knative 서비스 라우팅의 기본 TLS 종료를 지원합니다.
  • 제한된 구성 및 확장 옵션만 제공합니다.

6.1.2. OpenShift Service Mesh를 사용하는 Istio

Istio를 OpenShift Serverless의 수신 솔루션으로 사용하면 Red Hat OpenShift Service Mesh가 제공하는 기능을 기반으로 하는 추가 기능 세트가 활성화됩니다.

  • 모든 연결 간의 기본 mTLS
  • 서버리스 구성 요소는 서비스 메시의 일부입니다.
  • 추가 관찰 기능 및 메트릭
  • 인증 및 인증 지원
  • Red Hat OpenShift Service Mesh에서 지원하는 사용자 정의 규칙 및 구성

그러나 추가 기능은 더 높은 오버헤드와 리소스 소비를 제공합니다. 자세한 내용은 Red Hat OpenShift Service Mesh 설명서를 참조하십시오.

Istio 요구 사항 및 설치 지침은 Serverless 문서의 "OpenShift Serverless를 사용하여 서비스 메시 통합" 섹션을 참조하십시오.

6.1.3. 트래픽 구성 및 라우팅

Kourier 또는 Istio 사용 여부에 관계없이 Knative 서비스의 트래픽은 net-kourier-controller 또는 net-istio-controller 에 의해 knative-serving 네임스페이스에 구성됩니다.

컨트롤러는 KnativeService 및 해당 하위 사용자 정의 리소스를 읽고 수신 솔루션을 구성합니다. 두 수신 솔루션 모두 트래픽 경로의 일부가 되는 수신 게이트웨이 Pod를 제공합니다. 두 수신 솔루션은 모두 Envoy를 기반으로 합니다. 기본적으로 Serverless에는 각 KnativeService 오브젝트에 대해 두 개의 경로가 있습니다.

  • OpenShift 라우터에서 전달하는 클러스터 외부 경로 (예: myapp-namespace.example.com )
  • 클러스터 도메인을 포함하는 클러스터 로컬 경로 (예: myapp.namespace.svc.cluster.local ) 이 도메인은 Knative 또는 기타 사용자 워크로드에서 Knative 서비스를 호출하는 데 사용할 수 있습니다.

수신 게이트웨이는 serve 모드 또는 프록시 모드에서 요청을 전달할 수 있습니다.

  • serve 모드에서 요청은 Knative 서비스의 Queue-Proxy 사이드카 컨테이너로 직접 이동합니다.
  • 프록시 모드에서 요청은 먼저 knative-serving 네임스페이스의 Activator 구성 요소를 통과합니다.

모드 선택은 Knative, Knative 서비스 및 현재 트래픽의 구성에 따라 달라집니다. 예를 들어 Knative 서비스가 0으로 스케일링되면 새 Knative 서비스 Pod가 시작될 때까지 버퍼 역할을 하는 Activator 구성 요소로 요청이 전송됩니다.

7장. 전송 암호화 제공

OpenShift Serverless Serving 전송 암호화를 활성화하여 TLS를 사용하여 보안 및 암호화된 HTTPS 연결을 통해 데이터를 전송할 수 있습니다.

중요

OpenShift Serverless Serving 전송 암호화는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

중요

전송 암호화 제공은 Kourier에서 Ingress 계층으로만 사용할 수 있습니다. Red Hat OpenShift Service Mesh의 경우 서비스 메시 mTLS 기능을 사용하여 암호화된 트래픽을 확인합니다.

7.1. Serving 전송 암호화 개요

OpenShift Serverless Serving 전송 암호화에는 다음 세 부분이 있습니다.

외부 도메인 암호화
클러스터 외부에 있는 수신 계층의 암호화입니다. 예를 들어 myapp-<namespace>.example.com 과 같은 클러스터 외부 도메인은 다음과 같습니다.
클러스터 로컬 암호화
클러스터 내부 수신 계층의 암호화입니다. 예를 들어 myapp.<namespace>.svc.cluster.local과 같은 클러스터 로컬 도메인입니다.
시스템 내부 암호화
ingress-gateway,activatorqueue-proxy Knative 내부 구성 요소 간의 전송 암호화입니다.
중요

Kubernetes PreStopHooks, metadata, metrics를 포함한 컨트롤 플레인 트래픽에는 사용자 데이터가 포함되어 있지 않으며 암호화되지 않습니다.

서로 다른 부분은 서로 독립적이며 개별적으로 활성화 및 비활성화할 수 있습니다. 동일하거나 다른 인증 기관(CA)을 사용하여 필요한 인증서에 서명할 수 있습니다.

참고

다이어그램은 전송 암호화에 대한 자세한 내용은 OpenShift Serverless Serving 전송 암호화를 참조하십시오.

7.1.1. 외부 도메인 암호화

외부 도메인의 전송 암호화는 OpenShift Container Platform 인그레스 또는 Red Hat OpenShift Service Mesh 중 하나인 클러스터의 수신 계층에 의해 처리됩니다.

7.1.2. 클러스터 로컬 암호화

클러스터 로컬 암호화를 사용하면 클러스터 로컬 도메인에 대한 전송 암호화를 사용할 수 있습니다. 다음과 같은 속성이 있습니다.

  • CN(Certificate Common Name) 또는 SAN(Subject Alternative Name)에는 Knative 서비스의 클러스터 로컬 도메인(예: myapp.namespace.svc.cluster.local,myapp.namespace.svc,myapp.namespace )이 포함되어 있습니다.
  • ingress-controller 구성 요소의 cluster-local 끝점은 SNI를 사용하여 인증서를 선택합니다.
  • 인증서를 생성하려면 Knative에서 cert-manager 를 사용합니다. 이 에서는 기능이 작동하도록 설치하고 구성해야 합니다. 자세한 내용은 cert-manager Operator for Red Hat OpenShift 에서 참조하십시오.
중요

호출자는 클러스터 로컬 인증서에 서명한 CA를 신뢰해야 합니다. OpenShift Serverless의 범위를 벗어납니다.

7.1.3. 시스템 내부 암호화

system-internal 암호화는 ingress-gateway,activatorqueue-proxy Knative 내부 구성 요소에 대한 전송 암호화를 활성화합니다. 이러한 구성 요소는 이 구성이 사용될 때 TLS 끝점을 호스팅합니다.

이 기능을 사용하려면 다음 사전 요구 사항을 충족해야 합니다.

  • OpenShift Serverless에서 인증서를 가져오려면 cert-manager 를 설치하고 구성해야 합니다.
  • 특정 SAN은 각 연결을 확인하는 데 사용됩니다. 각 구성 요소는 인증서에 서명한 CA를 신뢰해야 합니다. 이 요구 사항을 충족하기 위해 OpenShift Serverless 시스템 구성 요소는 CA 번들을 사용하고 신뢰합니다. 클러스터 관리자가 CA 번들을 제공해야 합니다.

7.2. 인증서 발행자 선택

발행자는 cert-manager 발행자 및 클러스터 발행자를 나타냅니다. 인증서 서명 요청을 준수하여 서명된 인증서를 생성할 수 있는 CA(인증 기관)를 나타냅니다. 자세한 내용은 발급자에 대한 cert-manager 설명서를 참조하십시오.

사용하는 암호화 기능에 따라 OpenShift Serverless에서 인증서 발행자가 특정 인증서에 서명할 수 있어야 합니다. 인증서 발행자를 식별하려면 다음 예제가 포함된 cert-manager 통합 목록을 참조하십시오.

  • Kubernetes 보안에 저장된 사용자 정의 CA
  • HTTP-01 과제
  • DNS-01 과제
  • 자체 서명된 발행자

7.2.1. 호환되는 인증서 발행자

각 Knative Serving 암호화 기능에 대해 모든 발급자 유형이 작동하는 것은 아닙니다.

  • 클러스터 로컬 암호화의 경우 발급자는 다음 클러스터 로컬 도메인 유형의 인증서에 서명할 수 있어야 합니다.

    • myapp.<namespace>
    • myapp.<namespace>.svc
    • myapp.<namespace>.svc.cluster.local

    일반적으로 CA는 클러스터 내에 없으므로 ACME(Automated Certificate Management Environment) 프로토콜(DNS01/HTTP01)을 사용하여 확인할 수 없습니다. cert-manager CA 발행자와 같은 이러한 인증서를 생성할 수 있는 발급자를 사용할 수 있습니다.

  • 시스템 내부 암호화의 경우 발행자는 다음 SAN(Subject Alternative Names)을 사용하여 인증서에 서명할 수 있어야 합니다.

    • kn-routing
    • kn-user-<namespace > 형식의 이름입니다. 여기서 < namespace >는 Knative 서비스가 생성되는 네임스페이스입니다.
    • data-plane.knative.dev

    Knative에는 내부 구성 요소 간 연결을 확인하려면 이러한 SAN이 필요합니다. ACME 프로토콜(DNS01/HTTP01)을 사용할 수 없으므로 이러한 인증서를 생성할 수 있는 발행자를 구성해야 합니다(예: cert-manager CA 발행자).

7.3. OpenShift Serverless 전송 암호화 설정

사전 요구 사항

  • 클러스터 관리자 액세스 권한이 있는 OpenShift Container Platform 계정에 액세스할 수 있습니다.
  • {oc-first}를 설치합니다.
  • cert-manager Operator for Red Hat OpenShift를 설치합니다.
  • OpenShift Serverless Operator를 설치합니다.
중요

cert-manager Operator for Red Hat OpenShift를 설치하기 전에 OpenShift Serverless Operator를 설치하는 경우 knative-serving 네임스페이스에서 컨트롤러 및 활성화자 배포를 다시 시작해야 합니다. 이러한 배포를 다시 시작하지 않으면 Knative에서 필요한 cert-manager 리소스가 생성되지 않아 Knative 서비스가 보류되어 Knative Serving cert-manager 통합을 활성화하지 못합니다.

7.3.1. 자체 서명 클러스터 발행자 구성

다음 절차에서는 루트 인증서로 SelfSigned 발행자를 사용합니다. 이 방법의 영향 및 제한 사항에 대한 자세한 내용은 SelfSigned cert-manager 설명서를 참조하십시오.

회사별 개인 키 인프라(PKI)를 관리하는 경우 CA 발행자를 사용합니다. 자세한 내용은 CA 발행자에 대한 cert-manager 설명서를 참조하십시오.

프로세스

  1. 자체 서명된 ClusterIssuer 사용자 정의 리소스(CR)를 생성합니다.

    ClusterIssuer CR의 예

    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: knative-serving-selfsigned-issuer
    spec:
      selfSigned: {}
    Copy to Clipboard Toggle word wrap

  2. 다음 명령을 실행하여 ClusterIssuer CR을 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  3. ClusterIssuer CR을 참조하는 루트 인증서를 생성합니다.

    루트 인증서 예

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: knative-serving-selfsigned-ca
      namespace: cert-manager 
    1
    
    spec:
      secretName: knative-serving-ca 
    2
    
    
      isCA: true
      commonName: selfsigned-ca
      privateKey:
        algorithm: ECDSA
        size: 256
    
      issuerRef:
        name: knative-serving-selfsigned-issuer
        kind: ClusterIssuer
        group: cert-manager.io
    Copy to Clipboard Toggle word wrap

    1
    기본적으로 cert-manager Operator for Red Hat OpenShift 네임 스페이스 cert-manager.
    2
    나중에 Knative Serving의 ClusterIssuer CR에 사용되는 시크릿 이름입니다.
  4. 다음 명령을 실행하여 인증서 CR을 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap

7.3.2. Serving에서 사용할 ClusterIssuer 생성

Serving으로 인증서 사용을 활성화하려면 클러스터 발행자를 생성해야 합니다.

프로세스

  1. Serving용 knative-serving-ca-issuer ClusterIssuer 를 생성합니다.

    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: knative-serving-ca-issuer
    spec:
      ca:
        secretName: knative-serving-ca 
    1
    Copy to Clipboard Toggle word wrap
    1
    OpenShift Serverless Serving 구성 요소에서 새 인증서에 사용할 수 있는 인증서가 포함된cert-manager Operator for Red Hat OpenShift 네임 스페이스(기본적으로 cert-manager)의 시크릿 이름입니다.
  2. 다음 명령을 실행하여 ClusterIssuer 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap

7.3.3. 전송 암호화 구성

전송 암호화 구성은 다음 두 부분으로 구성됩니다.

  1. 사용할 ClusterIssuer 발행자를 지정합니다.

    • clusterLocalIssuerRef: Ingress에 사용되는 cluster-local-domain 인증서에 대한 issuer입니다.
    • systemInternalIssuerRef: Knative 내부 구성 요소에서 사용하는 system-internal-tls 인증서에 대한 인증서의 경우 발행자입니다.
  2. 사용할 전송 암호화 기능 지정:

    • cluster-local-domain-tls: cluster-local 도메인에 대한 전송 암호화 기능 사용
    • system-internal-tls: OpenShift Serverless Serving 내부 구성 요소에 대한 전송 암호화 기능을 활성화합니다.

프로세스

  1. KnativeServing 리소스에서 전송 암호화를 활성화합니다.

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      ...
      config:
        certmanager:
          clusterLocalIssuerRef: |
            kind: ClusterIssuer
            name: knative-serving-ca-issuer 
    1
    
          systemInternalIssuerRef: |
            kind: ClusterIssuer
            name: knative-serving-ca-issuer 
    2
    
        network:
          cluster-local-domain-tls: Enabled 
    3
    
          system-internal-tls: Enabled 
    4
    Copy to Clipboard Toggle word wrap
    1
    각 기능에 대한 클러스터 발행자를 정의합니다. 동일하거나 개별 클러스터 발행자를 사용할 수 있습니다.
    2
    클러스터 발행자를 정의합니다.
    3
    cluster-local-domain-tls 기능을 활성화합니다. 이 및 기타 기능은 개별적으로 활성화하거나 비활성화할 수 있습니다.
    4
    system-internal-tls 기능을 활성화합니다.
  2. 다음 명령을 실행하여 KnativeServing 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  3. 필요한 경우 Ingress 컨트롤러의 defaultCertificate 값을 변경합니다.

    apiVersion: operator.openshift.io/v1
    kind: IngressController
     ...
    spec:
      defaultCertificate:
        name: ca-ingress-cert
    Copy to Clipboard Toggle word wrap
  4. defaultCertificate 값을 변경한 경우 KnativeServing 사용자 정의 리소스의 openshift-ingress-default-certificate 필드에 사용자 정의 인증서 이름을 지정해야 합니다.

    예를 들어 사용자 정의 인증서 이름이 ca-ingress-cert 인 경우 다음 구성을 추가합니다.

    ...
    spec:
      config:
        network:
          system-internal-tls: Enabled
          openshift-ingress-default-certificate: "ca-ingress-cert"
    ...
    Copy to Clipboard Toggle word wrap
  5. cluster-local-domain-tls 또는 system-internal-tls 를 활성화한 경우 다음 명령을 실행하여 컨트롤러 구성 요소를 다시 시작합니다.

    중요

    cluster-local-domain-tls 또는 system-internal-tls 기능이 활성화된 경우 Knative Serving cert-manager 통합을 활성화하려면 컨트롤러 구성 요소를 다시 시작해야 합니다.

    $ oc rollout restart deploy/controller -n knative-serving
    Copy to Clipboard Toggle word wrap
  6. system-internal-tls 를 활성화한 경우 다음 명령을 실행하여 Activator 구성 요소를 다시 시작합니다.

    중요

    system-internal-tls 기능이 활성화되면 런타임 중에 사용할 수 없으므로 활성화 구성 요소를 다시 시작하여 내부 웹 서버를 재구성해야 합니다.

    $ oc rollout restart deploy/activator -n knative-serving
    Copy to Clipboard Toggle word wrap

7.4. 신뢰 구성

전송 암호화 기능을 활성화할 때 호출하는 모든 클라이언트가 전송 암호화에 사용되는 인증서를 발급하도록 CA(인증 기관)를 신뢰해야 합니다.

신뢰를 보장해야 하는 여러 위치가 있습니다.

  • 브라우저 또는 기타 애플리케이션과 같은 클러스터 외부 클라이언트입니다. OpenShift Serverless의 범위를 벗어납니다.
  • Activator, Queue-Proxy, Ingress-Controller와 같은 OpenShift Serverless 시스템 구성 요소.
  • Knative 서비스 또는 기타 워크로드와 같은 클러스터 내부 클라이언트입니다.

OpenShift Serverless Serving 구성 요소 및 Knative 서비스가 인증서를 발급하는 CA를 신뢰하도록 하려면 networking.knative.dev/trust-bundle: true 라벨을 사용하여 다음 네임스페이스에 ConfigMap을 생성할 수 있습니다.

knative-serving
OpenShift Serverless Serving의 시스템 구성 요소입니다.
knative-serving-ingress
OpenShift Serverless Serving의 수신 계층입니다.
Istio-system 또는 자체 Service Mesh 네임스페이스
Service Mesh 통합이 활성화된 경우

Knative는 이름에 관계없이 ConfigMap의 모든 데이터 키를 이 라벨을 사용하여 읽습니다. 하나의 키는 하나 이상의 CA 또는 중간 인증서를 포함할 수 있습니다. 유효한 경우 Knative 구성 요소의 신뢰 저장소에 추가됩니다.

다음은 예제 ConfigMap입니다.

apiVersion: v1
data:
  cacerts.pem: | 
1

    -----BEGIN CERTIFICATE-----
    MIIDDTCCAfWgAwIBAgIQMQuip05h7NLQq2TB+j9ZmTANBgkqhkiG9w0BAQsFADAW
    MRQwEgYDVQQDEwtrbmF0aXZlLmRldjAeFw0yMzExMjIwOTAwNDhaFw0yNDAyMjAw
    OTAwNDhaMBYxFDASBgNVBAMTC2tuYXRpdmUuZGV2MIIBIjANBgkqhkiG9w0BAQEF
    AAOCAQ8AMIIBCgKCAQEA3clC3CV7sy0TpUKNuTku6QmP9z8JUCbLCPCLACCUc1zG
    FEokqOva6TakgvAntXLkB3TEsbdCJlNm6qFbbko6DBfX6rEggqZs40x3/T+KH66u
    4PvMT3fzEtaMJDK/KQOBIvVHrKmPkvccUYK/qWY7rgBjVjjLVSJrCn4dKaEZ2JNr
    Fd0KNnaaW/dP9/FvviLqVJvHnTMHH5qyRRr1kUGTrc8njRKwpHcnUdauiDoWRKxo
    Zlyy+MhQfdbbyapX984WsDjCvrDXzkdGgbRNAf+erl6yUm6pHpQhyFFo/zndx6Uq
    QXA7jYvM2M3qCnXmaFowidoLDsDyhwoxD7WT8zur/QIDAQABo1cwVTAOBgNVHQ8B
    Af8EBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAd
    BgNVHQ4EFgQU7p4VuECNOcnrP9ulOjc4J37Q2VUwDQYJKoZIhvcNAQELBQADggEB
    AAv26Vnk+ptQrppouF7yHV8fZbfnehpm07HIZkmnXO2vAP+MZJDNrHjy8JAVzXjt
    +OlzqAL0cRQLsUptB0btoJuw23eq8RXgJo05OLOPQ2iGNbAATQh2kLwBWd/CMg+V
    KJ4EIEpF4dmwOohsNR6xa/JoArIYH0D7gh2CwjrdGZr/tq1eMSL+uZcuX5OiE44A
    2oXF9/jsqerOcH7QUMejSnB8N7X0LmUvH4jAesQgr7jo1JTOBs7GF6wb+U76NzFa
    8ms2iAWhoplQ+EHR52wffWb0k6trXspq4O6v/J+nq9Ky3vC36so+G1ZFkMhCdTVJ
    ZmrBsSMWeT2l07qeei2UFRU=
    -----END CERTIFICATE-----
kind: ConfigMap
metadata:
  labels:
    networking.knative.dev/trust-bundle: "true"
  name: knative-bundle 
2

  namespace: knative-serving
Copy to Clipboard Toggle word wrap
1
구성 요소 제공에서는 유효한 PEM 인코딩 CA 번들이 포함된 모든 키를 신뢰합니다.
2
임의의 이름을 사용할 수 있습니다.
중요

CA 번들 ConfigMap이 생성 또는 업데이트되면 Serving 구성 요소가 자동으로 이를 선택하여 CA 또는 중간 인증서를 CA 신뢰 저장소에 추가합니다. 신뢰 저장소는 모든 새로운 HTTP 연결에 대해 새로 고쳐집니다.

7.4.2. 사용자 정의 워크로드에 대한 신뢰 구성

OpenShift Serverless Serving이 모든 워크로드를 제어하고 신뢰를 관리하는 것은 런타임 및 언어에 따라 크게 달라지므로 사용자 지정 워크로드는 OpenShift Serverless의 범위를 벗어납니다. 다음은 사용자 정의 워크로드에 대한 기타 옵션입니다.

  • 빌드 시 컨테이너 이미지에 CA 번들 추가 이렇게 하면 CA가 회전할 때 모든 애플리케이션을 다시 빌드하고 재배포해야 하므로 CA 교체가 어려워집니다.
  • 시크릿 또는 ConfigMap과 같은 파일 시스템에 CA 번들을 마운트하고 애플리케이션에서 TLS 연결을 확인하는 데 사용합니다.
  • 환경 변수에서 CA 번들을 읽고 애플리케이션이 TLS 연결을 확인하는 데 사용하는지 확인합니다.
  • Kubernetes API를 사용하여 시크릿 또는 ConfigMap에서 CA 번들에 액세스하고 애플리케이션에서 TLS 연결을 확인하는 데 사용하는지 확인합니다.

7.5. 원활한 CA 교체 확인

원활한 CA 교체를 보장하는 것은 서비스 다운 타임을 피하거나 긴급 상황을 처리하는 데 필수적입니다.

프로세스

  1. 새 CA 인증서를 생성합니다.
  2. "OpenShift Serverless Operator Serving 구성 요소 및 Knative 서비스" 섹션에 설명된 대로 새 CA 인증서의 공개 키를 CA 신뢰 번들에 추가합니다. 기존 CA의 공개 키를 유지합니다.
  3. 모든 클라이언트가 최신 CA 신뢰 번들 세트를 사용하는지 확인합니다. OpenShift Serverless Serving 구성 요소는 변경된 CA 신뢰 번들을 자동으로 다시 로드합니다.
  4. 신뢰 번들을 사용하는 사용자 정의 워크로드가 있는 경우 그에 따라 다시 로드하거나 다시 시작합니다.
  5. 새 CA 인증서가 포함된 시크릿을 참조하도록 knative-serving-ca-issuer 클러스터 발행자를 업데이트합니다.
  6. cert-manager 가 모든 인증서를 갱신하거나 이를 적용하여 모든 인증서를 갱신할 때까지 기다립니다. 자세한 내용은 cert-manager 설명서를 참조하십시오.
  7. CA 순환이 완전히 완료되면 이전 CA의 공개 키를 신뢰 번들 configmap에서 제거할 수 있습니다. 모든 구성 요소가 변경 사항을 적용할 수 있는 충분한 시간을 허용합니다.

7.6. 전송 암호화가 활성화되었는지 확인

프로세스

  1. Knative 서비스를 생성합니다.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: test-webapp
      namespace: test-namespace
    spec:
      template:
        spec:
          containers:
            - image: docker.io/openshift/hello-openshift
              env:
                - name: RESPONSE
                  value: "Hello Serverless!"
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 Knative 서비스 YAML을 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  3. Knative 서비스의 상태를 검사합니다.

    명령 예

    $ oc get ksvc -n test-namespace -o yaml
    Copy to Clipboard Toggle word wrap

    출력 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: test-webapp
      namespace: test-namespace
    # spec:
    # ...
    status:
      address:
        # cluster-local-domain:
        url: https://helloworld.test.svc.cluster.local 
    1
    Copy to Clipboard Toggle word wrap

    1
    cluster-local-domain-tls 를 활성화하면 HTTPS URL이 표시됩니다.
  4. system-internal-tls 가 활성화되어 있는지 확인하려면 다음 명령을 실행하여 Queue-Proxy 로그의 출력을 확인합니다.

    명령 예

    $ oc logs your-pod -n test-namespace -c queue-proxy | grep -E 'certDir|Certificate|tls'
    Copy to Clipboard Toggle word wrap

    다음과 유사한 행이 표시되면 system-internal-tls 가 활성화됩니다.

    {"severity":"INFO","timestamp":"2024-01-03T07:07:32.892810888Z","logger":"queueproxy","caller":"certificate/watcher.go:62","message":"Starting to watch the following directories for changes{certDir 15 0 /var/lib/knative/certs <nil>} {keyDir 15 0 /var/lib/knative/certs <nil>}","commit":"86420f2-dirty","knative.dev/key":"first/helloworld-00001","knative.dev/pod":"helloworld-00001-deployment-75fbb7d488-qgmxx"}
    {"severity":"INFO","timestamp":"2024-01-03T07:07:32.89397512Z","logger":"queueproxy","caller":"certificate/watcher.go:131","message":"Certificate and/or key have changed on disk and were reloaded.","commit":"86420f2-dirty","knative.dev/key":"first/helloworld-00001","knative.dev/pod":"helloworld-00001-deployment-75fbb7d488-qgmxx"}
    {"severity":"INFO","timestamp":"2024-01-03T07:07:32.894232939Z","logger":"queueproxy","caller":"sharedmain/main.go:282","message":"Starting tls server admin:8022","commit":"86420f2-dirty","knative.dev/key":"first/helloworld-00001","knative.dev/pod":"helloworld-00001-deployment-75fbb7d488-qgmxx"}
    {"severity":"INFO","timestamp":"2024-01-03T07:07:32.894268548Z","logger":"queueproxy","caller":"sharedmain/main.go:282","message":"Starting tls server main:8112","commit":"86420f2-dirty","knative.dev/key":"first/helloworld-00001","knative.dev/pod":"helloworld-00001-deployment-75fbb7d488-qgmxx"}
    Copy to Clipboard Toggle word wrap

8장. 트래픽 분할

8.1. 트래픽 분할 개요

Knative 애플리케이션에서 트래픽 분할을 생성하여 트래픽을 관리할 수 있습니다. 트래픽 분할은 Knative 서비스에서 관리하는 경로의 일부로 구성됩니다.

Knative 애플리케이션의 트래픽 관리

경로를 구성하면 요청을 서비스의 다른 버전으로 보낼 수 있습니다. 이 라우팅은 Service 오브젝트의 트래픽 사양에 따라 결정됩니다.

트래픽 사양 선언은 하나 이상의 버전으로 구성되며, 각각 전체 트래픽의 일부를 처리합니다. 각 버전으로 라우팅되는 트래픽의 백분율은 Knative 검증으로 보장되는 최대 100%를 추가해야 합니다.

트래픽 사양에 지정된 버전은 수정된 버전 또는 "최신" 버전을 가리킬 수 있으며 서비스의 모든 버전 목록 헤드를 추적합니다. "최신" 버전은 새 버전이 생성되는 경우 업데이트하는 부동 참조 유형입니다. 각 버전에는 해당 버전에 대한 추가 액세스 URL을 생성하는 태그가 연결되어 있을 수 있습니다.

트래픽 사양은 다음을 통해 수정할 수 있습니다.

  • Service 오브젝트의 YAML을 직접 편집합니다.
  • Knative(kn) CLI --traffic 플래그 사용.
  • OpenShift Container Platform 웹 콘솔 사용.

Knative 서비스를 생성할 때 기본 traffic 사양 설정이 없습니다.

8.2. traffic 사양 예

다음 예에서는 traffic의 100%가 서비스의 최신 버전으로 라우팅되는 트래픽 사양을 보여줍니다. status에서 latestRevision의 최신 버전의 이름을 볼 수 있습니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
...
  traffic:
  - latestRevision: true
    percent: 100
status:
  ...
  traffic:
  - percent: 100
    revisionName: example-service
Copy to Clipboard Toggle word wrap

다음 예에서는 traffic의 100%가 current로 태그가 지정된 버전으로 라우팅되고 해당 버전의 이름이 example-service로 지정된 트래픽 사양을 보여줍니다. 트래픽이 라우팅되지 않더라도 latest로 태그된 버전을 사용할 수 있습니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
...
  traffic:
  - tag: current
    revisionName: example-service
    percent: 100
  - tag: latest
    latestRevision: true
    percent: 0
Copy to Clipboard Toggle word wrap

다음 예제에서는 traffic 사양의 버전 목록을 확장하여 여러 버전으로 트래픽을 분할하는 방법을 보여줍니다. 이 예에서는 트래픽의 50%를 current 태그가 지정된 버전에 전송하고 트래픽의 50%를 candidate 로 태그된 버전에 보냅니다. 트래픽이 라우팅되지 않더라도 latest로 태그된 버전을 사용할 수 있습니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
...
  traffic:
  - tag: current
    revisionName: example-service-1
    percent: 50
  - tag: candidate
    revisionName: example-service-2
    percent: 50
  - tag: latest
    latestRevision: true
    percent: 0
Copy to Clipboard Toggle word wrap

8.3. Knative CLI를 사용한 트래픽 분할

Knative(kn) CLI를 사용하여 트래픽 분할을 생성하면 YAML 파일을 직접 수정하는 것보다 간소화되고 직관적인 사용자 인터페이스가 제공됩니다. kn service update 명령을 사용하여 서비스 버전 간에 트래픽을 분할할 수 있습니다.

8.3.1. Knative CLI를 사용하여 트래픽 분할 생성

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • Knative(kn) CLI가 설치되어 있습니다.
  • Knative 서비스를 생성했습니다.

프로세스

  • 표준 kn service update 명령과 함께 --traffic 태그를 사용하여 서비스 버전 및 트래픽의 백분율을 지정합니다.

    명령 예

    $ kn service update <service_name> --traffic <revision>=<percentage>
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    • <service_name>은 트래픽 라우팅을 구성하려는 Knative 서비스의 이름입니다.
    • <revision>은 일정 비율의 트래픽을 수신하도록 구성하려는 버전입니다. 버전 이름 또는 --tag 플래그를 사용하여 버전에 할당한 태그를 지정할 수 있습니다.
    • < percentage>는 지정된 버전에 보낼 트래픽의 백분율입니다.
  • 선택 사항: --traffic 플래그는 하나의 명령에서 여러 번 지정할 수 있습니다. 예를 들어 @latest 로 태그가 지정된 버전과 stable 이라는 버전이 있는 경우 다음과 같이 각 버전으로 분할하려는 트래픽의 백분율을 지정할 수 있습니다.

    명령 예

    $ kn service update showcase --traffic @latest=20,stable=80
    Copy to Clipboard Toggle word wrap

    버전이 여러 개 있고 마지막 버전으로 분할해야 하는 트래픽의 백분율을 지정하지 않으면 --traffic 플래그에서 자동으로 계산할 수 있습니다. 예를 들어 example 이라는 세 번째 버전이 있고 다음 명령을 사용합니다.

    명령 예

    $ kn service update showcase --traffic @latest=10,stable=60
    Copy to Clipboard Toggle word wrap

    나머지 30%의 트래픽은 지정되지 않은 경우에도 예제 버전으로 나뉩니다.

8.4. 트래픽 분할을 위한 CLI 플래그

Knative(kn) CLI는 kn service update 명령의 일부로 서비스의 트래픽 블록에서 트래픽 작업을 지원합니다.

8.4.1. Knative CLI 트래픽 분할 플래그

다음 테이블에는 트래픽 분할 플래그, 값 형식, 플래그에서 수행하는 작업이 요약되어 있습니다. 반복 열은 kn service update 명령에서 특정 플래그 값을 반복할 수 있는지를 나타냅니다.

Expand
플래그작업반복

--traffic

RevisionName=Percent

RevisionNamePercent 트래픽 제공

제공됨

--traffic

Tag=Percent

Tag가 있는 버전에 Percent 트래픽 제공

제공됨

--traffic

@latest=Percent

최신 준비 버전에 Percent 트래픽 제공

아니요

--tag

RevisionName=Tag

RevisionNameTag 지정

제공됨

--tag

@latest=Tag

최근 준비된 버전에 Tag 지정

아니요

--untag

Tag

버전에서 Tag 제거

제공됨

8.4.1.1. 여러 플래그 및 우선 순위

모든 트래픽 관련 플래그는 단일 kn service update 명령을 사용하여 지정할 수 있습니다. kn은 이러한 플래그의 우선순위를 정의합니다. 명령을 사용할 때 지정된 플래그의 순서는 고려하지 않습니다.

kn에 의해 평가되는 플래그의 우선순위는 다음과 같습니다.

  1. --untag: 이 플래그가 있는 참조된 버전은 모두 트래픽 블록에서 제거됩니다.
  2. --tag: 버전에는 트래픽 블록에 지정된 대로 태그가 지정됩니다.
  3. --traffic: 참조된 버전에는 트래픽 분할의 일부가 할당됩니다.

버전에 태그를 추가한 다음 설정한 태그에 따라 트래픽을 분할할 수 있습니다.

8.4.1.2. 개정버전 사용자 정의 URL

kn service update 명령을 사용하여 서비스에 --tag 플래그를 할당하면 서비스를 업데이트할 때 생성되는 버전에 대한 사용자 정의 URL이 생성됩니다. 사용자 정의 URL은 https://<tag>-<service_name>-<namespace>.<domain > 또는 http://<tag>-<service_name>-<namespace>.<domain > 패턴을 따릅니다.

--tag--untag 플래그는 다음 구문을 사용합니다.

  • 하나의 값이 필요합니다.
  • 서비스의 트래픽 블록에 있는 고유한 태그를 나타냅니다.
  • 하나의 명령에서 여러 번 지정할 수 있습니다.
8.4.1.2.1. 예: 태그를 버전에 할당

다음 예제에서는 latest 태그를 example-revision이라는 버전에 할당합니다.

$ kn service update <service_name> --tag @latest=example-tag
Copy to Clipboard Toggle word wrap
8.4.1.2.2. 예: 버전에서 태그 제거

--untag 플래그를 사용하여 사용자 정의 URL을 제거하도록 태그를 제거할 수 있습니다.

참고

개정 버전에 해당 태그가 제거되고 트래픽의 0%가 할당되면 개정 버전이 트래픽 블록에서 완전히 제거됩니다.

다음 명령은 example-revision이라는 버전에서 모든 태그를 제거합니다.

$ kn service update <service_name> --untag example-tag
Copy to Clipboard Toggle word wrap

8.5. 버전 간 트래픽 분할

서버리스 애플리케이션을 생성하면 OpenShift Container Platform 웹 콘솔의 토폴로지 보기에 애플리케이션이 표시됩니다. 애플리케이션 버전은 노드에서 나타내며 Knative 서비스는 노드 주변의 사각형으로 표시됩니다.

코드 또는 서비스 구성을 새로 변경하면 지정된 시간에 코드 스냅샷인 새 버전이 생성됩니다. 서비스의 경우 필요에 따라 서비스를 분할하고 다른 버전으로 라우팅하여 서비스 버전 간 트래픽을 관리할 수 있습니다.

8.5.1. OpenShift Container Platform 웹 콘솔을 사용하여 버전 간 트래픽 관리

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • OpenShift Container Platform 웹 콘솔에 로그인했습니다.

프로세스

토폴로지 보기에서 애플리케이션의 다양한 버전 간 트래픽을 분할하려면 다음을 수행합니다.

  1. Knative 서비스를 클릭하여 측면 패널에서 개요를 확인합니다.
  2. 리소스 탭을 클릭하여 서비스의 버전경로로 구성된 목록을 확인합니다.

    그림 8.1. 서버리스 애플리케이션

    odc 서버리스 앱
  3. 측면 패널 상단에 S 아이콘으로 표시된 서비스를 클릭하여 서비스 세부 정보 개요를 확인합니다.
  4. YAML 탭을 클릭하고 YAML 편집기에서 서비스 구성을 수정한 다음 저장을 클릭합니다. 예를 들면 timeoutseconds를 300에서 301로 변경합니다. 이러한 구성 변경으로 인해 새 버전이 트리거됩니다. 토폴로지 보기에 최신 버전이 표시되고 서비스의 리소스 탭에 두 가지 버전이 표시됩니다.
  5. 리소스 탭에서 트래픽 배포 설정을 클릭하여 트래픽 배포 대화 상자를 확인합니다.

    1. 분할 필드에 두 버전의 분할 트래픽 백분율 부분을 추가합니다.
    2. 두 버전에 대한 사용자 정의 URL을 생성하도록 태그를 추가합니다.
    3. 저장을 클릭하여 토폴로지 보기에서 두 버전을 나타내는 두 노드를 확인합니다.

      그림 8.2. 서버리스 애플리케이션의 버전

      odc 서버리스 버전

8.6. blue-green 전략을 사용하여 트래픽 다시 라우팅

blue-green 배포 전략을 사용하여 프로덕션 버전에서 새 버전으로 트래픽을 안전하게 다시 라우팅할 수 있습니다.

8.6.1. blue-green 배포 전략을 사용하여 트래픽 라우팅 및 관리

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • OpenShift CLI(oc)를 설치합니다.

프로세스

  1. 애플리케이션을 Knative 서비스로 생성하고 배포합니다.
  2. 다음 명령의 출력을 확인하여 서비스를 배포할 때 생성된 첫 번째 버전의 이름을 찾습니다.

    $ oc get ksvc <service_name> -o=jsonpath='{.status.latestCreatedRevisionName}'
    Copy to Clipboard Toggle word wrap

    명령 예

    $ oc get ksvc showcase -o=jsonpath='{.status.latestCreatedRevisionName}'
    Copy to Clipboard Toggle word wrap

    출력 예

    $ showcase-00001
    Copy to Clipboard Toggle word wrap

  3. 다음 YAML을 서비스 spec에 추가하여 인바운드 트래픽을 버전으로 전송합니다.

    ...
    spec:
      traffic:
        - revisionName: <first_revision_name>
          percent: 100 # All traffic goes to this revision
    ...
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 얻은 URL 출력에서 앱을 볼 수 있는지 확인합니다.

    $ oc get ksvc <service_name>
    Copy to Clipboard Toggle word wrap
  5. 서비스의 template 사양에서 하나 이상의 필드를 수정하고 재배포하여 애플리케이션의 두 번째 버전을 배포합니다. 예를 들어 서비스의 image 또는 env 환경 변수를 수정할 수 있습니다. 서비스 YAML 파일을 적용하거나 Knative(kn) CLI를 설치한 경우 kn service update 명령을 사용하여 서비스를 재배포할 수 있습니다.
  6. 다음 명령을 실행하여 서비스를 재배포할 때 생성된 두 번째 최신 버전의 이름을 찾습니다.

    $ oc get ksvc <service_name> -o=jsonpath='{.status.latestCreatedRevisionName}'
    Copy to Clipboard Toggle word wrap

    이때 서비스의 첫 번째 버전과 두 번째 버전이 모두 배포되고 실행됩니다.

  7. 다른 모든 트래픽을 첫 번째 버전으로 전송하면서 두 번째 버전에 대한 새 테스트 끝점을 생성하도록 기존 서비스를 업데이트합니다.

    테스트 끝점을 사용하여 업데이트된 서비스 사양의 예

    ...
    spec:
      traffic:
        - revisionName: <first_revision_name>
          percent: 100 # All traffic is still being routed to the first revision
        - revisionName: <second_revision_name>
          percent: 0 # No traffic is routed to the second revision
          tag: v2 # A named route
    ...
    Copy to Clipboard Toggle word wrap

    YAML 리소스를 다시 적용하여 이 서비스를 재배포하면 애플리케이션의 두 번째 버전이 준비됩니다. 기본 URL의 두 번째 버전으로 라우팅되는 트래픽이 없으며 Knative는 새로 배포된 버전을 테스트하기 위해 v2라는 새 서비스를 생성합니다.

  8. 다음 명령을 실행하여 두 번째 버전에 대한 새 서비스의 URL을 가져옵니다.

    $ oc get ksvc <service_name> --output jsonpath="{.status.traffic[*].url}"
    Copy to Clipboard Toggle word wrap

    이 URL을 사용하여 트래픽을 라우팅하기 전에 애플리케이션의 새 버전이 예상대로 작동하는지 확인할 수 있습니다.

  9. 트래픽의 50%가 첫 번째 버전으로 전송되고 50%가 두 번째 버전으로 전송되도록 기존 서비스를 다시 업데이트합니다.

    버전 간에 트래픽을 50/50으로 분할하는 업데이트된 서비스 사양 분할 예

    ...
    spec:
      traffic:
        - revisionName: <first_revision_name>
          percent: 50
        - revisionName: <second_revision_name>
          percent: 50
          tag: v2
    ...
    Copy to Clipboard Toggle word wrap

  10. 모든 트래픽을 새 버전의 앱으로 라우팅할 준비가 되면 두 번째 버전으로 트래픽의 100%를 보내도록 서비스를 다시 업데이트합니다.

    두 번째 버전으로 모든 트래픽을 전송하는 업데이트된 서비스 사양의 예

    ...
    spec:
      traffic:
        - revisionName: <first_revision_name>
          percent: 0
        - revisionName: <second_revision_name>
          percent: 100
          tag: v2
    ...
    Copy to Clipboard Toggle word wrap

    작은 정보

    버전을 롤백하지 않으려는 경우 첫 번째 버전을 트래픽의 0%로 설정하는 대신 제거할 수 있습니다. 라우팅할 수 없는 버전 오브젝트는 가비지 수집됩니다.

  11. 첫 번째 버전의 URL을 방문하여 이전 버전의 앱으로 더 이상 트래픽이 전송되지 않는지 확인합니다.

9장. 외부 및 Ingress 라우팅

9.1. 라우팅 개요

Knative에서는 OpenShift Container Platform TLS 종료를 활용하여 Knative 서비스에 대한 라우팅을 제공합니다. Knative 서비스가 생성되면 서비스에 대한 OpenShift Container Platform 경로가 자동으로 생성됩니다. 이 경로는 OpenShift Serverless Operator에서 관리합니다. OpenShift Container Platform 경로는 OpenShift Container Platform 클러스터와 동일한 도메인을 통해 Knative 서비스를 표시합니다.

OpenShift Container Platform 라우팅에 대한 Operator의 제어를 비활성화하여 대신 TLS 인증서를 직접 사용하도록 Knative 경로를 구성할 수 있습니다.

또한 Knative 경로를 OpenShift Container Platform 경로와 함께 사용하면 트래픽 분할과 같은 세분화된 라우팅 기능을 추가로 제공할 수 있습니다.

9.2. 라벨 및 주석 사용자 정의

OpenShift Container Platform 경로는 사용자 정의 레이블 및 주석을 사용할 수 있으며 Knative 서비스의 metadata 사양을 수정하여 구성할 수 있습니다. 사용자 정의 레이블 및 주석은 서비스에서 Knative 경로로 전달된 다음 Knative Ingress로 전달되고 마지막으로 OpenShift Container Platform 경로로 전달됩니다.

9.2.1. OpenShift Container Platform 경로에 대한 레이블 및 주석 사용자 정의

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving 구성 요소가 OpenShift Container Platform 클러스터에 설치되어 있습니다.
  • OpenShift CLI(oc)를 설치합니다.

프로세스

  1. OpenShift Container Platform 경로에 전달할 레이블 또는 주석이 포함된 Knative 서비스를 생성합니다.

    • YAML을 사용하여 서비스를 생성하려면 다음을 수행합니다.

      YAML을 사용하여 생성한 서비스 예

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: <service_name>
        labels:
          <label_name>: <label_value>
        annotations:
          <annotation_name>: <annotation_value>
      ...
      Copy to Clipboard Toggle word wrap

    • Knative(kn) CLI를 사용하여 서비스를 생성하려면 다음을 입력합니다.

      kn 명령을 사용하여 생성된 서비스 예

      $ kn service create <service_name> \
        --image=<image> \
        --annotation <annotation_name>=<annotation_value> \
        --label <label_value>=<label_value>
      Copy to Clipboard Toggle word wrap

  2. 다음 명령의 출력을 확인하여 추가한 주석 또는 레이블을 사용하여 OpenShift Container Platform 경로가 생성되었는지 확인합니다.

    확인을 위한 명령 예

    $ oc get routes.route.openshift.io \
         -l serving.knative.openshift.io/ingressName=<service_name> \ 
    1
    
         -l serving.knative.openshift.io/ingressNamespace=<service_namespace> \ 
    2
    
         -n knative-serving-ingress -o yaml \
             | grep -e "<label_name>: \"<label_value>\""  -e "<annotation_name>: <annotation_value>" 
    3
    Copy to Clipboard Toggle word wrap

    1
    서비스 이름을 사용합니다.
    2
    서비스가 생성된 네임스페이스를 사용합니다.
    3
    레이블 및 주석 이름과 값의 값을 사용합니다.

9.3. Knative 서비스의 경로 구성

OpenShift Container Platform에서 TLS 인증서를 사용하도록 Knative 서비스를 구성하려면 OpenShift Serverless Operator의 서비스 경로 자동 생성 기능을 비활성화하고 대신 해당 서비스에 대한 경로를 수동으로 생성해야 합니다.

참고

다음 절차를 완료하면 knative-serving-ingress 네임스페이스의 기본 OpenShift Container Platform 경로가 생성되지 않습니다. 그러나 애플리케이션의 Knative 경로는 이 네임스페이스에 계속 생성됩니다.

9.3.1. Knative 서비스에 대한 OpenShift Container Platform 경로 구성

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving 구성 요소가 OpenShift Container Platform 클러스터에 설치되어 있어야 합니다.
  • OpenShift CLI(oc)를 설치합니다.

프로세스

  1. serving.knative.openshift.io/disableRoute=true 주석이 포함된 Knative 서비스를 생성합니다.

    중요

    serving.knative.openshift.io/disableRoute=true 주석은 OpenShift Serverless에서 경로를 자동으로 생성하지 않도록 지시합니다. 그러나 서비스는 여전히 URL을 표시하며 Ready 상태에 도달합니다. 이 URL은 URL의 호스트 이름과 동일한 호스트 이름으로 자체 경로를 생성할 때까지 외부에서 작동하지 않습니다.

    1. Knative 서비스 리소스를 생성합니다.

      리소스 예

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: <service_name>
        annotations:
          serving.knative.openshift.io/disableRoute: "true"
      spec:
        template:
          spec:
            containers:
            - image: <image>
      ...
      Copy to Clipboard Toggle word wrap

    2. Service 리소스를 적용합니다.

      $ oc apply -f <filename>
      Copy to Clipboard Toggle word wrap
    3. 선택 사항: kn service create 명령을 사용하여 Knative 서비스를 생성합니다.

      kn 명령 예제

      $ kn service create <service_name> \
        --image=gcr.io/knative-samples/helloworld-go \
        --annotation serving.knative.openshift.io/disableRoute=true
      Copy to Clipboard Toggle word wrap

  2. 서비스에 OpenShift Container Platform 경로가 생성되지 않았는지 확인합니다.

    명령 예

    $ $ oc get routes.route.openshift.io \
      -l serving.knative.openshift.io/ingressName=$KSERVICE_NAME \
      -l serving.knative.openshift.io/ingressNamespace=$KSERVICE_NAMESPACE \
      -n knative-serving-ingress
    Copy to Clipboard Toggle word wrap

    다음 출력이 표시됩니다.

    No resources found in knative-serving-ingress namespace.
    Copy to Clipboard Toggle word wrap
  3. knative-serving-ingress 네임스페이스에 Route 리소스를 생성합니다.

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      annotations:
        haproxy.router.openshift.io/timeout: 600s 
    1
    
      name: <route_name> 
    2
    
      namespace: knative-serving-ingress 
    3
    
    spec:
      host: <service_host> 
    4
    
      port:
        targetPort: http2
      to:
        kind: Service
        name: kourier
        weight: 100
      tls:
        insecureEdgeTerminationPolicy: Allow
        termination: edge 
    5
    
        key: |-
          -----BEGIN PRIVATE KEY-----
          [...]
          -----END PRIVATE KEY-----
        certificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----
        caCertificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE----
      wildcardPolicy: None
    Copy to Clipboard Toggle word wrap
    1
    OpenShift Container Platform 경로에 대한 타임아웃 값입니다. max-revision-timeout-seconds 설정과 동일한 값으로 설정해야 합니다(기본값: 600s).
    2
    OpenShift Container Platform 경로의 이름입니다.
    3
    OpenShift Container Platform 경로의 네임스페이스입니다. knative-serving-ingress여야 합니다.
    4
    외부 액세스를 위한 호스트 이름입니다. 이 값을 <service_name>-<service_namespace>.<domain>으로 설정할 수 있습니다.
    5
    사용할 인증서입니다. 현재는 edge 종료만 지원됩니다.
  4. Route 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap

9.4. 외부 경로의 URL 스키마

보안을 강화하기 위해 외부 경로의 URL 체계는 기본적으로 HTTPS로 설정됩니다. 이 스키마는 KnativeServing CR(사용자 정의 리소스) 사양의 default-external-scheme 키로 결정합니다.

9.4.1. 외부 경로의 URL 스키마 설정

기본 사양

...
spec:
  config:
    network:
      default-external-scheme: "https"
...
Copy to Clipboard Toggle word wrap

default-external-scheme 키를 수정하여 HTTP를 사용하도록 기본 사양을 덮어쓸 수 있습니다.

HTTP 덮어쓰기 사양

...
spec:
  config:
    network:
      default-external-scheme: "http"
...
Copy to Clipboard Toggle word wrap

9.5. 클러스터 로컬 가용성

기본적으로 Knative 서비스는 공용 IP 주소에 게시됩니다. 공용 IP 주소에 게시된다는 것은 Knative 서비스가 공용 애플리케이션이 되어 공개적으로 액세스할 수 있는 URL이 있음을 의미합니다.

공개적으로 액세스할 수 있는 URL은 클러스터 외부에서 액세스할 수 있습니다. 그러나 개발자는 클러스터 내부에서만 액세스할 수 있는 백엔드 서비스(비공개 서비스)를 빌드해야 할 수 있습니다. 개발자는 클러스터의 개별 서비스에 networking.knative.dev/visibility=cluster-local 레이블을 지정하여 비공개로 설정할 수 있습니다.

중요

OpenShift Serverless 1.15.0 및 최신 버전의 경우 serving.knative.dev/visibility 레이블을 더 이상 사용할 수 없습니다. 대신 networking.knative.dev/visibility 레이블을 사용하려면 기존 서비스를 업데이트해야 합니다.

9.5.1. 클러스터 가용성을 클러스터 로컬로 설정

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • Knative 서비스를 생성했습니다.

프로세스

  • networking.knative.dev/visibility=cluster-local 레블을 추가하여 서비스 가시성을 설정합니다.

    $ oc label ksvc <service_name> networking.knative.dev/visibility=cluster-local
    Copy to Clipboard Toggle word wrap

검증

  • 다음 명령을 입력하고 출력을 검토하여 서비스의 URL이 http://<service_name>.<namespace>.svc.cluster.local 형식인지 확인합니다.

    $ oc get ksvc
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME            URL                                                                         LATESTCREATED     LATESTREADY       READY   REASON
    hello           http://hello.default.svc.cluster.local                                      hello-tx2g7       hello-tx2g7       True
    Copy to Clipboard Toggle word wrap

9.5.2. 클러스터 로컬 서비스에 대한 TLS 인증 활성화

클러스터 로컬 서비스의 경우 Kourier 로컬 게이트웨이 kourier-internal 이 사용됩니다. Kourier 로컬 게이트웨이에 대해 TLS 트래픽을 사용하려면 로컬 게이트웨이에서 자체 서버 인증서를 구성해야 합니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • 관리자 권한이 있습니다.
  • OpenShift(oc) CLI가 설치되어 있습니다.

프로세스

  1. knative-serving-ingress 네임스페이스에 서버 인증서를 배포합니다.

    $ export san="knative"
    Copy to Clipboard Toggle word wrap
    참고

    이러한 인증서가 < app_name>.<namespace>.svc.cluster.local 에 요청을 제공하려면 제목 대체 이름(SAN) 검증이 필요합니다.

  2. 루트 키 및 인증서를 생성합니다.

    $ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \
        -subj '/O=Example/CN=Example' \
        -keyout ca.key \
        -out ca.crt
    Copy to Clipboard Toggle word wrap
  3. SAN 검증을 사용하는 서버 키를 생성합니다.

    $ openssl req -out tls.csr -newkey rsa:2048 -nodes -keyout tls.key \
      -subj "/CN=Example/O=Example" \
      -addext "subjectAltName = DNS:$san"
    Copy to Clipboard Toggle word wrap
  4. 서버 인증서를 생성합니다.

    $ openssl x509 -req -extfile <(printf "subjectAltName=DNS:$san") \
      -days 365 -in tls.csr \
      -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt
    Copy to Clipboard Toggle word wrap
  5. Kourier 로컬 게이트웨이의 시크릿을 구성합니다.

    1. 이전 단계에서 생성한 인증서에서 knative-serving-ingress 네임스페이스에 보안을 배포합니다.

      $ oc create -n knative-serving-ingress secret tls server-certs \
          --key=tls.key \
          --cert=tls.crt --dry-run=client -o yaml | oc apply -f -
      Copy to Clipboard Toggle word wrap
    2. Kourier 게이트웨이에서 생성한 보안을 사용하도록 KnativeServing CR(사용자 정의 리소스) 사양을 업데이트합니다.

      KnativeServing CR의 예

      ...
      spec:
        config:
          kourier:
            cluster-cert-secret: server-certs
      ...
      Copy to Clipboard Toggle word wrap

Kourier 컨트롤러는 서비스를 다시 시작하지 않고 인증서를 설정하여 Pod를 다시 시작할 필요가 없도록 합니다.

클라이언트의 ca.crt 를 마운트하고 사용하여 TLS를 통해 포트 443 을 통해 Kourier 내부 서비스에 액세스할 수 있습니다.

9.6. Kourier Gateway 서비스 유형

Kourier Gateway는 기본적으로 ClusterIP 서비스 유형으로 노출됩니다. 이 서비스 유형은 KnativeServing CR(사용자 정의 리소스)의 서비스 유형 ingress 사양에 따라 결정됩니다.

기본 사양

...
spec:
  ingress:
    kourier:
      service-type: ClusterIP
...
Copy to Clipboard Toggle word wrap

9.6.1. Kourier Gateway 서비스 유형 설정

service-type 사양을 수정하여 로드 밸런서 서비스 유형을 대신 사용하도록 기본 서비스 유형을 덮어쓸 수 있습니다.

LoadBalancer 덮어쓰기 사양

...
spec:
  ingress:
    kourier:
      service-type: LoadBalancer
...
Copy to Clipboard Toggle word wrap

9.7. HTTP2 및 gRPC 사용

OpenShift Serverless에서는 비보안 또는 엣지 종료 경로만 지원합니다. 비보안 또는 엣지 종료 경로에서는 OpenShift Container Platform에서 HTTP2를 지원하지 않습니다. 또한 이러한 경로는 gRPC가 HTTP2에 의해 전송되기 때문에 gRPC를 지원하지 않습니다. 애플리케이션에서 이러한 프로토콜을 사용하는 경우 수신 게이트웨이를 사용하여 애플리케이션을 직접 호출해야 합니다. 이를 위해서는 수신 게이트웨이의 공용 주소와 애플리케이션의 특정 호스트를 찾아야 합니다.

9.7.1. HTTP2 및 gRPC를 사용하여 서버리스 애플리케이션과 상호 작용

중요

이 방법은 OpenShift Container Platform 4.10 이상에 적용됩니다. 이전 버전의 경우 다음 섹션을 참조하십시오.

사전 요구 사항

  • 클러스터에 OpenShift Serverless Operator 및 Knative Serving을 설치합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • Knative 서비스를 생성합니다.
  • OpenShift Container Platform 4.10 이상을 업그레이드합니다.
  • OpenShift Ingress 컨트롤러에서 HTTP/2를 활성화합니다.

프로세스

  1. 서버리스.openshift.io/default-enable-http2=true 주석을 KnativeServing 사용자 정의 리소스에 추가합니다.

    $ oc annotate knativeserving <your_knative_CR> -n knative-serving serverless.openshift.io/default-enable-http2=true
    Copy to Clipboard Toggle word wrap
  2. 주석이 추가된 후 Kourier 서비스의 appProtocol 값이 h2c:인지 확인할 수 있습니다.

    $ oc get svc -n knative-serving-ingress kourier -o jsonpath="{.spec.ports[0].appProtocol}"
    Copy to Clipboard Toggle word wrap

    출력 예

    h2c
    Copy to Clipboard Toggle word wrap

  3. 이제 외부 트래픽에 HTTP/2 프로토콜을 통해 gRPC 프레임워크를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

    import "google.golang.org/grpc"
    
    grpc.Dial(
       YOUR_URL, 
    1
    
       grpc.WithTransportCredentials(insecure.NewCredentials())), 
    2
    
    )
    Copy to Clipboard Toggle word wrap
    1
    ksvc URL.
    2
    인증서입니다.

9.8. OpenShift Ingress 샤딩으로 Serving 사용

OpenShift Ingress 샤딩과 함께 Knative Serving을 사용하여 도메인에 따라 Ingress 트래픽을 분할할 수 있습니다. 이를 통해 네트워크 트래픽을 클러스터의 다른 부분으로 보다 효율적으로 관리하고 라우팅할 수 있습니다.

참고

OpenShift Ingress 샤딩이 있는 경우에도 OpenShift Serverless 트래픽은 여전히 단일 Knative Ingress Gateway 및 knative-serving 프로젝트의 활성화 구성 요소를 통해 라우팅됩니다.

네트워크 트래픽 격리에 대한 자세한 내용은 Service Mesh를 사용하여 OpenShift Serverless에서 네트워크 트래픽을 격리하는 방법을 참조하십시오.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 설치되어 있습니다.
  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.

9.8.1. OpenShift ingress shard 구성

Knative Serving을 구성하기 전에 OpenShift Ingress shard를 구성해야 합니다.

프로세스

  • IngressController CR의 라벨 선택기를 사용하여 다른 도메인과 특정 Ingress shard와 일치하도록 OpenShift Serverless를 구성합니다.

    IngressController CR 예

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: ingress-dev 
    1
    
      namespace: openshift-ingress-operator
    spec:
      routeSelector:
        matchLabels:
          router: dev 
    2
    
      domain: "dev.serverless.cluster.example.com" 
    3
    
      # ...
    ---
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: ingress-prod 
    4
    
      namespace: openshift-ingress-operator
    spec:
      routeSelector:
        matchLabels:
          router: prod 
    5
    
      domain: "prod.serverless.cluster.example.com" 
    6
    
      # ...
    Copy to Clipboard Toggle word wrap

    1
    첫 번째 Ingress shard의 이름입니다.
    2
    ingress-dev shard와 일치하는 라벨 선택기입니다.
    3
    ingress-dev shard의 사용자 정의 도메인입니다.
    4
    두 번째 ingress shard의 이름입니다.
    5
    ingress-prod shard와 일치하는 라벨 선택기입니다.
    6
    ingress-prod shard의 사용자 정의 도메인입니다.

9.8.2. KnativeServing CR에서 사용자 정의 도메인 구성

OpenShift Ingress shard를 구성한 후 Knative Serving을 해당 shard와 일치하도록 구성해야 합니다.

프로세스

  • KnativeServing CR에서 spec.config.domain 필드를 추가하여 Ingress shard와 동일한 도메인 및 레이블을 사용하도록 Serving을 구성합니다.

    KnativeServing CR의 예

    spec:
      config:
        domain: 
    1
    
          dev.serverless.cluster.example.com: |
            selector:
              router: dev
          prod.serverless.cluster.example.com: |
            selector:
              router: prod
      # ...
    Copy to Clipboard Toggle word wrap

    1
    이러한 값은 ingress shard 구성의 값과 일치해야 합니다.

9.8.3. Knative 서비스에서 특정 Ingress shard를 대상으로

Ingress 샤딩 및 Knative Serving을 구성한 후 라벨을 사용하여 Knative 서비스 리소스의 특정 Ingress shard를 대상으로 할 수 있습니다.

프로세스

  • Service CR에서 특정 shard와 일치하는 라벨 선택기를 추가합니다.

    Service CR의 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: hello-dev
      labels:
        router: dev 
    1
    
    spec:
      template:
        spec:
          containers:
          - image: docker.io/openshift/hello-openshift
    ---
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: hello-prod
      labels:
        router: prod 
    2
    
    spec:
      template:
        spec:
          containers:
          - image: docker.io/openshift/hello-openshift
      # ...
    Copy to Clipboard Toggle word wrap

    1 2
    레이블은 KnativeServing CR의 구성과 일치해야 합니다.

9.8.4. OpenShift Ingress 샤딩 구성으로 Serving 확인

Ingress 샤딩, Knative Serving 및 서비스를 구성한 후 서비스가 올바른 경로와 선택한 Ingress shard를 사용하는지 확인할 수 있습니다.

프로세스

  1. 다음 명령을 실행하여 클러스터의 서비스에 대한 정보를 출력합니다.

    $ oc get ksvc
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME         URL                                                             LATESTCREATED      LATESTREADY        READY   REASON
    hello-dev    https://hello-dev-default.dev.serverless.cluster.example.com    hello-dev-00001    hello-dev-00001    True
    hello-prod   https://hello-prod-default.prod.serverless.cluster.example.com  hello-prod-00001   hello-prod-00001   True
    Copy to Clipboard Toggle word wrap

  2. 다음 명령을 실행하여 서비스에서 올바른 경로와 선택한 Ingress shard를 사용하는지 확인합니다.

    $ oc get route -n knative-serving-ingress -o jsonpath='{range .items[*]}{@.metadata.name}{" "}{@.spec.host}{" "}{@.status.ingress[*].routerName}{"\n"}{end}'
    Copy to Clipboard Toggle word wrap

    출력 예

    route-19e6628b-77af-4da0-9b4c-1224934b2250-323461616533 hello-prod-default.prod.serverless.cluster.example.com ingress-prod
    route-cb5085d9-b7da-4741-9a56-96c88c6adaaa-373065343266 hello-dev-default.dev.serverless.cluster.example.com ingress-dev
    Copy to Clipboard Toggle word wrap

10장. HTTP 구성

10.1. 글로벌 HTTPS 리디렉션

HTTPS 리디렉션은 들어오는 HTTP 요청에 대한 리디렉션을 제공합니다. 이러한 리디렉션된 HTTP 요청은 암호화됩니다. KnativeServing CR(사용자 정의 리소스)에 대한 httpProtocol 사양을 구성하여 클러스터의 모든 서비스에 대해 HTTPS 리디렉션을 활성화할 수 있습니다.

10.1.1. HTTPS 리디렉션 글로벌 설정

HTTPS 리디렉션을 활성화하는 KnativeServing CR의 예

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
spec:
  config:
    network:
      httpProtocol: "redirected"
...
Copy to Clipboard Toggle word wrap

10.2. 서비스당 HTTPS 리디렉션

networking.knative.dev/http-option 주석을 구성하여 서비스에 대한 HTTPS 리디렉션을 활성화하거나 비활성화할 수 있습니다.

10.2.1. 서비스에 대한 HTTPS 리디렉션

다음 예제에서는 Knative Service YAML 오브젝트에서 이 주석을 사용하는 방법을 보여줍니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example
  namespace: default
  annotations:
    networking.knative.dev/http-protocol: "redirected"
spec:
  ...
Copy to Clipboard Toggle word wrap

10.3. HTTP/1에 대한 전체 중복 지원

features.knative.dev/http-full-duplex 주석을 구성하여 서비스에 대한 HTTP/1 전체 duplex 지원을 활성화할 수 있습니다.

참고

이전 버전 클라이언트가 HTTP/1 전체 중복을 지원하지 않을 수 있으므로 활성화하기 전에 HTTP 클라이언트를 확인합니다.

다음 예제에서는 버전 사양 수준에서 Knative Service YAML 오브젝트에서 이 주석을 사용하는 방법을 보여줍니다.

HTTP/1에 대한 전체 중복 지원을 제공하는 KnativeServing CR의 예

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
  template:
    metadata:
      annotations:
        features.knative.dev/http-full-duplex: "Enabled"
...
Copy to Clipboard Toggle word wrap

11장. Knative 서비스에 대한 액세스 구성

11.1. Knative 서비스의 JSON Web Token 인증 설정

OpenShift Serverless에는 현재 사용자 정의 권한 부여 기능이 없습니다. 배포에 사용자 정의 권한을 추가하려면 OpenShift Serverless를 Red Hat OpenShift Service Mesh와 통합한 다음 Knative 서비스에 대한 JSON 웹 토큰(JWT) 인증 및 사이드카 삽입을 구성해야 합니다.

11.2. Service Mesh 2.x에서 JSON 웹 토큰 인증 사용

Service Mesh 2.x 및 OpenShift Serverless를 사용하여 Knative 서비스에서 JSON 웹 토큰(JWT) 인증을 사용할 수 있습니다. 이렇게 하려면 ServiceMeshMemberRoll 오브젝트의 멤버인 애플리케이션 네임스페이스에 인증 요청 및 정책을 생성해야 합니다. 서비스에 대한 사이드카 삽입도 활성화해야 합니다.

11.2.1. Service Mesh 2.x 및 OpenShift Serverless에 대한 JSON 웹 토큰 인증 구성

중요

knative-servingknative-serving-ingress와 같은 시스템 네임스페이스의 Pod에 Kourier가 활성화되어 있는 경우 사이드카를 삽입할 수 없습니다.

OpenShift Container Platform의 경우 이러한 네임스페이스의 Pod에 사이드카 삽입이 필요한 경우 OpenShift Serverless 와 OpenShift Serverless 통합에 대한 OpenShift Serverless 설명서를 참조하십시오.

사전 요구 사항

  • 클러스터에 OpenShift Serverless Operator, Knative Serving 및 Red Hat OpenShift Service Mesh를 설치했습니다.
  • OpenShift CLI(oc)를 설치합니다.
  • 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.

프로세스

  1. 서비스에 sidecar.istio.io/inject="true" 주석을 추가합니다.

    서비스의 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: <service_name>
    spec:
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true" 
    1
    
            sidecar.istio.io/rewriteAppHTTPProbers: "true" 
    2
    
    ...
    Copy to Clipboard Toggle word wrap

    1
    sidecar.istio.io/inject="true" 주석을 추가합니다.
    2
    OpenShift Serverless 버전 1.14.0 이상이 기본적으로 Knative 서비스의 준비 상태 프로브로 HTTP 프로브를 사용하므로 Knative 서비스에서 주석 sidecar.istio.io/rewriteAppHTTPProbers: "true" 를 설정해야 합니다.
  2. Service 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  3. ServiceMeshMemberRoll 오브젝트의 멤버인 각 서버리스 애플리케이션 네임스페이스에 RequestAuthentication 리소스를 생성합니다.

    apiVersion: security.istio.io/v1beta1
    kind: RequestAuthentication
    metadata:
      name: jwt-example
      namespace: <namespace>
    spec:
      jwtRules:
      - issuer: testing@secure.istio.io
        jwksUri: https://raw.githubusercontent.com/istio/istio/release-1.8/security/tools/jwt/samples/jwks.json
    Copy to Clipboard Toggle word wrap
  4. RequestAuthentication 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  5. 다음 AuthorizationPolicy 리소스를 생성하여 ServiceMeshMemberRoll 오브젝트의 멤버인 각 서버리스 애플리케이션 네임스페이스의 시스템 Pod에서 RequestAuthenticaton 리소스에 대한 액세스를 허용합니다.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: allowlist-by-paths
      namespace: <namespace>
    spec:
      action: ALLOW
      rules:
      - to:
        - operation:
            paths:
            - /metrics 
    1
    
            - /healthz 
    2
    Copy to Clipboard Toggle word wrap
    1
    시스템 Pod별 지표를 수집하는 애플리케이션의 경로입니다.
    2
    시스템 Pod별로 검색할 애플리케이션의 경로입니다.
  6. AuthorizationPolicy 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  7. ServiceMeshMemberRoll 오브젝트의 멤버인 각 서버리스 애플리케이션 네임스페이스에서 다음 AuthorizationPolicy 리소스를 생성합니다.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: require-jwt
      namespace: <namespace>
    spec:
      action: ALLOW
      rules:
      - from:
        - source:
           requestPrincipals: ["testing@secure.istio.io/testing@secure.istio.io"]
    Copy to Clipboard Toggle word wrap
  8. AuthorizationPolicy 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap

검증

  1. Knative 서비스 URL을 가져오기 위해 curl 요청을 사용하면 해당 요청이 거부됩니다.

    명령 예

    $ curl http://hello-example-1-default.apps.mycluster.example.com/
    Copy to Clipboard Toggle word wrap

    출력 예

    RBAC: access denied
    Copy to Clipboard Toggle word wrap

  2. 유효한 JWT로 요청을 확인합니다.

    1. 유효한 JWT 토큰을 가져옵니다.

      $ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.8/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode -
      Copy to Clipboard Toggle word wrap
    2. curl 요청 헤더에 유효한 토큰을 사용하여 서비스에 액세스합니다.

      $ curl -H "Authorization: Bearer $TOKEN"  http://hello-example-1-default.apps.example.com
      Copy to Clipboard Toggle word wrap

      그러면 요청이 허용됩니다.

      출력 예

      Hello OpenShift!
      Copy to Clipboard Toggle word wrap

11.3. Service Mesh 1.x에서 JSON 웹 토큰 인증 사용

Service Mesh 1.x 및 OpenShift Serverless를 사용하여 Knative 서비스에서 JSON 웹 토큰(JWT) 인증을 사용할 수 있습니다. 이렇게 하려면 ServiceMeshMemberRoll 오브젝트의 멤버인 애플리케이션 네임스페이스에 정책을 생성해야 합니다. 서비스에 대한 사이드카 삽입도 활성화해야 합니다.

11.3.1. Service Mesh 1.x 및 OpenShift Serverless에 대한 JSON 웹 토큰 인증 구성

중요

knative-servingknative-serving-ingress와 같은 시스템 네임스페이스의 Pod에 Kourier가 활성화되어 있는 경우 사이드카를 삽입할 수 없습니다.

OpenShift Container Platform의 경우 이러한 네임스페이스의 Pod에 사이드카 삽입이 필요한 경우 OpenShift Serverless 와 OpenShift Serverless 통합에 대한 OpenShift Serverless 설명서를 참조하십시오.

사전 요구 사항

  • 클러스터에 OpenShift Serverless Operator, Knative Serving 및 Red Hat OpenShift Service Mesh를 설치했습니다.
  • OpenShift CLI(oc)를 설치합니다.
  • 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.

프로세스

  1. 서비스에 sidecar.istio.io/inject="true" 주석을 추가합니다.

    서비스의 예

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: <service_name>
    spec:
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true" 
    1
    
            sidecar.istio.io/rewriteAppHTTPProbers: "true" 
    2
    
    ...
    Copy to Clipboard Toggle word wrap

    1
    sidecar.istio.io/inject="true" 주석을 추가합니다.
    2
    OpenShift Serverless 버전 1.14.0 이상이 기본적으로 Knative 서비스의 준비 상태 프로브로 HTTP 프로브를 사용하므로 Knative 서비스에서 주석 sidecar.istio.io/rewriteAppHTTPProbers: "true" 를 설정해야 합니다.
  2. Service 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap
  3. 유효한 JWT(JSON 웹 토큰)가 있는 요청만 허용하는 ServiceMeshMemberRoll 오브젝트의 멤버인 서버리스 애플리케이션 네임스페이스에 정책을 생성합니다.

    중요

    /metrics/healthz 경로는 knative-serving 네임스페이스의 시스템 Pod에서 액세스하므로 excludedPaths에 포함되어야 합니다.

    apiVersion: authentication.istio.io/v1alpha1
    kind: Policy
    metadata:
      name: default
      namespace: <namespace>
    spec:
      origins:
      - jwt:
          issuer: testing@secure.istio.io
          jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.6/security/tools/jwt/samples/jwks.json"
          triggerRules:
          - excludedPaths:
            - prefix: /metrics 
    1
    
            - prefix: /healthz 
    2
    
      principalBinding: USE_ORIGIN
    Copy to Clipboard Toggle word wrap
    1
    시스템 Pod별 지표를 수집하는 애플리케이션의 경로입니다.
    2
    시스템 Pod별로 검색할 애플리케이션의 경로입니다.
  4. Policy 리소스를 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap

검증

  1. Knative 서비스 URL을 가져오기 위해 curl 요청을 사용하면 해당 요청이 거부됩니다.

    $ curl http://hello-example-default.apps.mycluster.example.com/
    Copy to Clipboard Toggle word wrap

    출력 예

    Origin authentication failed.
    Copy to Clipboard Toggle word wrap

  2. 유효한 JWT로 요청을 확인합니다.

    1. 유효한 JWT 토큰을 가져옵니다.

      $ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.6/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode -
      Copy to Clipboard Toggle word wrap
    2. curl 요청 헤더에 유효한 토큰을 사용하여 서비스에 액세스합니다.

      $ curl http://hello-example-default.apps.mycluster.example.com/ -H "Authorization: Bearer $TOKEN"
      Copy to Clipboard Toggle word wrap

      그러면 요청이 허용됩니다.

      출력 예

      Hello OpenShift!
      Copy to Clipboard Toggle word wrap

12장. Serving에 대한 kube-rbac-proxy 구성

kube-rbac-proxy 구성 요소는 Knative Serving에 대한 내부 인증 및 권한 부여 기능을 제공합니다.

12.1. Serving에 대한 kube-rbac-proxy 리소스 구성

OpenShift Serverless Operator CR을 사용하여 kube-rbac-proxy 컨테이너의 리소스 할당을 전역적으로 덮어쓸 수 있습니다.

참고

특정 배포에 대한 리소스 할당을 덮어쓸 수도 있습니다.

다음 구성은 Knative Serving kube-rbac-proxy 최소 및 최대 CPU 및 메모리 할당을 설정합니다.

KnativeServing CR 예

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
  config:
    deployment:
      "kube-rbac-proxy-cpu-request": "10m" 
1

      "kube-rbac-proxy-memory-request": "20Mi" 
2

      "kube-rbac-proxy-cpu-limit": "100m" 
3

      "kube-rbac-proxy-memory-limit": "100Mi" 
4
Copy to Clipboard Toggle word wrap

1
최소 CPU 할당을 설정합니다.
2
최소 RAM 할당을 설정합니다.
3
최대 CPU 할당을 설정합니다.
4
최대 RAM 할당을 설정합니다.

13장. net-kourier의 버스 및 QPS 구성

초당 쿼리(QPS) 및 버스트 값은 API 서버에 대한 요청 또는 API 호출 빈도를 결정합니다.

13.1. net-kourier의 burst 및 QPS 값 구성

QPS(초당 쿼리) 값에 따라 API 서버로 전송되는 클라이언트 요청 또는 API 호출 수가 결정됩니다.

burst 값은 클라이언트에 대해 저장할 수 있는 요청 수를 결정합니다. 이 버퍼를 초과하는 요청은 삭제됩니다. 이 기능은 버스트이며 요청을 시간에 균일하게 분배하지 않는 컨트롤러에 유용합니다.

net-kourier-controller 가 다시 시작되면 클러스터에 배포된 모든 수신 리소스를 구문 분석하므로 많은 API 호출이 발생합니다. 이로 인해 net-kourier-controller 를 시작하는 데 시간이 오래 걸릴 수 있습니다.

KnativeServing CR에서 net-kourier-controller 의 QPS 및 버스트 값을 조정할 수 있습니다.

KnativeServing CR 예

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
  workloads:
  - name: net-kourier-controller
    env:
    - container: controller
      envVars:
      - name: KUBE_API_BURST
        value: "200" 
1

      - name: KUBE_API_QPS
        value: "200" 
2
Copy to Clipboard Toggle word wrap

1
컨트롤러와 API 서버 간의 통신 속도입니다. 기본값은 200입니다.
2
Kubelet과 API 서버 간의 통신 버스트 용량입니다. 기본값은 200입니다.

14장. Knative 서비스의 사용자 정의 도메인 구성

14.1. Knative 서비스의 사용자 정의 도메인 구성

Knative 서비스에는 클러스터 구성에 따라 기본 도메인 이름이 자동으로 할당됩니다. 예를 들면 &lt ;service_name>-<namespace>.example.com 입니다. 소유한 사용자 정의 도메인 이름을 Knative 서비스에 매핑하여 Knative 서비스의 도메인을 사용자 지정할 수 있습니다.

서비스에 대한 DomainMapping 리소스를 생성하여 이 작업을 수행할 수 있습니다. 또한 여러 개의 DomainMapping 리소스를 생성하여 여러 도메인에 매핑하고 하위 도메인을 단일 서비스에 매핑할 수도 있습니다.

14.2. 사용자 정의 도메인 매핑

소유한 사용자 정의 도메인 이름을 Knative 서비스에 매핑하여 Knative 서비스의 도메인을 사용자 지정할 수 있습니다. 사용자 정의 도메인 이름을 CR(사용자 정의 리소스)에 매핑하려면 Knative 서비스 또는 Knative 경로와 같이 주소 지정 가능 대상 CR에 매핑하는 DomainMapping CR을 생성해야 합니다.

14.2.1. 사용자 정의 도메인 매핑 생성

소유한 사용자 정의 도메인 이름을 Knative 서비스에 매핑하여 Knative 서비스의 도메인을 사용자 지정할 수 있습니다. 사용자 정의 도메인 이름을 CR(사용자 정의 리소스)에 매핑하려면 Knative 서비스 또는 Knative 경로와 같이 주소 지정 가능 대상 CR에 매핑하는 DomainMapping CR을 생성해야 합니다.

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • OpenShift CLI(oc)를 설치합니다.
  • 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
  • Knative 서비스를 생성했으며 해당 서비스에 매핑할 사용자 정의 도메인을 제어할 수 있습니다.

    참고

    사용자 정의 도메인에서 OpenShift Container Platform 클러스터의 IP 주소를 참조해야 합니다.

프로세스

  1. 매핑하려는 대상 CR과 동일한 네임스페이스에 DomainMapping CR을 포함하는 YAML 파일을 생성합니다.

    apiVersion: serving.knative.dev/v1beta1
    kind: DomainMapping
    metadata:
     name: <domain_name> 
    1
    
     namespace: <namespace> 
    2
    
    spec:
     ref:
       name: <target_name> 
    3
    
       kind: <target_type> 
    4
    
       apiVersion: serving.knative.dev/v1
    Copy to Clipboard Toggle word wrap
    1
    대상 CR에 매핑할 사용자 정의 도메인 이름입니다.
    2
    DomainMapping CR 및 대상 CR의 네임스페이스입니다.
    3
    사용자 정의 도메인에 매핑할 대상 CR의 이름입니다.
    4
    사용자 지정 도메인에 매핑되는 CR 유형입니다.

    서비스 도메인 매핑 예

    apiVersion: serving.knative.dev/v1beta1
    kind: DomainMapping
    metadata:
     name: example.com
     namespace: default
    spec:
     ref:
       name: showcase
       kind: Service
       apiVersion: serving.knative.dev/v1
    Copy to Clipboard Toggle word wrap

    경로 도메인 매핑 예

    apiVersion: serving.knative.dev/v1beta1
    kind: DomainMapping
    metadata:
     name: example.com
     namespace: default
    spec:
     ref:
       name: example-route
       kind: Route
       apiVersion: serving.knative.dev/v1
    Copy to Clipboard Toggle word wrap

  2. DomainMapping CR을 YAML 파일로 적용합니다.

    $ oc apply -f <filename>
    Copy to Clipboard Toggle word wrap

14.3. Knative CLI를 사용한 Knative 서비스의 사용자 정의 도메인

소유한 사용자 정의 도메인 이름을 Knative 서비스에 매핑하여 Knative 서비스의 도메인을 사용자 지정할 수 있습니다. Knative(kn) CLI를 사용하여 Knative 서비스 또는 Knative 경로와 같이 주소 지정 가능 대상 CR에 매핑되는 DomainMapping CR(사용자 정의 리소스)을 생성할 수 있습니다.

14.3.1. Knative CLI를 사용하여 사용자 정의 도메인 매핑 생성

사전 요구 사항

  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
  • Knative 서비스 또는 경로를 생성했으며 CR에 매핑할 사용자 정의 도메인을 제어할 수 있습니다.

    참고

    사용자 정의 도메인에서 OpenShift Container Platform 클러스터의 DNS를 가리켜야 합니다.

  • Knative(kn) CLI가 설치되어 있습니다.
  • 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.

프로세스

  • 현재 네임스페이스의 CR에 도메인을 매핑합니다.

    $ kn domain create <domain_mapping_name> --ref <target_name>
    Copy to Clipboard Toggle word wrap

    명령 예

    $ kn domain create example.com --ref showcase
    Copy to Clipboard Toggle word wrap

    --ref 플래그는 도메인 매핑을 위해 주소 지정 가능한 대상 CR을 지정합니다.

    --ref 플래그를 사용할 때 접두사가 지정되어 있지 않은 경우 대상이 현재 네임스페이스의 Knative 서비스라고 가정합니다.

  • 지정된 네임스페이스의 Knative 서비스에 도메인을 매핑합니다.

    $ kn domain create <domain_mapping_name> --ref <ksvc:service_name:service_namespace>
    Copy to Clipboard Toggle word wrap

    명령 예

    $ kn domain create example.com --ref ksvc:showcase:example-namespace
    Copy to Clipboard Toggle word wrap

  • 도메인을 Knative 경로에 매핑합니다.

    $ kn domain create <domain_mapping_name> --ref <kroute:route_name>
    Copy to Clipboard Toggle word wrap

    명령 예

    $ kn domain create example.com --ref kroute:example-route
    Copy to Clipboard Toggle word wrap

14.4. 웹 콘솔을 사용한 도메인 매핑

소유한 사용자 정의 도메인 이름을 Knative 서비스에 매핑하여 Knative 서비스의 도메인을 사용자 지정할 수 있습니다. OpenShift Container Platform 웹 콘솔을 사용하여 DomainMapping CR(사용자 정의 리소스)을 Knative 서비스에 매핑할 수 있습니다.

14.4.1. 사용자 정의 도메인을 서비스에 매핑

사전 요구 사항

  • 웹 콘솔에 로그인했습니다.
  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다. 클러스터 관리자가 완료해야 합니다.
  • 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
  • Knative 서비스를 생성했으며 해당 서비스에 매핑할 사용자 정의 도메인을 제어할 수 있습니다.

    참고

    사용자 정의 도메인에서 OpenShift Container Platform 클러스터의 IP 주소를 참조해야 합니다.

프로세스

  1. 토폴로지 페이지로 이동합니다.
  2. 도메인에 매핑할 서비스를 마우스 오른쪽 버튼으로 클릭하고 서비스 이름이 포함된 편집 옵션을 선택합니다. 예를 들어 서비스 이름이 show인 경우 Edit Show 옵션을 선택합니다.
  3. 고급 옵션 섹션에서 고급 라우팅 옵션 표시를 클릭합니다.

    1. 서비스에 매핑하려는 도메인 매핑 CR이 이미 존재하는 경우 도메인 매핑 목록에서 이를 선택할 수 있습니다.
    2. 새 도메인 매핑 CR을 생성하려면 도메인 이름을 상자에 입력하고 만들기 옵션을 선택합니다. 예를 들어 example.com 을 입력하는 경우 만들기 옵션은 Create "example.com" 입니다.
  4. 저장을 클릭하여 서비스 변경 사항을 저장합니다.

검증

  1. 토폴로지 페이지로 이동합니다.
  2. 생성한 서비스를 클릭합니다.
  3. 서비스 정보 창의 리소스 탭에서는 도메인 매핑에 나열된 서비스에 매핑한 도메인을 확인할 수 있습니다.

14.4.2. 암호화 제품군 제한

수신에 net-kourier 를 지정하고 DomainMapping 을 사용하면 OpenShift 라우팅의 TLS가 passthrough로 설정되고 Kourier Gateway에서 TLS를 처리합니다. 이러한 경우 Kourier에 사용할 수 있는 TLS 암호화 제품군을 제한해야 할 수 있습니다.

사전 요구 사항

  • 웹 콘솔에 로그인했습니다.
  • OpenShift Serverless Operator를 설치했습니다.
  • Knative Serving이 설치되어 있습니다.
  • 프로젝트를 생성하거나 애플리케이션 및 기타 워크로드를 생성할 수 있는 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.

    참고

    사용자 정의 도메인은 클러스터의 IP 주소를 가리켜야 합니다.

프로세스

  • KnativeServing CR에서 cipher-suites 값을 사용하여 활성화할 암호화 제품군을 지정합니다.

    KnativeServing CR 예

    spec:
      config:
        kourier:
          cipher-suites: ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-ECDSA-CHACHA20-POLY1305
    Copy to Clipboard Toggle word wrap

    기타 암호화 제품군은 비활성화됩니다. 여러 제품군을 쉼표로 구분하여 지정할 수 있습니다.

    참고

    Kourier 게이트웨이의 컨테이너 이미지는 Envoy 프록시 이미지를 사용하며 기본 활성화된 암호화 제품군은 Envoy 프록시 버전에 따라 다릅니다.

14.5. TLS 인증서를 사용하여 매핑된 서비스 보안

14.5.1. TLS 인증서를 사용하여 사용자 정의 도메인으로 서비스 보안

Knative 서비스에 대한 사용자 정의 도메인을 구성한 후 TLS 인증서를 사용하여 매핑된 서비스를 보호할 수 있습니다. 이렇게 하려면 Kubernetes TLS 시크릿을 생성한 다음 생성한 TLS 시크릿을 사용하도록 DomainMapping CR을 업데이트해야 합니다.

사전 요구 사항

  • Knative 서비스에 대한 사용자 정의 도메인을 구성하고 DomainMapping CR이 작동합니다.
  • 인증 기관 공급자의 TLS 인증서 또는 자체 서명된 인증서가 있습니다.
  • 인증 기관 공급자 또는 자체 서명된 인증서에서 인증서 및 파일을 가져왔습니다.
  • OpenShift CLI(oc)를 설치합니다.

프로세스

  1. Kubernetes TLS 시크릿을 생성합니다.

    $ oc create secret tls <tls_secret_name> --cert=<path_to_certificate_file> --key=<path_to_key_file>
    Copy to Clipboard Toggle word wrap
  2. Kubernetes TLS 보안에 networking.internal.knative.dev/certificate-uid: <id>' 레이블을 추가합니다.

    $ oc label secret <tls_secret_name> networking.internal.knative.dev/certificate-uid="<id>"
    Copy to Clipboard Toggle word wrap

    cert-manager 와 같은 타사 시크릿 공급자를 사용하는 경우 Kubernetes TLS 보안에 레이블을 지정하도록 시크릿 관리자를 구성할 수 있습니다. cert-manager 사용자는 제공되는 시크릿 템플릿을 사용하여 올바른 레이블로 시크릿을 자동으로 생성할 수 있습니다. 이 경우 키만 기반으로 보안 필터링이 수행되지만 이 값은 시크릿에 포함된 인증서 ID와 같은 유용한 정보를 전송할 수 있습니다.

    참고

    cert-manager Operator for Red Hat OpenShift는 기술 프리뷰 기능입니다. 자세한 내용은 cert-manager Operator for Red Hat OpenShift 설명서를 참조하십시오.

  3. 생성한 TLS 시크릿을 사용하도록 DomainMapping CR을 업데이트합니다.

    apiVersion: serving.knative.dev/v1beta1
    kind: DomainMapping
    metadata:
      name: <domain_name>
      namespace: <namespace>
    spec:
      ref:
        name: <service_name>
        kind: Service
        apiVersion: serving.knative.dev/v1
    # TLS block specifies the secret to be used
      tls:
        secretName: <tls_secret_name>
    Copy to Clipboard Toggle word wrap

검증

  1. DomainMapping CR 상태가 True 이고 출력의 URL 열에 스키마 https 와 함께 매핑된 도메인이 표시되는지 확인합니다.

    $ oc get domainmapping <domain_name>
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                      URL                               READY   REASON
    example.com               https://example.com               True
    Copy to Clipboard Toggle word wrap

  2. 선택 사항: 서비스가 공개적으로 노출되는 경우 다음 명령을 실행하여 서비스를 사용할 수 있는지 확인합니다.

    $ curl https://<domain_name>
    Copy to Clipboard Toggle word wrap

    인증서가 자체 서명된 경우 curl 명령에 -k 플래그를 추가하여 확인을 건너뜁니다.

14.5.2. 시크릿 필터링을 사용하여 net-kourier 메모리 사용량 개선

기본적으로 Kubernetes client-go 라이브러리에 대한 정보 제공자 는 특정 유형의 모든 리소스를 가져옵니다. 이로 인해 많은 리소스가 사용 가능한 경우 상당한 오버헤드가 발생할 수 있으므로 메모리 누수로 인해 대규모 클러스터에서 Knative net-kourier Ingress 컨트롤러가 실패할 수 있습니다. 그러나 필터링 메커니즘은 Knative net-kourier 수신 컨트롤러에서 사용할 수 있으므로 컨트롤러가 Knative 관련 시크릿만 가져올 수 있습니다.

OpenShift Serverless Operator 측에서는 기본적으로 보안 필터링이 활성화됩니다. 환경 변수 ENABLE_SECRET_INFORMER_BY_CERT_UID=true 가 기본적으로 net-kourier 컨트롤러 포드에 추가됩니다.

중요

보안 필터링을 활성화하는 경우 모든 시크릿에 networking.internal.knative.dev/certificate-uid: "<id>" 로 레이블이 지정되어야 합니다. 그렇지 않으면 Knative Serving이 탐지되지 않아 오류가 발생합니다. 새 보안 및 기존 보안에 레이블을 지정해야 합니다.

사전 요구 사항

  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.
  • 애플리케이션 및 기타 워크로드를 생성할 수 있는 역할 및 권한이 있거나 생성한 프로젝트입니다.
  • OpenShift Serverless Operator 및 Knative Serving을 설치합니다.
  • OpenShift CLI(oc)를 설치합니다.

KnativeServing CR(사용자 정의 리소스)의 workloads 필드를 사용하여 ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID 변수를 false 로 설정하여 시크릿 필터링을 비활성화할 수 있습니다.

KnativeServing CR의 예

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
...
  workloads:
    - env:
        - container: controller
          envVars:
            - name: ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID
              value: 'false'
      name: net-kourier-controller
Copy to Clipboard Toggle word wrap

15장. Knative Serving의 고가용성 구성

15.1. Knative 서비스의 고가용성

고가용성(HA)은 중단이 발생하는 경우 API가 작동하도록 하는 데 도움이 되는 Kubernetes API의 표준 기능입니다. HA 배포에서 활성 컨트롤러가 충돌하거나 삭제되면 다른 컨트롤러를 쉽게 사용할 수 있습니다. 이 컨트롤러는 현재 사용할 수 없는 컨트롤러에서 서비스 중인 API의 처리를 대신합니다.

OpenShift Serverless의 HA는 Knative Serving 또는 Eventing 컨트롤 플레인을 설치하면 기본적으로 활성화되는 리더 선택을 통해 사용할 수 있습니다. 리더 선택 HA 패턴을 사용하는 경우에는 요구하기 전에 컨트롤러의 인스턴스가 이미 예약되어 클러스터 내에서 실행됩니다. 이러한 컨트롤러 인스턴스는 리더 선택 잠금이라는 공유 리소스를 사용하기 위해 경쟁합니다. 지정된 시간에 리더 선택 잠금 리소스에 액세스할 수 있는 컨트롤러의 인스턴스를 리더라고 합니다.

15.2. Knative 배포를 위한 고가용성

HA(고가용성)는 Knative Serving activator, autoscaler ,autoscaler -hpa,controller,webhook,domainmapping ,domainmapping- webhook,kourier-control, kourier-gateway 구성 요소에 각각 두 개의 복제본을 갖도록 구성되어 있습니다. KnativeServing CR(사용자 정의 리소스)의 spec.high-availability.replicas 값을 수정하여 이러한 구성 요소의 복제본 수를 변경할 수 있습니다.

15.2.1. Knative Serving의 고가용성 복제본 구성

적합한 배포 리소스에 대해 최소 복제본 3개를 지정하려면 사용자 정의 리소스의 spec.high-availability.replicas 필드 값을 3 으로 설정합니다.

사전 요구 사항

  • OpenShift Container Platform에 대한 클러스터 관리자 권한이 있거나 AWS 또는 OpenShift Dedicated의 Red Hat OpenShift Service에 대한 클러스터 또는 전용 관리자 권한이 있습니다.
  • OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에서 OperatorHub설치된 Operator 로 이동합니다.
  2. knative-serving 네임스페이스를 선택합니다.
  3. OpenShift Serverless Operator의 제공되는 API 목록에서 Knative Serving을 클릭하여 Knative Serving 탭으로 이동합니다.
  4. knative-serving을 클릭한 다음 knative-serving 페이지의 YAML 탭으로 이동합니다.
  5. KnativeServing CR의 복제본 수를 수정합니다.

    YAML의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      high-availability:
        replicas: 3
    Copy to Clipboard Toggle word wrap

  6. 특정 워크로드에 대한 복제본 수를 지정할 수도 있습니다.

    참고

    워크로드별 구성이 Knative Serving의 글로벌 설정을 덮어씁니다.

    YAML의 예

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      high-availability:
        replicas: 3
      workloads:
      - name: webhook
        replicas: 4
    Copy to Clipboard Toggle word wrap

  7. 고가용성 제한이 적용되는지 확인합니다.

    명령 예

    $ oc get hpa -n knative-serving
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME        REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    activator   Deployment/activator   0%/100%   3         22        3          2m24s
    webhook     Deployment/webhook     2%/100%   4         8         4          2m23s
    Copy to Clipboard Toggle word wrap

15.2.2. 중단 예산 덮어쓰기

Pod 중단 예산(PDB)은 유지 관리를 위해 Pod를 다시 예약해야 하는 경우 애플리케이션으로 중단을 제한하는 데 도움이 되는 Kubernetes API의 표준 기능입니다.

프로세스

  • KnativeServing CR(사용자 정의 리소스)에서 minAvailable 구성 값을 수정하여 특정 리소스에 대한 기본 PDB를 재정의합니다.

minAvailable 설정이 70%인 PDB의 예

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
 name: knative-serving
 namespace: knative-serving
spec:
 podDisruptionBudgets:
 - name: activator-pdb
   minAvailable: 70%
Copy to Clipboard Toggle word wrap

참고

high-availability.replicas 값을 1 로 변경하여 고가용성을 비활성화하는 경우 해당 PDB minAvailable 값도 0 으로 업데이트하십시오. 그러지 않으면 Pod 중단 예산에서 자동 클러스터 또는 Operator 업데이트를 방지합니다.

16장. 튜닝 제공 구성

16.1. Knative Serving 시스템 배포 구성 덮어쓰기

KnativeServing CR(사용자 정의 리소스)의 workloads 사양을 수정하여 일부 특정 배포의 기본 구성을 덮어쓸 수 있습니다.

16.1.1. 시스템 배포 구성 덮어쓰기

현재는 프로브 준비활성 필드뿐만 아니라 리소스,복제본,레이블, nodeSelector 필드에 대해 기본 구성 설정을 재정의할 수 있습니다.

다음 예에서 KnativeServing CR은 다음과 같이 웹 후크 배포를 덮어씁니다.

  • net-kourier-controller준비 상태 프로브 시간 초과는 10초로 설정됩니다.
  • 배포에 CPU 및 메모리 리소스 제한이 지정되어 있습니다.
  • 배포에는 3개의 복제본이 있습니다.
  • example-label: 레이블이 추가되었습니다.
  • example-annotation: 주석 주석이 추가되었습니다.
  • nodeSelector 필드는 disktype: hdd 라벨이 있는 노드를 선택하도록 설정됩니다.
참고

KnativeServing CR 레이블 및 주석 설정은 배포 자체와 결과 Pod 모두에 대한 배포의 레이블 및 주석을 재정의합니다.

KnativeServing CR 예

apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: ks
  namespace: knative-serving
spec:
  high-availability:
    replicas: 2
  workloads:
  - name: net-kourier-controller
    readinessProbes: 
1

      - container: controller
        timeoutSeconds: 10
  - name: webhook
    resources:
    - container: webhook
      requests:
        cpu: 300m
        memory: 60Mi
      limits:
        cpu: 1000m
        memory: 1000Mi
    replicas: 3
    labels:
      example-label: label
    annotations:
      example-annotation: annotation
    nodeSelector:
      disktype: hdd
Copy to Clipboard Toggle word wrap

1
준비 및 활성 상태 프로브 덮어쓰기를 사용하여 프로브 처리기와 관련된 필드를 제외하고 Kubernetes API에 지정된 대로 배포 컨테이너에서 프로브의 모든 필드를 덮어쓸 수 있습니다. exec,grpc,httpGet, tcpSocket.

17장. 큐 프록시 리소스 구성

Queue 프록시는 서비스 내의 각 애플리케이션 컨테이너에 대한 사이드카 컨테이너입니다. Serverless 워크로드 관리를 개선하여 리소스 사용량을 효율적으로 보장합니다. Queue 프록시를 구성할 수 있습니다.

17.1. Knative 서비스에 대한 큐 프록시 리소스 구성

배포 구성 맵에서 큐 프록시 리소스 요청 및 제한을 전역적으로 구성하는 것 외에도 CPU, 메모리 및 임시 스토리지 리소스 유형을 대상으로 하는 해당 주석을 사용하여 서비스 수준에서 설정할 수 있습니다.

사전 요구 사항

  • Red Hat OpenShift Pipelines가 클러스터에 설치되어 있어야 합니다.
  • OpenShift(oc) CLI가 설치되어 있습니다.
  • Knative(kn) CLI가 설치되어 있습니다.

프로세스

  • 리소스 요청 및 제한을 사용하여 서비스의 configmap을 수정합니다.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: example-service
      namespace: default
    spec:
      template:
        metadata:
          annotations:
            queue.sidecar.serving.knative.dev/cpu-resource-request: "1"
            queue.sidecar.serving.knative.dev/cpu-resource-limit: "2"
            queue.sidecar.serving.knative.dev/memory-resource-request: "1Gi"
            queue.sidecar.serving.knative.dev/memory-resource-limit: "2Gi"
            queue.sidecar.serving.knative.dev/ephemeral-storage-resource-request: "400Mi"
            queue.sidecar.serving.knative.dev/ephemeral-storage-resource-limit: "450Mi"
    Copy to Clipboard Toggle word wrap

    또는 Queue 프록시 리소스를 애플리케이션 컨테이너의 백분율로 계산하는 특수 queue.sidecar.serving.knative.dev/resource-percentage 주석을 사용할 수 있습니다. CPU 및 메모리 리소스 요구 사항이 애플리케이션 컨테이너 요구 사항에서 계산되고 아래 경계 외부에 있는 경우 값이 경계에 맞게 조정됩니다. 이 경우 CPU 및 메모리 리소스 요구 사항에 다음 최소 및 최대 경계가 적용됩니다.

    Expand
    표 17.1. 리소스 요구 사항 경계
    리소스 요구 사항Max

    CPU 요청

    25m

    100m

    CPU 제한

    40m

    500m

    메모리 요청

    50Mi

    200Mi

    메모리 제한

    200Mi

    500Mi

    참고

    해당 리소스 주석을 사용하여 백분율 주석과 특정 리소스 값을 동시에 설정하는 경우 후자가 우선합니다.

    주의

    queue.sidecar.serving.knative.dev/resource-percentage 주석이 더 이상 사용되지 않으며 향후 OpenShift Serverless 버전에서 제거됩니다.

법적 공지

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat
맨 위로 이동