OpenFaaS on a Kubernetes cluster 구조
9826 단어 kubernetesOpenFaaS
입문
OpenFaaS가 Kubernetes에서 실행될 때 Function이 어떻게 생성되고 실행되는지 보십시오.
OpenFaaS on a Kubernetes cluster 구성 요소 목록
함수 관리 방법
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을 살펴보겠습니다.
DockerfileFROM 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
처리 절차는 다음과 같다.
마지막
이번에 소개하지 않은 곳에도 재미있는 설치가 몇 개 있다.
$ 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
$ kubectl get svc url-ping -o yaml | grep -a2 selector
protocol: TCP
targetPort: 8080
selector:
faas_function: url-ping
sessionAffinity: None
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
…
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)
if _, updateErr := clientset.ExtensionsV1beta1().Deployments(functionNamespace).Update(deployment); updateErr != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(updateErr.Error()))
}
이번에 소개하지 않은 곳에도 재미있는 설치가 몇 개 있다.
현재 기능적인 자유도가 너무 높기 때문에 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 ↩
Reference
이 문제에 관하여(OpenFaaS on a Kubernetes cluster 구조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TakanariKo/items/5e3117ea7c3afa948de5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)