スクエニ ITエンジニア ブログ

Kubernetes で Windows container を使う

こんにちは、ホシイです。
みなさんは、どのように Kubernetes を活用されていますか。

そもそも Windows container とは

以前に、Docker でやってみる Windows container という記事を書きましたが、ここにいらしたあなたはもしかして、ご覧いただけたりしていますでしょうか。

ふだん Docker を使って container を利用しているというと、たいていは Linux application の利用ではないでしょうか。実は Windows container も同様に Docker (for Windows) で利用ができます。というのが前回の記事の内容でした。

今回は、Kubernetes から Windows container を利用してみましょう。

何のために?

応用・用途としては Windows でしか提供されていないソフトウェアを使用して CI job・batch 処理のようなものを実行したい、Windows application の build がしたいなどが考えられます。

具体的には Visual Studio であるとか、… いろいろありそうですね。

やってみよう

GKE + Terraform でやってみます。
cluster の部分は特別なことはないので node pool の部分のみ抜粋します。ひとつの cluster に、Linux と Windows の node pool を混在させることができます。
設定内容は一通り確認して、service account などの部分は用途・必要に応じて調整してください。

locals {
  gke_node_pool = {
    "np2-win" = {
      cluster         = "<project_id>-devenv"
      node_count      = 0
      preemptible     = true
      machine_type    = "n1-standard-2"
      image_type      = "WINDOWS_LTSC_CONTAINERD"
      disk_size_gb    = 40
      service_account = "devenv-node@<project_id>.iam.gserviceaccount.com"
    }
  }
}

resource "google_container_node_pool" "main" {
  for_each = var.gke_node_pool
  name       = each.key
  location   = var.common.zone
  cluster    = google_container_cluster.main[each.value.cluster].id
  node_count = each.value.node_count
  node_config {
    preemptible = each.value.preemptible
    machine_type = each.value.machine_type
    image_type = each.value.image_type
    disk_size_gb = each.value.disk_size_gb
    service_account = each.value.service_account
    oauth_scopes    = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
}

費用を抑えるために、preemptible を選択し、かつ disk size を default より縮小、さらに初期 node 数を 0 にしています。Windows VM は追加で license 費用がかかるので、適切に稼働数を管理するとよいでしょう。

gcloud cli でも、以下のように同様の Windows node pool の追加が可能です。

❯ gcloud container node-pools create np2-win \
  --zone ${CLSTR_ZONE} --cluster ${CLSTR_NAME} \
  --machine-type=n1-standard-2 --num-nodes=0 --preemptible \
  --image-type=WINDOWS_LTSC_CONTAINERD --node-labels=node_os=windows \
  --disk-size=40GB

ひとつの cluster に Linux node pool と混在しているとき、意図せず Linux 用の Pod が Windows node に行ってしまうのでは…? と思い、最初はじぶんで taint を付けていたのですが、何も考えずに Windows node pool をつくると以下のような taint が自動でつくようになっているようです。気が効いていますね。

Taints:             node.kubernetes.io/os=windows:NoSchedule

では、試しに container を実行してみましょう。
まずは VM をひとつ起動します。

❯ gcloud container clusters resize ${CLSTR_NAME} --zone ${CLSTR_ZONE} \
  --node-pool np2-win --num-nodes 1

以下は先に Linux の node も存在していた場合の例ですが、このように混在して node が生成されます。

❯ kubectl get nodes -o wide
NAME                                STATUS   ROLES    AGE     VERSION           INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                             KERNEL-VERSION    CONTAINER-RUNTIME
gke-test-devenv-np1-c55e76e2-cdqf   Ready    <none>   11h     v1.25.8-gke.500   10.4.0.32     <none>        Container-Optimized OS from Google   5.15.89+          containerd://1.6.18
gke-test-devenv-np1-c55e76e2-r8vg   Ready    <none>   18h     v1.25.8-gke.500   10.4.0.31     <none>        Container-Optimized OS from Google   5.15.89+          containerd://1.6.18
gke-e5ea7a-cgz2                     Ready    <none>   2m18s   v1.25.8-gke.500   10.4.0.33     <none>        Windows Server 2019 Datacenter       10.0.17763.4010   containerd://1.6.19-gke.1

job を実行してみます。
以下 yaml を見ていただくとわかりますが、Windows node を選択して schedule されるように tolerationsnodeSelector を指定しています。

apiVersion: batch/v1
kind: Job
metadata:
  name: example-windows
spec:
  template:
    spec:
      containers:
      - name: example-windows
        image: mcr.microsoft.com/windows/nanoserver:ltsc2019
        command: ["cmd.exe" ]
        args: [ "/s", "/c", "echo", "Hello, world!" ]
      restartPolicy: Never
      nodeSelector:
        node_os: "windows"
      tolerations:
      - key: "node.kubernetes.io/os"
        operator: "Equal"
        value: "windows"
        effect: "NoSchedule"

apply します。

❯ kubectl apply -f example-job-windows.yaml
job.batch/example-windows created

❯ kubectl get po -n default -w
NAME                                            READY   STATUS              RESTARTS   AGE
example-windows-l9krj                           0/1     ContainerCreating   0          9s
  ...
example-windows-l9krj                           1/1     Running             0          32s
example-windows-l9krj                           0/1     Completed           0          34s
  ...

❯ kubectl logs example-windows-l9krj -n default
"Hello, world!"

うまくいったようです。

先にも書きましたが、Windows node は他の node type の費用に加えて、OS 使用の費用もかかります (0.04USD/h)。利用が終わったら停止しておきましょう。

❯ gcloud container clusters resize ${CLSTR_NAME} --zone ${CLSTR_ZONE} \
  --node-pool np2-win --num-nodes 0

公開されている Windows container の image は こちら などを参照してください。用途によって、より新しいものを試してもよさそうです。

まとめ

GKE の Kubernetes で Windows node を利用し、Windows container の実行を試してみました。
Windows 系の CI job など、これが便利に使えるといくらか用途が思い浮かんだりするのではないでしょうか。
Windows application の開発や運用では、Jenkins + 物理 PC でなんとかすることも多いですが、Kubernetes が利用できるとそれが持つ強力な scheduling などのメリットが享受できます。マシンの数が増えても管理工数増加の抑制も期待できるので、積極的に活用していきたいと思います。

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!