OpenFaas

ๆœฌๆ–‡ไธป่ฆๅŸบไบŽ OpenFaas v0.18.18 ็‰ˆๆœฌๅ’Œ faas-netes v0.12.2 ็‰ˆๆœฌ

ๅฎ˜ๆ–นๆ–‡ๆกฃ

ๆœ€่ฟ‘ release

ๅผ€ๅง‹ๅญฆไน ไน‹ๅ‰๏ผŒๅ…ˆ็œ‹็œ‹ๆœฌ repo ๆœ€่ฟ‘ๅœจๅนฒไป€ไนˆ๏ผˆๆˆช่‡ณ 2021.06๏ผ‰:

OpenFaas

  • 0.20.0 [2020.11]

    • Add namespace in function name for metrics

  • 0.19.0 [2020.10]

    • Security update for UI (AngularJS & Material)

  • 0.18.18 [2020.07]

    • Remove service namespace from scale request

  • 0.18.17 [2020.04]

    • Publish async requests to multiple topics

  • 0.18.16 [2020.04]

    • Add QueueName to async requests

faas-netes

  • 0.13.0 [2021.02]

    • Update provider to v0.17.0

  • 0.12.0 [2020.07]

    • Create new Policy client and type so that we can read Policy

      configurations

    • Add linkerd auto injection

  • 0.11.0 [2020.06]

    • Add cluster role and binding to operator

    • Expose nats monitoring metrics to prometheus

  • 0.10.5 [2020.05]

    • Update apply REST handler

่ทŸ fissionใ€kubelsss ็ฑปไผผ๏ผŒๆฒกๆœ‰ๅคชๅคšๅŠŸ่ƒฝๆ€ง็š„ๆ”นๅŠจใ€‚ไธ่ฟ‡ไปฅ 0.12.0๏ผˆ2020.07.15๏ผ‰ใ€0.12.1๏ผˆ2020.07.20๏ผ‰ใ€0.12.2๏ผˆ2020.07.20๏ผ‰๏ผŒๅ‘ๅธƒๅฏ†้›†ใ€ๅŠŸ่ƒฝๆ”นๅŠจๅฐ‘๏ผŒ็‰ˆๆœฌ็ฎก็†่ฟ˜ๆ˜ฏๆœ‰็‚นๅˆซๅ…ทไธ€ๆ ผ๏ผŒๆ‰€ไปฅๅŽ็ปญๅชๅ…ณๆณจ 0.12 -> 0.13 ่ฟ™็งๅคง็‰ˆๆœฌๅ˜ๅŠจ๏ผŒ่™ฝ็„ถ็œ‹่ตทๆฅๅคง็‰ˆๆœฌ้—ดไนŸๆฒกๆœ‰ๅคชๅคšๅ˜ๅŒ–

้ƒจ็ฝฒ

็ป“ๅˆๅฎžๆˆ˜ๆฅๅญฆไน ๆœฌ repo

ๅฎ‰่ฃ…

ๅฎ‰่ฃ… client

$ curl -Lo faas-cli https://github.com/openfaas/faas-cli/releases/download/0.12.8/faas-cli \
    && chmod +x faas-cli && sudo mv faas-cli /usr/local/bin/

ๅฎ‰่ฃ… server

$ cd faas-netes # ่ฟ›ๅ…ฅ faas-netes ไป“ๅบ“
$ kubectl apply -f namespaces.yml
$ kubectl -n openfaas create secret generic basic-auth \
    --from-literal=basic-auth-user=admin \
    --from-literal=basic-auth-password="admin"
$ kubectl apply -f ./yaml/

็กฎ่ฎค้ƒจ็ฝฒ็ป„ไปถ้ƒฝๅทฒๆญฃๅธธๅทฅไฝœ

$ kubectl -n openfaas get pod
NAME                                 READY   STATUS    RESTARTS   AGE
alertmanager-7b84d7cf98-4clfx        1/1     Running   0          2m29s
basic-auth-plugin-6b69d6f8f7-hdg4s   1/1     Running   0          2m29s
faas-idler-69669f65b4-9dwgg          1/1     Running   0          2m29s
gateway-5bb669b8b9-7jnnr             2/2     Running   0          2m29s
nats-7b999bdb67-s9wsg                1/1     Running   0          2m29s
prometheus-88c57d976-fqmss           1/1     Running   0          2m28s
queue-worker-6c95cf8664-nm4sb        1/1     Running   0          2m28s

้ชŒ่ฏ

