ãã®è¨äºã¯ãMicrosoft Azure Tech Advent Calendar 2020 ã® 17 æ¥ç®ã®è¨äºã§ãã
KEDA ã使ã£ã¦ãAzure Functions ãåããã¦ã¿ã¾ããã
KEDA
KEDA (Kubernetes Event-Driven Autoscaling) ã¯ãKubernetes ããã¼ã¹ã«ãå¦çãã¹ãã¤ãã³ãéã«å¿ãã¦èªåã§ã¹ã±ã¼ãªã³ã°ãã¦ãããä»çµã¿ã§ã (ã»ã¼ååãç´è¨³) ã
ååã®éããKubernetes ãå¿
è¦ãªããã§ãã
Kubernetes ã«ããã³ã³ããã¼ ãªã¼ã±ã¹ãã¬ã¼ã·ã§ã³ããã¤ãã³ã ãã¼ã¹ã«ãã£ã¦ããããã¨ããã®ãéãªç解ã
Kubernetes èªä½ãååãããããç¥ããªããã§ããã
Azure Functions
ãåããAzure ãæä¾ãã FaaS (Functions as a Service)ã§ãã
ä½æããé¢æ°ããHTTP ã Azure ã®åãµã¼ãã¹ããã®éç¥ãããªã¬ã¼ããå®è¡ã§ããåºåçµæã«ã¤ãã¦ãã»ãã®ãµã¼ãã¹ã¨é£æºãå¯è½ãªã®ã§ã使ãåæã®è¯ããµã¼ãã¹ã§ãã
Azure Functions ã¯ãé¢æ°ãå®è¡ããã©ã³ã¿ã¤ã é¨åã¨ãã¹ã±ã¼ãªã³ã°ãå¶å¾¡ããé¨åã§æ§æããã Azure ä¸ã®ãµã¼ãã¹ã§ããã®ãã¡å¾è
ã®ã¹ã±ã¼ãªã³ã°å¶å¾¡ã¯ KEDA/Kubernetes ã«ç½®ãæãããã¨ãã§ãã¾ãã
KEDA/Kubernetes ä¸ã§åä½ããããã¨ãã§ããã®ã§ããªã³ãã¬ãã¹ç°å¢ã®ãã㪠Azure ãã©ãããã©ã¼ã ã®å¤ã§ Azure(?) Functions ãå©ç¨ã§ãã¾ãã
ã¡ãªã¿ã«ã©ã³ã¿ã¤ã é¨åã¯ãªã¼ãã³ã½ã¼ã¹ã¨ã㦠GitHub ã§å ¬é ããã¦ãããissue ã Pull Request ãéãã¦éçºè ã¨ç´æ¥ã³ã³ã¿ã¯ããåããã¨ãå¯è½ã§ãã®ã§ãèå³ãããæ¹ã¯ã©ããã
ãã£ã¦ã¿ã
å®éã«åããã¦ã¿ã¾ãã
åæºå
ä»¥ä¸ 3 ã¤ã®ã³ãã³ã ãã¼ã«ããã¼ã«ã«ç°å¢ã«ã¤ã³ã¹ãã¼ã«ãã¦ããã¾ãã
- Azure Functions Core Tools
Azure Functions ãéçº/ãããã¤ããããã®ã³ãã³ãfunc
ãã¤ã³ã¹ãã¼ã«ããã¾ãã
https://github.com/Azure/azure-functions-core-tools#installing
ä»ããå ¥ãã人㯠v3 ãå ¥ããã¨ããã§ãããã - kubectl
Kubernetes ãæä½ããã³ãã³ã ãã¼ã« (ã ã¨ããç解)
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/ - Docker
KEDA ã¸ã®ãããã¤æã« Docker ã³ã³ããã¼ ã¤ã¡ã¼ã¸ã®ãã«ãã¨çºè¡ãããã®ã§å¿ è¦ã§ãã
æ§ç¯æ¬çª
Kubernetes ãåããªã³ãã¬ç°å¢ãæºåã§ããªãã£ãã®ã§ãä»å㯠Azure ã® Kubernetes ãµã¼ãã¹ãAKS ã使ã£ã¦è©¦ãã¦ã¿ã¾ãã
# çµå± Azure ä¸ãªã®ã§ãã¾ã KEDA ã使ãã¡ãªããã¯ããããªãã§ãããããã¾ã§ã試ããã§ãã
1. AKS ãªã½ã¼ã¹ããããã¤
ãã¼ã¿ã«ããããããããããããã¤ã§ããã®ã§ãé£ãããã¨ã¯ãªãã§ãã
2. kubectl ã®è¨å®
AKS ä¸ã® Kubernetes ã®èªè¨¼æ
å ±ããã¼ã«ã«ã® kubectl ã®è¨å®ãã¡ã¤ã« ($HOME/.kube/config
) ã«ä¿åãã¾ãã
az aks get-credentials --resource-group $RG_NAME --name $AKS_NAME
ãã®ã³ãã³ããå®è¡ããã¨ãkubectl ãã AKS ä¸ã® Kubernetes ã®æä½ãå¯è½ã«ãªãã¾ãã
â»ä»¥éã®æé ã§ã¯ãä¸å kubectl
ãå®è¡ãã¦ãã¾ããããfunc
ãå
é¨çã«ä½¿ç¨ãã¦ãã¾ãã
Azure ãã¼ã¿ã«ãããã³ãã³ãã®ç¢ºèªãå¯è½ã§ãã
3. KEDA ã³ã³ãã¼ãã³ãã®ã¤ã³ã¹ãã¼ã«
AKS ä¸ã® Kubernetes ã«åå空éãä½æãã¤ã¤ãKEDA ã³ã³ãã¼ãã³ããã¤ã³ã¹ãã¼ã«ãã¾ãã
func kubernetes install --namespace $CLUSTER_NAMESPACE
4. ãããã¤ããé¢æ°ã®æºå
ãã¼ã«ã«ã®éçºç°å¢ã« Function App ç¨ã®ããã¸ã§ã¯ããä½ãã次㫠Queue ããªã¬ã¼é¢æ°ãä½ãã¾ãã é¢æ°ã®å®è£ è¨èªã¯ã好ã¿ã®ãã®ãã
func init --docker --javascript func new --javascript --template "Azure Queue Storage trigger" --name queuetrigger1
æçµçã« Docker ã³ã³ããã¼ã¨ãã¦ãããã¤ããã®ã§ãDockerfile ãçæãã --docker
ãã¤ãã¦ãã¾ãã
æ¢ã«å®è£
ä¸ã®ããã¸ã§ã¯ããããå ´åã¯ãä¸è¨ã³ãã³ã㧠Dockerfile ãçæããã¨ããã§ãããã
func init --docker-only
AKS ä¸ã§èµ·åã確èªã§ããã°ããã ããªã®ã§ãä½æããé¢æ°ã¯ã»ã¼ãã³ãã¬ã®ã¾ã¾ãã¡ãã»ã¼ã¸ãåä¿¡ãã¦ãã 5 ç§ã¹ãªã¼ãããã ãã§ãã
const sleep = (time) => { return new Promise((res) => { setTimeout(() => { res(); }, time); }) } module.exports = async function (context, myQueueItem) { await sleep(5000); context.log('JavaScript queue trigger function processed work item', myQueueItem); };
ãã®ä»ãfunction.json ã Dockerfile ã¯ãã¡ãã
{ "bindings": [ { "name": "myQueueItem", "type": "queueTrigger", "direction": "in", "queueName": "ï¼QUEUE_NAMEï¼", "connection": "ï¼APPSETTING_NAME_FOR_QUEUE_STORAGEï¼" } ] }
# To enable ssh & remote debugging on app service change the base image to the one below # FROM mcr.microsoft.com/azure-functions/node:3.0-appservice FROM mcr.microsoft.com/azure-functions/node:3.0 ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ AzureFunctionsJobHost__Logging__Console__IsEnabled=true COPY . /home/site/wwwroot RUN cd /home/site/wwwroot && \ npm install
5. é¢æ°ã®ãããã¤
AKS ã® KEDA ä¸ã«é¢æ°ããããã¤ãã¾ãã
ãã®åã«ãlocal.settings.json ã§å®ç¾©ãã¦ããå¤ããããã¤ç°å¢ç¨ã®ãã®ã«å¤æ´ãã¦ããã¾ãã
ãããã¤ã®æç¹ã§ Function App ã®ã¢ããªã±ã¼ã·ã§ã³è¨å®ã«ç¸å½ããæ
å ±ã¯ãlocal.settings.json ããã¤ã³ãã¼ããããKEDA ã® Secret ã¨ãã¦ä¿åããã¾ãã®ã§ãä¾ãã°ããã¼ã«ã«ã§ã®éçºã« Storage Emulator ã使ã£ã¦ UseDevelopmentStorage=true
ãªã©ãè¨å®ãã¦ããå ´åã¯ããããã¤åã«æ£ããã¹ãã¬ã¼ã¸ ã¢ã«ã¦ã³ãã¸ã®æ¥ç¶æååã¸å¤æ´ãã¦ããã¾ãã
ãããã¤èªä½ã®ã³ãã³ãã¯ããã ãã§ãã
func kubernetes deploy --name $NAME_IMAGE --registry $USERNAME_REGISTRY --namespace $CLUSTER_NAMESPACE
ãã®ã³ãã³ããå®è¡ããã¨ã
-
docker build
ã§ã³ã³ããã¼ ã¤ã¡ã¼ã¸ãä½æ -
docker push
㧠Registry ã«ç»é² -
$HOME/.kube/config
ã®èªè¨¼æ å ±ã«åºã¥ãã¦ãKubernetes ã«åæ
ãä¸æ°ã«å®è¡ããããããã¤å®äºã§ãã
åä½ç¢ºèª
å®éã«é¢æ°ãåãããæã«ãKEDA ã§ã¹ã±ã¼ã«ããã®ãã確èªãã¦ã¿ã¾ããã
KEDA ã«ä¹ããé¢æ°ã¯ Queue ããªã¬ã¼ã§å®è¡ãããã®ã§ããã¥ã¼ã«ã¡ãã»ã¼ã¸ã追å ãã HTTP ããªã¬ã¼é¢æ°ããã¼ã«ã«ã§ã0.1 æ¯ã«å®è¡ãã¦ã¿ã¾ããã
ãã®æ§åããã¡ãã§ãã
æåã®ããããèµ·åããã¾ã§ãããããã¾ããããã®å¾ã¯ãã¾ã£ããã¥ã¼ ã¡ãã»ã¼ã¸ãå¦çããããã«ã©ãã©ããããã追å ãããã¹ã±ã¼ã« ã¢ã¦ããã¦ããæ§åããããã¾ãã
ã»ãã£ã¦ããã°ã 0 ã¾ã§ã¹ã±ã¼ã« ã¤ã³ãã¾ãã
ã¾ã¨ã
Azure Functions ç¨ã®é¢æ°ã (AKS ä¸ã§ãã£ããã®ã®) KEAD ä¸ã§åä½ãããã¡ãã»ã¼ã¸éã«å¿ãã¦ããããã¹ã±ã¼ãªã³ã°ãããããã¨ã確èªã§ãã¾ããã
ä»åãQueue ããªã¬ã¼ã使ãã¾ããããKEDA ã§ã¯ä»¥ä¸ã®ããªã¬ã¼ããµãã¼ãããã¦ãã¾ãã
- Azure Service Bus ãã¥ã¼
- Azure Event/IoT Hubs
- Apache Kafka
- RabbitMQ ãã¥ã¼
HTTP ã§ã®ã¹ã±ã¼ãªã³ã°ã¯ãµãã¼ãããã¦ããªãããã§ãå¥é Prometheus ã¨ãããã®ãå¿ è¦ã§ãã dev.to
æå¾ã«å ¬å¼ããã¥ã¡ã³ãããç´¹ä»ã docs.microsoft.com