Google Cloud Platform

Windows コンテナを GKE にデプロイする方法

GCP_GKE.jpg

※この投稿は米国時間 2019 年 9 月 28 日に Google Cloud blog に投稿されたものの抄訳です。


Windows コンテナを実行する多くの人々は、レジリエンシー(回復力)とスケーラビリティの確保を目的に Kubernetes などのコンテナ管理プラットフォームを使いたいと思っています。前回の投稿では、Compute Engine 上の Windows Server 2019 にデプロイされた Windows コンテナで IIS サイトを実行する方法を説明しました。出発点としては上々ですが、Windows コンテナは Google Kubernetes Engine(GKE)上でも実行できます。


Kubernetes の Windows コンテナ サポートは、今年初めのバージョン 1.14 のリリースとともに発表され、続いて GKE の同バージョンでも発表されました。早期アクセス プログラムにサインアップすれば、GKE 上で Windows コンテナのテストを開始できます。


本稿では、Windows コンテナを GKE にデプロイする方法について説明します。

1. Container Registry にコンテナ イメージをプッシュ

前回の投稿ではコンテナ イメージをローカルに作成しました。最初に、そのイメージを Container Registry にプッシュし、あとで Kubernetes 上で使用できるようにします。


Windows VM から Container Registry にイメージをプッシュする手順は以下のとおりです。


  1. プロジェクト内で Container Registry API が有効になっていることを確認します。

  2. Container Registry を指すように Docker を設定します。こちらに詳しい説明がありますが、通常は gcloud auth configure-docker コマンドを実行します。

  3. こちらで説明されているように、ストレージへの読み書きアクセス スコープ(storage-rw)を VM に設定します。

セットアップが適切に行われていれば、あとは通常の Docker プッシュを実行するだけです。

  C:>docker push gcr.io/dotnet-atamel/iis-site-windows
The push refers to repository [gcr.io/dotnet-atamel/iis-site-windows]
4d8626c6a788: Pushed
8bd5cd9c33e0: Pushed
df246b0408a9: Pushed
fda45f6f282a: Pushed
f3f872f1087c: Pushed
7626b1fc1993: Pushed
fac2806747d6: Skipped foreign layer
c4d02418787d: Skipped foreign layer
latest: digest: sha256:2153656a3c4affefbe9973b79fe45cc35742c7495d6f4b1a689b5d9927dc92cb size: 2201

2. Windows ノードの Kubernetes クラスタを作成

次の 2 ステップにより、Windows ノードの Kubernetes クラスタを GKE 内に作成します。


  1. エイリアス IP を有効にし、1 つの Linux ノードを使用して、バージョン 1.14 以上で GKE クラスタを作成します。

  2. 作成した GKE クラスタに Windows ノード プールを追加します。

1 つの Linux ノードとエイリアス IP を有効にして GKE クラスタを作成するコマンドは以下のとおりです。

  > gcloud container clusters create windows-cluster --cluster-version=1.14 --enable-ip-alias --num-nodes=1

最小限の GKE クラスタを作成したら、Windows ノード用の Windows プールを追加できます。

  > gcloud container node-pools create windows-pool --cluster=windows-cluster --image-type=WINDOWS_SAC --no-enable-autoupgrade --machine-type=n1-standard-2

Windows コンテナはリソースを集中的に使用するため、マシン タイプとして n1-standard-2 を選択しています。また、ノードの自動アップグレードを無効にします。Windows コンテナのバージョンはノード OS のバージョンと互換でなければなりません。ワークロードの予期しない中断を避けるため、Windows ノード プールではノードの自動アップグレードを無効にすることをお勧めします。


GKE 上の Windows Server コンテナについては、基盤となる Windows ホスト VM のライセンスがすでに取得されており、コンテナのための追加ライセンスは不要です。


これで GKE クラスタが準備できました。1 個の Linux ノードと 3 個の Windows ノードが含まれています。

GKE_cluster.max-900x900.png

3. GKE 上のポッドとして Windows コンテナを実行

Windows コンテナを GKE 上のポッドとして実行する準備は整っています。次に、Kubernetes デプロイメントを記述する iis-site-windows.yaml ファイルを作成します。

  apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis-site-windows
  labels:
    app: iis-site-windows
spec:
  replicas: 2
  selector:
    matchLabels:
      app: iis-site-windows
  template:
    metadata:
      labels:
        app: iis-site-windows
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: iis-site-windows
        image: gcr.io/dotnet-atamel/iis-site-windows
        ports:
        - containerPort: 80

Container Registry にプッシュしたイメージを使用して 2 つのポッドを作っていることに注意してください。また、nodeSelector タグを使ってポッドが Windows ノードにスケジューリングされるようにしています。


デプロイメントを作成します。

  > kubectl apply -f iis-site-windows.yaml
deployment.apps/iis-site-windows created

数分後にはデプロイメントが作成され、実行中のポッドが表示されるようになります。

  > kubectl get deployment,pods
NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/iis-site-windows   2/2     2            2           3m4s

NAME                                    READY   STATUS    RESTARTS   AGE
pod/iis-site-windows-5b6dfdf64b-k5b6r   1/1     Running   0          3m4s
pod/iis-site-windows-5b6dfdf64b-msr9s   1/1     Running   0          3m4s

4. Kubernetes サービスの作成

ポッドが外部にアクセスできるようにするには、「LoadBalancer」タイプの Kubernetes サービスを作成する必要があります。

  > kubectl expose deployment iis-site-windows --type="LoadBalancer"

service/iis-site-windows exposed

数分後、外部 IP を持つ新しいサービスが表示されるようになります。

  > kubectl get service
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)
iis-site-windows   LoadBalancer   10.107.11.34   104.155.45.254  80:30035/TCP

その外部 IP にアクセスすると、アプリケーションが表示されます。

external_IP.max-400x400.png

これは、前回説明した Compute Engine へのデプロイとよく似ていますが、今回は Kubernetes がポッドを管理している点が大きく異なります。ポッドかノードのいずれかに問題が生じると、Kubernetes は自動的にポッドを作り直して再スケジューリングを行い、見事なまでのレジリエンシーを発揮します。


同様に、Kubernetes ではポッドのスケーリングも 1 つのコマンドで実行可能です。

  > kubectl scale deployment iis-site-windows --replicas=4

deployment.extensions/iis-site-windows scaled
  > kubectl get pods
NAME                                READY   STATUS   iis-site-windows-5b6dfdf64b-2kn65   1/1     Running
iis-site-windows-5b6dfdf64b-8rvbm   1/1     Running
iis-site-windows-5b6dfdf64b-bq8dg   1/1     Running
iis-site-windows-5b6dfdf64b-zjr6c   1/1     Running

上記の手順をご自身で試したい方のために、このテーマのコードラボも用意しています。

Windows_containers_on_GKE.max-400x400.png

GKE 上で Windows コンテナを実行する方法は以上です。これを試してみたい方は、こちらにサインアップして早期アクセス プログラムにご参加ください。


- By Mete Atamel, Developer Advocate