$ export OPENFAAS_URL=http://127.0.0.1:31112
$ faas-cli login --password admin
$ faas-cli store deploy figlet
$ echo "hello, world!" | faas-cli invoke figlet
hello, world!

ๅธ่ฝฝ

$ kubectl delete -f ./yaml/
$ kubectl delete -f namespaces.yml

ๆžถๆž„

ๅฎ‰่ฃ…ๅฎŒ OpenFaas ไน‹ๅŽ๏ผŒๆฅๆขณ็†ไธ‹ๅฎ‰่ฃ…็š„็ป„ไปถ

pod

ๅฎนๅ™จ

ๅ‘ฝไปค

ๆบ็  repo

alertmanager

alertmanager

alertmanager --config.file ...

basic-auth-plugin

basic-auth-plugin

handler

OpenFaas

faas-idler

faas-idler

faas-idler -dry-run=true

gateway

gateway

gateway

OpenFaas

faas-netes

faas-netes

faas-netes

nats

nats

nats-streaming-server

prometheus

prometheus

prometheus --config ...

queue-worker

queue-worker

app

ๆณจ๏ผš

  • faas-idler ็ผบ็œๅฎ‰่ฃ…ๆƒ…ๅ†ตไธ‹๏ผŒๆ˜ฏไปฅ dry-run ่ฟ่กŒ็š„๏ผŒไนŸๅฐฑๆ˜ฏๅนถๆฒกๆœ‰ๅœจๅทฅไฝœ

  • basic-auth ๆ˜ฏไธช็ฎ€ๅ•็š„้‰ดๆƒๅฎž็Žฐ๏ผŒ่ฟ™้‡Œๅฐฑไธๅ†่ฏฆ็ป†่ฏดๆ˜Žไบ†

ๆ•ดไฝ“ๆžถๆž„ๅฆ‚ไธ‹๏ผš

architecture

ๅ›พ็‰‡ๆฅๆบ

ๅ…ถไธญ๏ผš

  • alertmanagerใ€natsใ€prometheus ๆ˜ฏ็คพๅŒบๅ…ถๅฎƒ้กน็›ฎ็ป„ไปถ

  • queue-worker ๆ˜ฏ้…ๅˆ nas ๅšๅผ‚ๆญฅๅ‡ฝๆ•ฐ invoke ็”จ็š„

่€Œ k8s ไฝ“็ณปไธ‹ faas ็š„็›ธๅ…ณๅฎž็Žฐ๏ผŒไธป่ฆ้ƒฝๆ˜ฏๅœจ faas-netes ไธญๅฎž็Žฐ็š„

ๆฆ‚ๅฟต

ไธŽ Fission ๅ’Œ Kubeless ไธๅŒ๏ผŒOpenFaas ๆ˜ฏไปŽ docker ็คพๅŒบ่ฏž็”Ÿ็š„้กน็›ฎ๏ผŒๆ‰€ไปฅๆœ€ๅˆ็š„่ฎพ่ฎกๆ˜ฏ้ขๅ‘่ฟ‡็จ‹ๅผ็š„๏ผŒๅนถๆฒกๆœ‰ๅผ•ๅ…ฅ CRD

ๆณจ๏ผšๆฒกๆœ‰ CRD ๅฝ“ๅ‰ๆ˜ฏ็ผบ็œๆจกๅผ๏ผŒfaas-netes ไนŸ่ฟฝๅŠ ไบ†ไธ€็ง้ขๅ‘ CRD ็š„ๅฎž็Žฐ

ไฝฟ็”จ

ๅŸบๆœฌๅŠŸ่ƒฝ

ๆœฌๅฐ่Š‚ไผšๆŒ‰็…งโ€œไปŽ้›ถๅผ€ๅง‹ๅ†™ไธ€ไธช go ๅ‡ฝๆ•ฐโ€็š„ๆต็จ‹๏ผŒๆฅๆขณ็†ๅŠŸ่ƒฝ

ๅˆ›ๅปบๅ‡ฝๆ•ฐ

$ faas-cli new hello-go --lang go

ไธŠ่ฟฐๅ‘ฝไปคๅˆ›ๅปบไบ†ไธ€ไธช go ๅ‡ฝๆ•ฐใ€‚ๅฎž้™…ๅฎŒๆˆ็š„ๅทฅไฝœๆ˜ฏ๏ผšไปŽๆจกๆฟๅบ“้‡Œ่Žทๅ–ๆจกๆฟๅˆฐๅฝ“ๅ‰็›ฎๅฝ•

