🎼

JavaScript な Kubernetes Job を作成する (on AKS)

2022/07/03に公開

AKS 上で検証をする際、ちょっとした処理を行うコンテナを用意したかったので作ってみました。

処理内容としては、「JavaScript で Azure Queue にデータを登録するプログラムを、Kubernetes Job で複数個実行できるようにする」といった感じです。

その段取りについて、備忘録的に残しておこうと思います。

環境・準備

  • Azure Kubernetes Service (v1.22.6)
  • Windows 10
  • Visual Studio Code
  • WSL2 (Ubuntu)

Azure Storage (Queue) の作成

今回は Azure Queue Storage を利用するので、予め作成しておきます。接続文字列を取得しておきます。

やってみる

まず Node.js 公式で参考になるドキュメントはこちら。Web アプリケーションなので丸々コピペという訳にはいかないですが、参考としては十分かなと。

ジョブの実体の作成

Node.js から Azure Queue Storage に情報を登録するプログラムを用意します。コピペ中心でコードとしてくどかったり、接続文字列を直接記載している点など、ご容赦ください…

program.js
const { QueueClient, QueueServiceClient } = require("@azure/storage-queue");

const AZURE_STORAGE_CONNECTION_STRING = '<Connection String>'

// Retrieve the connection from an environment
// variable called AZURE_STORAGE_CONNECTION_STRING
const connectionString = AZURE_STORAGE_CONNECTION_STRING;

// Create a unique name for the queue
// const queueName = "myqueue-" + Date.now().toString();
const queueName = "test";

console.log("Creating queue: ", queueName);

// Instantiate a QueueServiceClient which will be used
// to create a QueueClient and to list all the queues
const queueServiceClient = QueueServiceClient.fromConnectionString(connectionString);

const createQueue = async () => {
    // Get a QueueClient which will be used
    // to create and manipulate a queue
    const queueClient = await queueServiceClient.getQueueClient(queueName);
    // Create the queue
    await queueClient.create();
}

createQueue();

// ----------

const sendToQueue = async () => {
    // Get a QueueClient which will be used
    // to create and manipulate a queue
    const queueClient = await queueServiceClient.getQueueClient(queueName);

    messageText = "Hello, World";
    console.log("Adding message to the queue: ", messageText);

    // Add a message to the queue
    await queueClient.sendMessage(messageText);
}

sendToQueue();
console.log("sendToQueue()");

// ----------

const getProp = async () => {
    // Get a QueueClient which will be used
    // to create and manipulate a queue
    const queueClient = await queueServiceClient.getQueueClient(queueName);

    const properties = await queueClient.getProperties();
    console.log("Approximate queue length: ", properties.approximateMessagesCount);
}

var check = getProp();
console.log(check instanceof Promise);  // True
console.log("getProp()");

Dockerfile, .dockerignore の準備

Dockerfile および .dockerignore ファイルを用意します。チュートリアルから、とりあえずこんな感じに。

Dockerfile
FROM node:17

# アプリケーションディレクトリを作成する
WORKDIR /usr/src/app

# アプリケーションの依存関係をインストールする
COPY package*.json ./
RUN npm install

# 本番用にコードを作成している場合
# RUN npm install --only=production

# アプリケーションのソースをバンドルする
COPY . .

# 実行させる
CMD [ "node", "program.js" ]

# ref: https://nodejs.org/ja/docs/guides/nodejs-docker-webapp/
.dockerignore
node_modules
npm-debug.log

Docker Image の作成と ACR へのプッシュ

今回、コンテナイメージのリポジトリには ACR (Azure Container Registry) を使いたいので、下記の過去記事も参考に ACR にプッシュします。

az login
az acr build --image example/js-queue:v1 \
  --registry <ContainerRegistryName> \
  --file Dockerfile .

AKS で動作するかテスト

AKS にて動かしてみます。

queuejob.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: queuejob
spec:
  completions: 5
  parallelism: 2
  template:
    spec:
      containers:
      - name: queuejob
        image: <ContainerRegistryName>.azurecr.io/example/js-queue:v1
      restartPolicy: Never
kubectl apply -f queuejob.yaml

おー、動きました。

> kubectl get pods -n test -w
NAME                READY   STATUS    RESTARTS   AGE
queuejob--1-bvwh5   0/1     Pending   0          0s
queuejob--1-bvwh5   0/1     Pending   0          0s
queuejob--1-mwhpp   0/1     Pending   0          0s
queuejob--1-mwhpp   0/1     Pending   0          0s
queuejob--1-bvwh5   0/1     ContainerCreating   0          0s
queuejob--1-mwhpp   0/1     ContainerCreating   0          0s
queuejob--1-bvwh5   1/1     Running             0          1s
queuejob--1-mwhpp   1/1     Running             0          2s
queuejob--1-mwhpp   0/1     Completed           0          2s
queuejob--1-bvwh5   0/1     Completed           0          3s
queuejob--1-27dfk   0/1     Pending             0          0s
queuejob--1-27dfk   0/1     Pending             0          0s
queuejob--1-27dfk   0/1     ContainerCreating   0          0s
queuejob--1-lwqnw   0/1     Pending             0          0s
queuejob--1-lwqnw   0/1     Pending             0          0s
queuejob--1-lwqnw   0/1     ContainerCreating   0          0s
queuejob--1-lwqnw   1/1     Running             0          1s
queuejob--1-lwqnw   0/1     Completed           0          2s
queuejob--1-cq6zz   0/1     Pending             0          0s
queuejob--1-27dfk   0/1     Completed           0          2s
queuejob--1-cq6zz   0/1     Pending             0          0s
queuejob--1-cq6zz   0/1     ContainerCreating   0          0s
queuejob--1-cq6zz   1/1     Running             0          1s
queuejob--1-cq6zz   0/1     Completed           0          2s

対象の Queue Storage にもデータ投入できていました。ちょっと判別しにくいですが、下から 5 つ分が今回の実行で投入されたものです。

まとめ

ということで、Node.js で書いて ACR にプッシュして AKS 上で Job として動作させるまで、でした。

Kubernetes の Job における実行オプションの詳細などについては、下記のドキュメント等を参考にしてくださいませ。

余談ですが、ホント WSL2 + VS Code 便利ですね!

Discussion