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 されるように tolerations
と nodeSelector
を指定しています。
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 などのメリットが享受できます。マシンの数が増えても管理工数増加の抑制も期待できるので、積極的に活用していきたいと思います。