$ tree -L 2
.
โ”œโ”€โ”€ hello-go
โ”‚   โ””โ”€โ”€ handler.go
โ”œโ”€โ”€ hello-go.yml
โ””โ”€โ”€ template
    โ”œโ”€โ”€ csharp
    โ”œโ”€โ”€ csharp-armhf
    โ”œโ”€โ”€ dockerfile
    โ”œโ”€โ”€ go
    โ”œโ”€โ”€ go-armhf
    โ”œโ”€โ”€ java11
    โ”œโ”€โ”€ java11-vert-x
    โ”œโ”€โ”€ java8
    โ”œโ”€โ”€ node
    โ”œโ”€โ”€ node12
    โ”œโ”€โ”€ node-arm64
    โ”œโ”€โ”€ node-armhf
    โ”œโ”€โ”€ php7
    โ”œโ”€โ”€ python
    โ”œโ”€โ”€ python3
    โ”œโ”€โ”€ python3-armhf
    โ”œโ”€โ”€ python3-debian
    โ”œโ”€โ”€ python-armhf
    โ””โ”€โ”€ ruby

ๅกซๅ…… go ๅ‡ฝๆ•ฐ

ๅ•ๅฐฑๆˆ‘ไปฌๆœฌๆฌกๆต็จ‹่€Œ่ฎบ๏ผŒๅฏไปฅไป€ไนˆ้ƒฝไธๆ”นใ€‚็ผบ็œๆจกๆฟไปฃ็ ๏ผš

$ cat hello-go/handler.go
package function

import (
    "fmt"
)

// Handle a serverless request
func Handle(req []byte) string {
    return fmt.Sprintf("Hello, Go. You said: %s", string(req))
}

็ผ–่ฏ‘ go ๅ‡ฝๆ•ฐ

$ faas-cli build -f hello-go.yml

ไธŠ่ฟฐๅ‘ฝไปคๆœฌ่ดจไธŠๅฐฑๆ˜ฏ docker build๏ผŒๆœ€็ปˆ็”Ÿๆˆไธ€ไธชๅซๆœ‰ fwatchdog๏ผˆไธ€ไธช go web server๏ผ‰ ๅ’Œ go ไปฃ็ ็ผ–่ฏ‘ๅŒ…็š„ๅทฅไฝœ้•œๅƒ

ๆŽจ้€ go ้•œๅƒ

$ faas-cli push -f hello-go.yml

ไธŠ่ฟฐๅ‘ฝไปคๆœฌ่ดจไธŠๅฐฑๆ˜ฏ docker push

้ƒจ็ฝฒ go ๅ‡ฝๆ•ฐ

$ faas-cli deploy -f hello-go.yml

ไธŠ่ฟฐๅ‘ฝไปคๅฐ†ๅˆšๅˆš็ผ–่ฏ‘ใ€ๆŽจ้€ๅฅฝ็š„ docker ้•œๅƒ้ƒจ็ฝฒๅˆฐ k8sใ€‚ๆถ‰ๅŠ็š„ๅฎŒๆ•ดๆต็จ‹ๆ˜ฏ๏ผš

  • faas-cli ๅ‘้€ deploy ่ฏทๆฑ‚ๅˆฐ gateway

  • gateway ๅฐ† deploy ่ฏทๆฑ‚่ฝฌๅ‘็ป™ faas-netes

  • faas-netes ๅˆ›ๅปบๅฏนๅบ”็š„ deploymentใ€service

ไนŸๅชๆœ‰ๅˆฐไบ†่ฟ™ไธ€ๆญฅ๏ผŒfaas-cli ๆ‰่ƒฝ็œ‹ๅˆฐๅ‡ฝๆ•ฐ๏ผˆ็ผบ็œๆจกๅผไธ‹๏ผ‰ใ€‚ๅ› ไธบๆฒกๆœ‰ๅผ•ๅ…ฅ CRD๏ผŒfaas-cli list ๅ‘ฝไปคๆœฌ่ดจไธŠไนŸไพ่ต–ไปŽ deploy ่Žทๅ–ไฟกๆฏ๏ผŒๆขๅฅ่ฏ่ฏดๅˆ ้™ค deploy๏ผŒlist ่ฟ”ๅ›žไนŸไผšๅ˜ไธบ็ฉบใ€‚่€Œๅฆๅค–ไธคไธชๅนณๅฐ๏ผŒๅˆ™ไผšๆ นๆฎ CR๏ผŒ้‡ๆ–ฐๅˆ›ๅปบ deploy

