OpenFaaS on a Kubernetes cluster 구조

9826 단어 kubernetesOpenFaaS

입문


OpenFaaS가 Kubernetes에서 실행될 때 Function이 어떻게 생성되고 실행되는지 보십시오.

OpenFaaS on a Kubernetes cluster 구성 요소 목록

  • API gateway
  • FaaS REST API + GUI
  • K8S의 경우 faas-netesd의 Proxy 또는 Docker Swarm의 경우 서버에서 처리
  • faas-netesd
  • FaaS 호스트
  • OpenFaaS에 외부 플러그인을 추가하고 K8S의 API와 협업
  • function의 CRUD 작업 또는 실행
  • Prometheus
  • AlertManager
  • nats-queue-worker
  • 비동기식 FaaS
  • 사용하지 않을 때 모두 동기화
  • 본 보도 불처리
  • 함수 관리 방법


    OpenFaaS는 전용 스토리지가 없고 K8S의 구성 요소로 관리되는 것이 특징입니다.

    기능은 배포 및 서비스로 표시됩니다.


    만약 배치 함수가,defaultnamespace에 배치됩니다.namespace를 따로 지정하지 않으면.
    배포 함수가 K8S 배포 및 서비스에서 관리되는지 확인할 수 있습니다.
    $ kubectl get deployment
    NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    alertmanager    1         1         1            1           1h
    faas-netesd     1         1         1            1           1h
    gateway         1         1         1            1           1h
    hello-python3   1         1         1            1           43m
    nodejs-echo     1         1         1            1           1h
    prometheus      1         1         1            1           1h
    ruby-echo       1         1         1            1           1h
    shrink-image    1         1         1            1           1h
    url-ping        1         1         1            1           1h
    
    $ kubectl get po
    NAME                             READY     STATUS    RESTARTS   AGE
    alertmanager-77b4b476b-qdbl5     1/1       Running   1          1h
    faas-netesd-64fb9b4dfb-mqss5     1/1       Running   1          1h
    gateway-5cb4f64656-pltpb         1/1       Running   1          1h
    hello-python3-5997c5598f-jzh5n   1/1       Running   1          43m
    nodejs-echo-5c9699c8b5-4zkht     1/1       Running   1          1h
    prometheus-7fbfd8bfb8-kv98c      1/1       Running   1          1h
    ruby-echo-8d95f97fb-4wkm7        1/1       Running   1          1h
    shrink-image-5dd9c4cc7c-qhmq2    1/1       Running   1          1h
    url-ping-5965bc9f4f-2gltw        1/1       Running   1          1h
    
    $ kubectl get svc
    NAME            CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
    alertmanager    10.0.0.79    <nodes>       9093:31113/TCP   6d
    faas-netesd     10.0.0.115   <nodes>       8080:31111/TCP   6d
    gateway         10.0.0.75    <nodes>       8080:31112/TCP   6d
    hello-python3   10.0.0.66    <none>        8080/TCP         44m
    kubernetes      10.0.0.1     <none>        443/TCP          6d
    nodejs-echo     10.0.0.102   <none>        8080/TCP         1h
    prometheus      10.0.0.127   <nodes>       9090:31119/TCP   6d
    ruby-echo       10.0.0.64    <none>        8080/TCP         1h
    shrink-image    10.0.0.119   <none>        8080/TCP         1h
    url-ping        10.0.0.178   <none>        8080/TCP         1h
    
    서비스에서 알 수 있듯이 모든 기능은 포트 8080에서 수신된다.
    function 서비스 좀 봐.
    $ kubectl get svc url-ping -o yaml | grep -a2 selector
        protocol: TCP
        targetPort: 8080
      selector:
        faas_function: url-ping
      sessionAffinity: None
    
    label이faas_function: url-ping에 대한 Pod을 볼 수 있습니다.
    여기서 faas의 CLI에서build된 Dockerfile을 살펴보겠습니다.
    Dockerfile
    FROM python:3-alpine
    
    # Alternatively use ADD https:// (which will not be cached by Docker builder)
    RUN apk --no-cache add curl \
        && echo "Pulling watchdog binary from Github." \
        && curl -sSL https://github.com/openfaas/faas/releases/download/0.6.9/fwatchdog > /usr/bin/fwatchdog \
        && chmod +x /usr/bin/fwatchdog \
        && apk del curl --no-cache
        …
    
    이 fwatchdog는 8080 포트에서 수신되고 모든 언어의 프로세스를 시작합니다.
    fwatchdog는 표준 입력을 하위 프로세스에 전달하고 하위 프로세스의 표준 출력을 수신하는 HTTP 서버입니다.
    The watchdog provides an unmanaged and generic interface between the outside world and your function. Its job is to marshal a HTTP request accepted on the API Gateway and to invoke your chosen appliaction. The watchdog is a tiny Golang webserver - see the diagram below for how this process works.

    https://github.com/openfaas/faas/tree/master/watchdog
    하위 프로세스만 시작했기 때문에 사용자 정의를 하면 언어가 실행될 때 Docker in Docker와도 대응할 수 있습니다.

    어떻게 기능을 배치합니까?


    FaaS-netes의 deploy handler에서 K8S API에 액세스하여 deployment와 서비스를 만드는 것을 볼 수 있습니다.
      deploy := clientset.Extensions().Deployments(functionNamespace)
    
      _, err = deploy.Create(deploymentSpec)
      if err != nil {
          log.Println(err)
          w.WriteHeader(http.StatusInternalServerError)
          w.Write([]byte(err.Error()))
          return
      }
    
      log.Println("Created deployment - " + request.Service)
    
      service := clientset.Core().Services(functionNamespace)
      serviceSpec := makeServiceSpec(request)
      _, err = service.Create(serviceSpec)
    
    https://github.com/openfaas/faas-netes/blob/0.3.7/handlers/deploy.go#L83
    업데이트 시 업데이트 핸들러도 K8S API에 액세스하여 deployment를 업데이트합니다.
      if _, updateErr := clientset.ExtensionsV1beta1().Deployments(functionNamespace).Update(deployment); updateErr != nil {
          w.WriteHeader(http.StatusInternalServerError)
          w.Write([]byte(updateErr.Error()))
      }
    
    https://github.com/openfaas/faas-netes/blob/0.3.7/handlers/update.go#L72
    ※ 서비스, deployment에서 관리하기 때문에 용기 이미지가 무엇이든 라벨을 설정하고 K8S에 배치하면 GUI가 바로 반영됩니다.

    어떻게 함수의 시도 횟수를 관리합니까?


    앞에서 설명한 대로 OpenFaaS 자체는 영구 스토리지를 보존하지 않습니다.
    그러나 API Gaway, 각 Function,faas-netes의 Pod를 삭제하더라도 다시 생성할 때 Function 시도 횟수 등은 유지됩니다.
    이것은 저장 목표가 Prometheus의 도량이기 때문에 Pod을 삭제해도 데이터를 잃어버리지 않고 조회할 수 있기 때문이다.
    https://github.com/openfaas/faas/blob/v0.5/gateway/server.go#L38

    어떻게 기능을 확대/축소합니까?


    특정 함수의 경우 API 게이트웨이의 요청 수가 일정 수를 초과하면 함수가 축소됩니다(Pod 증가).
    이때 API Gateway는 상응하는 function의 요청 행렬을 수집하고 Prometheus는 회수하며 AlertManager를 통해FaaS로 통신한다.
    이것은 AlertManager가 Docker Swarm과 K8S에서 실행되어 구성 요소 간의 트리거로 사용할 수 있기 때문일 수 있습니다.
    https://github.com/openfaas/faas/blob/v0.5/gateway/handlers/alerthandler.go#L16
    처리 절차는 다음과 같다.

    마지막


    이번에 소개하지 않은 곳에도 재미있는 설치가 몇 개 있다.
  • Function 간의 협업을 위한 Function 체인, wrapper function 제작, Function의 결과를 정리한 후 function을 실행하는 방법 등도 있다.
  • Function 실행 시 비동기식 처리는 NATS를 통해 수행할 수 있습니다.
  • 향후 로드맵에는 특권 용기 등에 Docker Build와 API Gateway의 Kafka 대응, NatsQ 이외의 Kafka 대응 등이 적혀 있다.
    현재 기능적인 자유도가 너무 높기 때문에 Authn/Authz, Function 간의 교환은 Kubernetes에 존재하는 FaaS 이외의 Pod에 대한 영향, 자원 관리 등 안전에 있어 자원에 많은 문제점을 남겼지만 개인이 사용하는 의미에서 매우 흥미로운 구조이다.
    Z Lab Kubernetes와 CNCF를 중심으로 기술 조사와 개발을 진행한다.
    계속 즐기세요Z Lab Advent Calendar2017.
    https://github.com/openfaas/faas/blob/b32a3f30ea936215ba10628fb202f7dcb2415e96/guide/chaining_functions.md  
    https://github.com/openfaas/faas/blob/master/guide/asynchronous.md  
    https://github.com/openfaas/faas/blob/master/ROADMAP.md  

    좋은 웹페이지 즐겨찾기