케이마의 니제리트 내구성

소개와 목표


이 블로그에서, 나는 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 함수가 있습니다.그런 다음 이 함수는 여러 매개변수 값을 사용하여 활성 함수를 세 번 호출합니다.
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
Activity 함수는 함수에 이관된 매개변수를 포함하는 문자열을 반환합니다.
import { AzureFunction, Context } from "@azure/functions"

const activityFunction: AzureFunction = async function (context: Context): Promise<string> {
    return `Hello ${context.bindings.name}!`
}

export default activityFunction
이 설정은 일반 Azure 저장소에서 실행됩니다.이제 니제까지 데리고 가자.

네덜란드로 넘어가다


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 first yield (see https://github.com/microsoft/durabletask-netherite/issues/69)


이것은 일을 순조롭게 진행할 수 있도록 매우 간소화된 설정이지만, 니제리트의 문서에는 더 많은 미세한 조정이 열거되어 있다.

현지에서 시도하다


첫 번째 테스트로, 우리는 로컬에서 이 함수를 실행하기 때문에, 로컬 저장 시뮬레이터를 가리키도록 local.settings.json를 조정해야 한다.또한 ("클래식"지속 함수와 달리) 로컬 실행의 경우 메모리를 가리키는 EventHub에 대한 연결을 지정해야 합니다.
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "EventHubsConnection": "MemoryF",
    "FUNCTIONS_WORKER_RUNTIME": "node"
  }
}
저장 시뮬레이터로서 우리는 푸른동광, 즉 Azurite VSCode extension을 사용한다.
함수를 실행하면 출력이 예상됩니다.

Docker 이미지를 구축하고 실행합니다.


로컬 설정이 실행됨에 따라 Azure 함수로 Docker 이미지를 구축할 때가 되었습니다.func CLI 는 다음과 같은 방법으로 지원합니다.
func init --docker-only
이 명령은 Dockerfile.dockerignore 파일을 생성합니다.
Azurite VScode 확장자를 사용할 때 여러 파일을 생성합니다.Docker 이미지로 복사되는 것을 방지하기 위해 파일.dockerignore에 다음 줄을 넣습니다.
__azurite_db*__.json
__blobstorage__
__queuestorage__
이것들이 있으면 우리는 너의 이미지를 형상화할 수 있다.Dell은 Makefile을 사용하여 다음과 같이 구축 및 푸시합니다.
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)
컨테이너가 예상대로 실행되는지 확인하기 위해서, 우리는 Netherite 저장소 ((https://github.com/microsoft/durabletask-netherite/tree/main/samples/scripts 예시에서 제공한 스크립트 (즉 init.ps1 를 사용하여 Azure에 필요한 자원을 만들어서 Azure 저장소와 이벤트 센터를 만듭니다.그것들을 실행하기 전에 필요에 따라 settings.ps1 파일을 조정하고 특히 자원에 적합한 이름을 입력하십시오.
자원을 성공적으로 만든 후, 우리는 이 두 자원을 위해 사용 가능한 연결 문자열 (예:Azure 포털) 을 가져와 env.list 파일에 넣었습니다.이것은 용기에 주사하는 것을 더욱 쉽게 한다.
우리는 부두 부근의 모든 물건을 한 곳에 두기 위해 돌격대도 Makefile에서 컨테이너를 가동시켰다.
docker run --env-file env.list -it -p 8080:80 $(CONTAINER_IMAGE) 
컨테이너를 회전하면 다음과 같은 오류가 발생합니다.
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: 
 ---> System.InvalidOperationException: Webhooks are not   
   at Microsoft.Azure.WebJobs.Extensions.DurableTask.HttpApiHandler.ThrowIfWebhooksNotConfigured()
음.. 엄숙한 고급 개발자 연구를 통해 이 문제를 해결하자.🤪 구글fu라고도 부른다. 창고가 넘쳐흐르는 것을 검색할 때 다음과 같은 내용을 만났다. https://stackoverflow.com/questions/64400695/azure-durable-function-httpstart-failure-webhooks-are-not-configured/64404153#64404153
그래서 우리는 일을 계속 진행하기 위해 WEBSITE_HOSTNAME 용기에 주입하는 매개 변수가 필요하다.매개변수는 Azure 함수에 사용되는 HTTP 호스트 이름을 가리켜야 합니다.
Docker를 통한 로컬 실행의 경우 env.list에 다음 행이 추가됩니다.
WEBSITE_HOSTNAME=localhost:8080
이 조정을 통해 Docker 컨테이너는 원하는 대로 작동할 수 있습니다.현재, 우리는 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 집단에 통합하는 것이지 외부 세계에 대한 호출을 통해서만 이루어지는 것이 아니다.그럼, 더 많은 블로그 게시물의 내용--그때 봐요.🤠

    좋은 웹페이지 즐겨찾기