$ kubectl -n openfaas-fn get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
hello-go   1/1     1            1           11m
$ faas-cli list
Function                          Invocations        Replicas
hello-go                          1                  1

่งฆๅ‘ go ๅ‡ฝๆ•ฐ

$ echo -n "hello, world!" | faas-cli invoke hello-go
Hello, Go. You said: hello, world!

ไธŠ่ฟฐๅ‘ฝไปคๅฎŒๆˆไบ† go ๅ‡ฝๆ•ฐ็š„่งฆๅ‘ใ€‚ๆถ‰ๅŠ็š„ๅฎŒๆ•ดๆต็จ‹ๆ˜ฏ๏ผš

  • faas-cli ๅ‘้€ invoke ๅ‘ฝไปคๅˆฐ gateway

  • gateway ไปŽ faas-netes ่Žทๅ–ๅ‡ฝๆ•ฐๅœฐๅ€

  • gateway ่ฐƒ็”จๅ‡ฝๆ•ฐ

  • pod ้‡Œ็š„ fwatchdog ่ฟ›็จ‹ๆ”ถๅˆฐ่ฏทๆฑ‚๏ผŒๅŠ ่ฝฝๅนถ่ฟ่กŒ็”จๆˆทๅ‡ฝๆ•ฐ

ๅ‡ฝๆ•ฐๆ‰ฉ็ผฉ

OpenFaas ๆไพ›ไบ†ๅคš็งๆ‰ฉ็ผฉๅฎž็Žฐ๏ผš

  • ๅŸบไบŽ AlertManager ็š„ๅฎž็Žฐ

  • ๅŸบไบŽ HPA ็š„ๅฎž็Žฐ

้™คๆญคไน‹ๅค–๏ผŒgateway ๆไพ›ไบ† "scale up from zero" ่ƒฝๅŠ›๏ผŒfaas-idler ็ป„ไปถๆไพ›ไบ† "scale down to zero" ็š„่ƒฝๅŠ›

OpenFaas ็š„ๆ‰ฉ็ผฉ้…็ฝฎๆฏ”่พƒๅˆ†ๆ•ฃ๏ผŒๅ‚่€ƒๆ–‡ๆกฃ

ๅ‡ฝๆ•ฐ่งฆๅ‘

ไธŠ่ฟฐๅฐ่Š‚ไปฅๅ‘ฝไปค่กŒ็š„ๅฝขๅผ๏ผŒๆ‰‹ๅทฅ่งฆๅ‘ๅ‡ฝๆ•ฐ่ฐƒ็”จ๏ผŒ่€Œๅœจ็”Ÿไบง็Žฏๅขƒ๏ผŒOpenFaas ๆไพ›ไบ†ไปฅไธ‹ๅ‡ ็ง่งฆๅ‘ๆ–นๅผ๏ผš

  • cron

    ็ฑปไผผ Fission timer trigger๏ผŒๅœจ k8s ไฝ“็ณปไธ‹้€š่ฟ‡ cronjob ๅฎž็Žฐ๏ผŒๅœจๅ…ถๅฎƒๅนณๅฐๆไพ›ไบ† cron connector

  • http/webhooks

    ็ผบ็œๆ”ฏๆŒ๏ผŒ้€š่ฟ‡ไปฅไธ‹ๅœฐๅ€่งฆๅ‘

      https://<gateway URL>:<port>/function/<function name>
  • async/nats streaming

    ็ผบ็œๆ”ฏๆŒ๏ผŒ้€š่ฟ‡ไปฅไธ‹ๅœฐๅ€่งฆๅ‘

      https://<gateway URL>:<port>/async-function/<function name>
  • ่‡ชๅฎšไน‰ trigger

    ๆ”ฏๆŒ่‡ชๅฎšไน‰ connector๏ผŒ็›‘ๆŽง่‡ชๅทฑๅ…ณๅฟƒ็š„ไบ‹ไปถๆบ๏ผŒ้€š่ฟ‡่ฐƒ็”จ gateway ๆฅ่งฆๅ‘ๅ‡ฝๆ•ฐใ€‚OpenFaas ไนŸ็ดฏ็งฏไบ†ไธ€ไบ›ๅผ€ๅ‘ๅฅฝ็š„ connector๏ผŒๅŒ…ๆ‹ฌๅฏนๆŽฅ AWS ็ญ‰ๅ•†ไธšไบงๅ“ใ€redis ็ญ‰ๅผ€ๆบไบงๅ“็š„ๅฎž็Žฐ

Last updated

Was this helpful?