diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b5f57fa..80a4a81 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,6 +22,24 @@ jobs: file: score-k8s version: latest token: ${{ secrets.GITHUB_TOKEN }} + - name: set up docker-model-plugin (for llm-model) + run: | + # Add Docker's official GPG key: + sudo apt-get update + sudo apt-get install ca-certificates curl + sudo install -m 0755 -d /etc/apt/keyrings + sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc + sudo chmod a+r /etc/apt/keyrings/docker.asc + + # Add the repository to Apt sources: + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + + # Update and Install + sudo apt-get update + sudo apt-get install -y docker-model-plugin - name: setup-kind-cluster run: | .scripts/setup-kind-cluster.sh diff --git a/samples/aks-store-demo/Makefile b/samples/aks-store-demo/Makefile index b1ac538..a81bf6b 100644 --- a/samples/aks-store-demo/Makefile +++ b/samples/aks-store-demo/Makefile @@ -14,12 +14,14 @@ help: .score-compose/state.yaml: score-compose init \ --no-sample \ - --provisioners https://raw.githubusercontent.com/score-spec/community-provisioners/refs/heads/main/service/score-compose/10-service.provisioners.yaml + --provisioners https://raw.githubusercontent.com/score-spec/community-provisioners/refs/heads/main/service/score-compose/10-service.provisioners.yaml \ + --provisioners https://raw.githubusercontent.com/score-spec/community-provisioners/refs/heads/main/llm-model/score-compose/10-dmr-llm-model.provisioners.yaml -compose.yaml: order/score.yaml product/score.yaml store-front/score.yaml store-admin/score.yaml makeline/score.yaml .score-compose/state.yaml Makefile +compose.yaml: order/score.yaml product/score-ai.yaml store-front/score.yaml store-admin/score.yaml makeline/score.yaml .score-compose/state.yaml Makefile score-compose generate \ order/score.yaml \ - product/score.yaml \ + ai/score.yaml \ + product/score-ai.yaml \ store-front/score.yaml \ store-admin/score.yaml \ makeline/score.yaml @@ -34,6 +36,7 @@ compose-up: compose.yaml .PHONY: compose-test compose-test: compose-up curl $$(score-compose resources get-outputs 'dns.default#store-front.dns' --format '{{ .host }}:8080') + curl $$(score-compose resources get-outputs 'dns.default#store-admin.dns' --format '{{ .host }}:8080') ## Delete the containers running via compose down. .PHONY: compose-down @@ -65,6 +68,15 @@ k8s-up: manifests.yaml kubectl apply \ -f manifests.yaml \ -n ${NAMESPACE} + kubectl wait deployments/store-admin \ + -n ${NAMESPACE} \ + --for condition=Available \ + --timeout=90s + kubectl wait pods \ + -n ${NAMESPACE} \ + -l app.kubernetes.io/name=store-admin \ + --for condition=Ready \ + --timeout=90s kubectl wait deployments/store-front \ -n ${NAMESPACE} \ --for condition=Available \ @@ -81,6 +93,7 @@ k8s-up: manifests.yaml .PHONY: k8s-test k8s-test: k8s-up curl $$(score-k8s resources get-outputs dns.default#store-front.dns --format '{{ .host }}') + curl $$(score-k8s resources get-outputs dns.default#store-admin.dns --format '{{ .host }}') ## Delete the deployment of the local container in Kubernetes. .PHONY: k8s-down diff --git a/samples/aks-store-demo/ai/score.yaml b/samples/aks-store-demo/ai/score.yaml new file mode 100644 index 0000000..1c2c958 --- /dev/null +++ b/samples/aks-store-demo/ai/score.yaml @@ -0,0 +1,36 @@ +apiVersion: score.dev/v1b1 +metadata: + name: ai-service + annotations: + tags: "python,backend,ai,llm-model" +containers: + ai-service: + image: ghcr.io/azure-samples/aks-store-demo/ai-service:2.1.0 + variables: + USE_LOCAL_LLM: "true" + LOCAL_LLM_ENDPOINT: "${resources.llm-model.url}" + livenessProbe: + httpGet: + path: /health + port: 5001 + readinessProbe: + httpGet: + path: /health + port: 5001 + resources: + limits: + memory: "128Mi" + cpu: "50m" + requests: + memory: "50Mi" + cpu: "20m" +service: + ports: + http: + port: 5001 + targetPort: 5001 +resources: + llm-model: + type: llm-model + params: + model: ai/smollm2:135M-Q2_K #ai/gpt-oss:latest diff --git a/samples/aks-store-demo/product/score-ai.yaml b/samples/aks-store-demo/product/score-ai.yaml new file mode 100644 index 0000000..9e57bd3 --- /dev/null +++ b/samples/aks-store-demo/product/score-ai.yaml @@ -0,0 +1,33 @@ +apiVersion: score.dev/v1b1 +metadata: + name: product-service + annotations: + tags: "rust,backend" +containers: + product-service: + image: ghcr.io/azure-samples/aks-store-demo/product-service:2.1.0 + variables: + AI_SERVICE_URL: "http://${resources.ai-service.name}:5001" + livenessProbe: + httpGet: + path: /health + port: 3002 + readinessProbe: + httpGet: + path: /health + port: 3002 + resources: + limits: + memory: "10Mi" + cpu: "2m" + requests: + memory: "1Mi" + cpu: "1m" +service: + ports: + http: + port: 3002 + targetPort: 3002 +resources: + ai-service: + type: service \ No newline at end of file diff --git a/samples/aks-store-demo/score-compose.md b/samples/aks-store-demo/score-compose.md index 8c01980..0b01cdd 100644 --- a/samples/aks-store-demo/score-compose.md +++ b/samples/aks-store-demo/score-compose.md @@ -1,12 +1,14 @@ ```bash score-compose init --no-sample \ - --provisioners https://raw.githubusercontent.com/score-spec/community-provisioners/refs/heads/main/service/score-compose/10-service.provisioners.yaml + --provisioners https://raw.githubusercontent.com/score-spec/community-provisioners/refs/heads/main/service/score-compose/10-service.provisioners.yaml \ + --provisioners https://raw.githubusercontent.com/score-spec/community-provisioners/refs/heads/main/llm-model/score-compose/10-dmr-llm-model.provisioners.yaml ``` ```bash score-compose generate \ order/score.yaml \ - product/score.yaml \ + ai/score.yaml \ + product-ai/score.yaml \ store-front/score.yaml \ store-admin/score.yaml \ makeline/score.yaml @@ -18,4 +20,5 @@ docker compose up --build -d --remove-orphans ```bash curl $(score-compose resources get-outputs dns.default#store-front.dns --format '{{ .host }}:8080') +curl $(score-compose resources get-outputs dns.default#store-admin.dns --format '{{ .host }}:8080') ``` \ No newline at end of file diff --git a/samples/aks-store-demo/score-k8s.md b/samples/aks-store-demo/score-k8s.md index a38983b..1435d91 100644 --- a/samples/aks-store-demo/score-k8s.md +++ b/samples/aks-store-demo/score-k8s.md @@ -18,4 +18,5 @@ kubectl apply -f manifests.yaml ```bash curl $(score-k8s resources get-outputs dns.default#store-front.dns --format '{{ .host }}:80') +curl $(score-k8s resources get-outputs dns.default#store-admin.dns --format '{{ .host }}:80') ``` \ No newline at end of file