Kubernetes 이야기

Knative Serving example 본문

Knative/일반

Knative Serving example

kmaster 2022. 2. 15. 20:39
반응형

Knative Serving은 다음을 가능하게 하는 구성요소를 제공한다.

  • 서버리스 컨테이너의 신속한 배포.
  • 포드를 0으로 축소하는 것을 포함한 자동 확장.
  • 기존 환경에 통합하기 위해 Contour, Kourier 및 Istio와 같은 여러 네트워킹 계층을 지원.
  • 배포된 코드 및 구성의 특정 시점 스냅샷.

Knative Serving은 HTTP 및 HTTPS 네트워킹 프로토콜을 모두 지원한다.

 

https://knative.dev/docs/serving/#serving-resources

예제 소스

# git clone https://github.com/knative/docs.git knative-docs
Cloning into 'knative-docs'...
remote: Enumerating objects: 37515, done.
remote: Counting objects: 100% (587/587), done.
remote: Compressing objects: 100% (332/332), done.
remote: Total 37515 (delta 296), reused 469 (delta 231), pack-reused 36928
Receiving objects: 100% (37515/37515), 55.02 MiB | 11.61 MiB/s, done.
Resolving deltas: 100% (24056/24056), done.

# cd knative-docs/code-samples/serving/hello-world/helloworld-python

 

container build

소스를 다운받았으면 빌드를 해보자.

# podman build -t 10.60.200.121:5000/helloworld-python .
STEP 1: FROM python:3.7-slim
STEP 2: ENV PYTHONUNBUFFERED True
--> Using cache ae10b08d8ecb4c9246d66682b548282890fe4ee11980c8dfb537ec491bda7b5f
STEP 3: ENV APP_HOME /app
--> Using cache 178c80ce4ba61c973bba01df7f9490f87dea26169396d5fa3e09d826e4c02e11
STEP 4: WORKDIR $APP_HOME
--> Using cache a10c29b47819e98a066bc9a59c0859fbca93c7fa0ea19f113e2ed2a75138860f
STEP 5: COPY . ./
--> Using cache 7fa2d03fbfc8b1b36a12a23609e416fa30fe258957d3dd28fbb37968b7c86f08
STEP 6: RUN pip install Flask gunicorn
--> Using cache f02aae005789b055f01dc1c99b6805478aa7ab4f04241be6e10632e3ea5e4b4a
STEP 7: CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
--> Using cache ba09742b809cceec35e9a379825c003e61be8efce05edd2456ea54970ab9012c
STEP 8: COMMIT 10.60.200.121:5000/helloworld-python
ba09742b809cceec35e9a379825c003e61be8efce05edd2456ea54970ab9012c
ba09742b809cceec35e9a379825c003e61be8efce05edd2456ea54970ab9012c

 

container push

빌드된 Image를 내부 Registry에 Push 한다.

# podman push 10.60.200.121:5000/helloworld-python
Getting image source signatures
Copying blob a97be6a3018d done
Copying blob df1e77b59947 done
Copying blob 32034715e5d4 done
Copying blob 53dfcb4b8d77 done
Copying blob 1da136635b59 done
Copying blob 7d0ebbe3f5d2 done
Copying blob 03cbb08c3adc done
Copying config ba09742b80 done
Writing manifest to image destination
Storing signatures

service.yaml

이제 Service를 생성해보자.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-python
  namespace: default
spec:
  template:
    spec:
      containers:
      - image: 10.60.200.121:5000/helloworld-python
        env:
        - name: TARGET
          value: "Python Sample v1"
      imagePullSecrets:
      - name: user-registry
# kubectl create -f service.yaml
service.serving.knative.dev/helloworld-python created

 

실제 호출 전 pod 상태를 조회해 보도록 하자. 아직 호출 전이기 때문에 실제 Pod가 생성되지 않은 상태이다.

# k get po
No resources found in default namespace.

 

검증

# kubectl get ksvc helloworld-python  --output=custom-columns=NAME:.metadata.name,URL:.status.url
NAME                URL
helloworld-python   http://helloworld-python.default.example.com

 

이제 서비스를 호출해 보자. 내부에 curl 로 호출한다. 브라우저에서 호출해도 상관없다.

# curl -H "Host: helloworld-python.default.example.com" http://10.60.200.121:31614
Hello Python Sample v1!

 

호출 후 pod 상태를 조회해 보자.

# k get po
NAME                                                  READY   STATUS    RESTARTS   AGE
helloworld-python-00004-deployment-5c84fd8775-djwx6   2/2     Running   0          24s

 

호출 없이 2분이 경과되면 다시 pod가 내려간 상태를 유지한다. (Pod가 축소되는 데 최대 2분이 소요될 수 있다. )

# k get po
No resources found in default namespace.

[참고]

 

* 테스트 시 private registry를 사용하는 경우 ( 예를 들어 내부 harbor ) TLS 인증서 오류가 발생할 수 있다.

Message: Revision "helloworld-python-00003" failed with message: Unable to fetch image "10.60.200.121:30001/helloworld-python": failed to resolve image to digest: Get "https://10.60.200.121:5000/v2/": x509: certificate signed by unknown authority; Get "http://10.60.200.121:30001/v2/": net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".

 

이럴때는 아래와 같이 수정한다.

[registriesSkippingTagResolving: 10.60.200.121:5000 추가]

# kubectl -n knative-serving edit configmap config-deployment
apiVersion: v1
data:
  registriesSkippingTagResolving: 10.60.200.121:5000
  _example: |-
    ################################
    #                              #
    #    EXAMPLE CONFIGURATION     #
    #                              #
    ################################

    # This block is not actually functional configuration,
    # but serves to illustrate the available configuration
    # options and document them in a way that is accessible
    # to users that `kubectl edit` this config map.

 

반응형

'Knative > 일반' 카테고리의 다른 글

Knative 란  (0) 2022.02.09
Comments