見出し画像

Docker Desktopを使ってKubernetesでNginxを立ててみる

はじめに

こんにちは、SHIFTの長岡です。

Docker DesktopにはKubernetesがバンドルされているため手軽に試すことができます。本記事ではDocker Desktop for Windowsを使ってKubernetesを試してみたいと思います。

環境

  • OS:Windows 11 Home

  • Docker Desktop for Windows:4.9.0

  • Kubernetes:1.24.0

1. Kubernetesの有効化

Docker Desktopの設定画面からKubernetesを選択し、Enable Kubernetesにチェックを入れます。Kubernetesクラスターをインストールするか確認のメッセージが表示されるのでInstallをクリックします。しばらく待つとKubernetesがインストールされ左下のKubernetesアイコンが緑(Kubernetes RUNNING)になるのでこれでKubernetesが利用できる状態になります。

2. マニフェストファイルの作成

Kubernetesはマニフェストファイルと呼ばれる定義ファイルに記載された内容に沿ってPod等のリソースを制御します。そのため、まずは自分が構築したい環境構成に従ってマニフェストファイルを作る必要があります。マニフェストファイルはリソースごとに分割することもできますし、1つのマニフェストファイルに全て宣言することも可能です。本記事ではリソースごとに分割する形でマニフェストファイルを作成していきます。

2-1. マニフェストファイルの作成(Deployment)

Deploymentとは、PodやReplicaSetを制御するためのリソースになります。Deploymentを作成することで実際にPodが作成されます。

apiVersion: apps/v1  # Deploymentの場合は「apps/v1」固定
kind: Deployment  # Deploymentを指定
metadata:
  name: nginx-deploy  # Deploymentの名前(任意の名前を付与)を指定
spec:  # ReplicaSetの定義
  replicas: 3  # Podの数を指定
  selector:
    matchLabels:
      app: nginx
  template:  # 作成するPodの情報
    metadata:
      labels:
        app: nginx  # 生成するPodの名前(任意の名前を付与)を指定
    spec:
      containers:  # 本セクションにコンテナイメージを記述
      - image: nginx:latest
        name: nginx
        ports:
        - containerPort: 80

2-2. マニフェストファイルの作成(Service)

Serviceとは、構成が同じPodのセットにアクセスするためのポリシーを定義したリソースです。Serviceを作成することで定義したポリシーに則って環境が構築されます。

apiVersion: v1  # Serviceの場合は「v1」固定
kind: Service  # Serviceを指定
metadata:
  name: nginx-service  # Serviceの名前(任意の名前を付与)を指定
spec:  # Podのポリシーの定義
  type: NodePort
  ports:
    - port: 80
      nodePort: 30000
  selector:
    app: nginx  # Deploymentで指定したPodの名前を指定

3. Deploymentの作成

以下のコマンドでDeploymentを作成します。-fの後ろはDeploymentファイルのパスを指定します。

$ kubectl apply -f C:/kubernetes/deployment.yaml
deployment.apps/nginx-deploy created ←このように出力されればコマンド実行は成功です

コマンド実行は成功したので、以下のコマンドでPodが作成されているかを確認します。

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-544dc8b7c4-2c2hj   1/1     Running   0          10h
nginx-deploy-544dc8b7c4-fkbjh   1/1     Running   0          10h
nginx-deploy-544dc8b7c4-jfbd6   1/1     Running   0          10h

Deploymentファイルで指定した通り、Podが3つ作成されていることを確認できました。

4. Serviceの作成

以下のコマンドでServiceを作成します。-fの後ろはServiceファイルのパスを指定します。

$ kubectl apply -f C:/kubernetes/service.yaml
service/nginx-service created ←このように出力されればコマンド実行は成功です

コマンド実行は成功したので、以下のコマンドでServiceが作成されているかを確認します。

$ kubectl get services
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1              443/TCP        41d
nginx-service   NodePort    10.96.63.255           80:30000/TCP   9h

5. 動作確認

http://localhost:30000/ にアクセスして確認します。

上記の通り無事KubernetesでNginx環境が構築できました。

6. Podの自動復旧の確認

KubernetesではPodが何らかの障害により壊れた場合でも自動復旧の機能があります。本節ではそれを試してみます。 まずは、Podの確認を再度行います。

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-544dc8b7c4-2c2hj   1/1     Running   0          10h
nginx-deploy-544dc8b7c4-fkbjh   1/1     Running   0          10h
nginx-deploy-544dc8b7c4-jfbd6   1/1     Running   0          10h

次に一番上の「nginx-deploy-544dc8b7c4-2c2hj」というPodを以下のコマンドで削除してみます。

$ kubectl delete pod nginx-deploy-544dc8b7c4-2c2hj
pod "nginx-deploy-544dc8b7c4-2c2hj" deleted ←このように出力されればコマンド実行は成功です

再度Podの確認を行います。

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-544dc8b7c4-5b9m7   1/1     Running   0          87s ←AGEを見ると新しくPodが作成されていることが確認できる
nginx-deploy-544dc8b7c4-fkbjh   1/1     Running   0          10h
nginx-deploy-544dc8b7c4-jfbd6   1/1     Running   0          10h

上記の通り、AGEを見ると新しくPodが作成されていることが確認できます。つまり、Podが壊れても自動復旧していることが確認できました。

最後に

今回は自身のローカル環境上でKubernetesを試してみましたが、実際の開発の現場ではEKS(AWS)やGKE(GCP)といったクラウドサービス上で利用されるケースがほとんどです。クラウドサービス上ではノードが複数あったり複数のサービスを組み合わせて使われるといったことが多く、ローカル環境上での構築とは全く別物になります。とはいえ、マニフェストファイルをいかに定義するかという点では、ローカル環境でも同じです。クラウドサービスを利用する前にローカル環境でどんなものかを試すだけでも充分基礎的なところや雰囲気は掴めると思います。興味のある方は是非ローカル環境で手軽に試してみてはいかがでしょうか。

以上です。


執筆者プロフィール :長岡 賢一
2006年1月に小規模ソフトウェアハウスに就職。14年半システムエンジニアとして多数のプロジェクトの開発(要件定義~リリース)、チームリーダー等を経験したのち、2020年7月にSHIFTに入社。GUIテストの自動化をしつつ案件管理者としても日々奮闘中。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/