케이마의 니제리트 내구성
소개와 목표
이 블로그에서, 나는 Azure 영구 기능 저장소 공급자로서 Netherite와 합작한 과정과 이런 조합이 Kubernetes 집단에 배치된 과정을 묘사하고 싶다.나의 주요 목표는 일을 움직여서 어디에 거친 가장자리가 있는지 보는 것이다.따라서 이 블로그는 효율적인 설정의 지침이 될 수 없고 이런 설정을 향한 첫걸음과도 같다.
Remark: If you have not yet heard about Netherite as a storage provider for Azure Durable Functions I recommend to start here 🧐: https://microsoft.github.io/durabletask-netherite/#/
예제 코드
이 블로그 게시물에 사용된 모든 코드는 GitHub의 다음 위치에서 사용할 수 있습니다.
https://github.com/lechnerc77/netherite-kyma-sample설치 프로그램
여정의 설정은 매우 기본적이다.우리는 Azure Functions Extension of VS Code에 첨부된 지속 함수 예시를 사용한다.우리는 타자 스크립트를 언어로 사용할 것이다.너도 C#/를 사용할 수 있을 거야.NET Core 3.1, 하지만 제가 사용하는 언어는 다르다. 왜냐하면 떠날 때 깜짝 놀랄 때가 많기 때문이다.순수 면적.
코드의 경우 Orchestrator 함수를 트리거하는 HTTP Starter 함수가 있습니다.그런 다음 이 함수는 여러 매개변수 값을 사용하여 활성 함수를 세 번 호출합니다.Activity 함수는 함수에 이관된 매개변수를 포함하는 문자열을 반환합니다.import * as df from "durable-functions" const orchestrator = df.orchestrator(function* (context) { const outputs = [] outputs.push(yield context.df.callActivity("HelloCity", "Tokyo")) outputs.push(yield context.df.callActivity("HelloCity", "Seattle")) outputs.push(yield context.df.callActivity("HelloCity", "London")) return outputs }) export default orchestrator
이 설정은 일반 Azure 저장소에서 실행됩니다.이제 니제까지 데리고 가자.import { AzureFunction, Context } from "@azure/functions" const activityFunction: AzureFunction = async function (context: Context): Promise<string> { return `Hello ${context.bindings.name}!` } export default activityFunction
네덜란드로 넘어가다
Netherite가 아직 확장 패키지 메커니즘을 통해 지원되지 않았기 때문에host.json
에서 확장 패키지 부분을 삭제하고 다음과 같은 방법으로 Netherite의 확장을 추가합니다.이것은 관련 의존항을 포함하는func extensions install --package Microsoft.Azure.DurableTask.Netherite --version 0.5.0-alpha`
extensions.csproj
파일을 제공할 것입니다.
또한host.json
파일에 새 스토리지 공급자를 호스트에 알리는 구성을 추가했습니다."extensions": { "durableTask": { "hubName": "HelloNetherite", "useGracefulShutdown": true, "storageProvider": { "type": "Netherite", "StorageConnectionName": "AzureWebJobsStorage", "EventHubsConnectionName": "EventHubsConnection", "CacheOrchestrationCursors": "false" } } }
⚠ Be aware of the parameter
"CacheOrchestrationCursors": "false"
: this setting is necessary for the non-.NET world to keep the orchestration running. Otherwise your processing will abort after the firstyield
(see https://github.com/microsoft/durabletask-netherite/issues/69)
이것은 일을 순조롭게 진행할 수 있도록 매우 간소화된 설정이지만, 니제리트의 문서에는 더 많은 미세한 조정이 열거되어 있다.현지에서 시도하다
첫 번째 테스트로, 우리는 로컬에서 이 함수를 실행하기 때문에, 로컬 저장 시뮬레이터를 가리키도록local.settings.json
를 조정해야 한다.또한 ("클래식"지속 함수와 달리) 로컬 실행의 경우 메모리를 가리키는 EventHub에 대한 연결을 지정해야 합니다.저장 시뮬레이터로서 우리는 푸른동광, 즉 Azurite VSCode extension을 사용한다.{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "EventHubsConnection": "MemoryF", "FUNCTIONS_WORKER_RUNTIME": "node" } }
함수를 실행하면 출력이 예상됩니다.
Docker 이미지를 구축하고 실행합니다.
로컬 설정이 실행됨에 따라 Azure 함수로 Docker 이미지를 구축할 때가 되었습니다.func CLI 는 다음과 같은 방법으로 지원합니다.이 명령은func init --docker-only
Dockerfile
및.dockerignore
파일을 생성합니다.
Azurite VScode 확장자를 사용할 때 여러 파일을 생성합니다.Docker 이미지로 복사되는 것을 방지하기 위해 파일.dockerignore
에 다음 줄을 넣습니다.이것들이 있으면 우리는 너의 이미지를 형상화할 수 있다.Dell은__azurite_db*__.json __blobstorage__ __queuestorage__
Makefile
을 사용하여 다음과 같이 구축 및 푸시합니다.컨테이너가 예상대로 실행되는지 확인하기 위해서, 우리는 Netherite 저장소 ((https://github.com/microsoft/durabletask-netherite/tree/main/samples/scripts 예시에서 제공한 스크립트 (즉RELEASE=0.0.1 APP=containered_netherite DOCKER_ACCOUNT=<YOUR DOCKER ACCOUNT NAME> CONTAINER_IMAGE=${DOCKER_ACCOUNT}/${APP}:${RELEASE} .PHONY: build-image push-image build-image: docker build -t $(CONTAINER_IMAGE) --no-cache --rm . push-image: build-image docker push $(CONTAINER_IMAGE)
init.ps1
를 사용하여 Azure에 필요한 자원을 만들어서 Azure 저장소와 이벤트 센터를 만듭니다.그것들을 실행하기 전에 필요에 따라settings.ps1
파일을 조정하고 특히 자원에 적합한 이름을 입력하십시오.
자원을 성공적으로 만든 후, 우리는 이 두 자원을 위해 사용 가능한 연결 문자열 (예:Azure 포털) 을 가져와env.list
파일에 넣었습니다.이것은 용기에 주사하는 것을 더욱 쉽게 한다.
우리는 부두 부근의 모든 물건을 한 곳에 두기 위해 돌격대도Makefile
에서 컨테이너를 가동시켰다.컨테이너를 회전하면 다음과 같은 오류가 발생합니다.docker run --env-file env.list -it -p 8080:80 $(CONTAINER_IMAGE)
음.. 엄숙한 고급 개발자 연구를 통해 이 문제를 해결하자.🤪 구글fu라고도 부른다. 창고가 넘쳐흐르는 것을 검색할 때 다음과 같은 내용을 만났다. https://stackoverflow.com/questions/64400695/azure-durable-function-httpstart-failure-webhooks-are-not-configured/64404153#64404153Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: ---> System.InvalidOperationException: Webhooks are not at Microsoft.Azure.WebJobs.Extensions.DurableTask.HttpApiHandler.ThrowIfWebhooksNotConfigured()
그래서 우리는 일을 계속 진행하기 위해WEBSITE_HOSTNAME
용기에 주입하는 매개 변수가 필요하다.매개변수는 Azure 함수에 사용되는 HTTP 호스트 이름을 가리켜야 합니다.
Docker를 통한 로컬 실행의 경우env.list
에 다음 행이 추가됩니다.이 조정을 통해 Docker 컨테이너는 원하는 대로 작동할 수 있습니다.현재, 우리는WEBSITE_HOSTNAME=localhost:8080
Makefile
의 상응하는 명령을 통해 Docker 등록표로 전송합니다.
그 후에 논리의 다음 단계로 들어가서 이 물건을 쿠베르네트스에게 가져다 주자.쿠베르네트스에 배치.. 으, 키마
이 연습에서 나는 Kyma를 쿠버넷Gardener 위에 있는 독선적인 창고로 사용했다.바닐라 스택의 설정은 비슷해야 하지만 API 게이트웨이는 사용하는 내용에 따라 조정해야 합니다.Remark: In case you want to try out Kyma you can do so for free via the SAP Business Technology Platform trial.
Kyma에 배치하려면 다음 파일이 필요합니다.
deployment.yaml
: 응용 프로그램aka 용기와 설정 맵, 기밀 및 서비스에 대한 인용 포함를 포함하는 연결 문자열
secrets.yaml
: Azure 스토리지 및 이벤트 센터
apirule.yaml
: HTTP 엔드포인트를 공개하는 API 게이트웨이 구성이 포함됩니다.참고 - API 규칙에 인증이 없습니다!kubectl apply -f
를 통해 이 파일들을 Kyma 그룹에 적용한 후, 우리는 Kyma 계기판에서 API를 불러오는 단점을 찾아서configmap.yaml
에 추가해서WEBSITE_HOSTNAME
파라미터의 단점을 제공해야 한다.마지막 파일을 사용한 후 설치 프로그램을 시작하고 실행해야 합니다.Starter 함수를 실행하면 다음과 같은 출력이 표시됩니다.
상태 URI로 이동하면 예상 결과가 표시됩니다.
임무 완수🥳: Netherite를 저장소 공급자로 하는 지속적인 기능이 Kyma(Kubernetes)에서 시작되고 실행되었습니다!깨끗이 정리하다
Azure의 자원에 비용이 들기 때문에 GitHub 저장소의 스크립트delete.ps1
를 사용하여 이 자원을 정리할 수 있습니다. 이것은 Azure의 전체 자원 그룹을 삭제합니다.
서비스를 다시 시작해서secrets.yaml
파일의 연결 문자열을 교환하고 Kubernetes 배치에 다시 적용할 때 주의하십시오.요약
비록 니제제국은 여전히 알파에 있지만, 너는 그것으로 너의 손을 더럽힐 수 있다.이 블로그에서, 우리는 저장 제공 업체가 Kubernetes에 배치된 장면을 토론했다.두 개의 작은 장애를 제외하고, 우리는 설치 프로그램이 예상대로 실행되도록 극복해야 한다.
그러나 이것은 Netherite를 사용할 때의 첫 번째 단계일 뿐이며, 생산급 설정을 실현하려면 더 많은 절차가 필요하다.
미래의 주제는 당연히 더욱 자연스러운 방식으로Azure 서비스를 Kubernetes 집단에 통합하는 것이지 외부 세계에 대한 호출을 통해서만 이루어지는 것이 아니다.그럼, 더 많은 블로그 게시물의 내용--그때 봐요.🤠
Reference
이 문제에 관하여(케이마의 니제리트 내구성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lechnerc77/durable-functions-with-netherite-on-kyma-33dn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)