0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゼロから始めるDocker+Kubernetes実践 #3:Kindで学ぶKubernetesの第一歩

Posted at

こんにちは!花木です。
前回はdocker-composeを使って複数のコンテナをまとめて管理する方法を学びました。
今回は、いよいよシリーズ最終章。docker-composeでは管理しきれない、大規模なシステムを動かすためのツール、 Kubernetes を体験してみましょう。


1. なぜKubernetesを使うのか?

前回のdocker-composeは、1台のサーバー上で複数のコンテナを管理するのに便利でした。
しかし、本番環境ではサーバーの故障や急なアクセス増といった、予測不能な事態が起こり、それらに対して手動で対応するのは非常に困難です。

Kubernetesは、これらの問題を解決するための「コンテナオーケストレーション」ツールです。
例えるなら、 コンテナを管理する「自動運転システム」 です。一度設定してしまえば、あとはKubernetesがコンテナの配置、自動スケーリング、故障時の自己修復などを、自動で面倒を見てくれます。


2. Kubernetesの導入:Kindを使おう

Kubernetesを試すには、専用の環境を構築する必要があります。
今回は、Dockerコンテナ内でKubernetesを動かす軽量ツール Kind (Kubernetes IN Docker) を使います。
Kindは、ローカルPCにKubernetes環境を簡単に用意できるため、学習用途に最適です。

① 必要なツールのインストール

Kindを動かすには、以下の2つのツールが必要です。

  • Docker: ホストとなるコンテナ実行環境です。Kind自体がDockerコンテナとして動作します。
  • kubectl: Kubernetesクラスターを操作するためのコマンドラインツールです。

kinddnfなどのパッケージマネージャーからは直接インストールされないため、公式サイトからバイナリを直接ダウンロードして配置するのが一般的です。
ダウンロードのコマンドについては以下のようになっています。

# Kindのインストール
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

# kubectlのインストール
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

3. Kubernetesを使ってみよう:WordPressをデプロイ

前回docker-composeで動かしたWordPressを、今回はKubernetesで動かしてみましょう。

docker-composedocker-compose.ymlという単一ファイルで設定をまとめるのに対し、Kubernetesは、DeploymentServiceといった 「マニフェストファイル」 と呼ばれる設定ファイルを複数作成して、システムの構成を細かく定義します。

今回は、WordPressとMySQLそれぞれの DeploymentService 、合計4つの要素を一つのファイルにまとめて定義します。

① Kubernetesクラスターの作成

Kindは、たった1つのコマンドでKubernetesクラスターを作成できます。

kind create cluster

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

プロジェクトのディレクトリを作成し、その中にwordpress.yamlというファイルを作成します。

mkdir my-wordpress-k8s
cd my-wordpress-k8s
touch wordpress.yaml

作成したwordpress.yamlに以下の内容を書き込みます。

サンプルコード
# WordPressのDeployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deployment
  labels:
    app: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
        - name: wordpress
          image: wordpress:latest
          ports:
            - containerPort: 80
          env:
            - name: WORDPRESS_DB_HOST
              value: mysql-service
            - name: WORDPRESS_DB_USER
              value: root
            - name: WORDPRESS_DB_PASSWORD
              value: password
            - name: WORDPRESS_DB_NAME
              value: wordpress
---
# WordPressのService
apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
spec:
  selector:
    app: wordpress
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort
---
# MySQLのDeployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8.0
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: password
            - name: MYSQL_DATABASE
              value: wordpress
---
# MySQLのService
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
-----

③ YAMLファイルの主な設定項目解説(docker-composeとの比較)

このKubernetes用YAMLファイルは、前回のdocker-compose.ymlと同じ機能を持っていますが、その構造と概念には大きな違いがあります。

Kubernetes (wordpress.yaml) Docker Compose (docker-compose.yml)
ファイル構造 複数のドキュメント(オブジェクト)から構成される。---で区切る。 servicesキー以下に全てのサービスを定義する。
概念 宣言的(Declarative)。最終的に「あるべき状態」を記述する。 命令的(Imperative)。どう動かすかを記述する。
コンポーネント DeploymentServiceなど、役割ごとにオブジェクトが分かれている。 servicesキー以下に、コンテナに関する設定をまとめる。

各設定項目の詳細な違い

  • apiVersionkind

    • Kubernetes: これらは、Kubernetesのオブジェクトの種類を定義する必須項目です。kind: Deploymentはアプリケーションのデプロイを管理するオブジェクト、kind: Serviceはコンテナへのアクセスを管理するオブジェクトであることを示します
    • Docker Compose: これらの概念は存在せず、servicesの下に記述されたものがすべて「サービス」として扱われます
  • metadatalabels

    • Kubernetes: metadataセクションで、オブジェクトの名前やラベルを定義します。ラベルは、オブジェクトを識別し、関連付けるための「名札」のようなものです。例えば、Serviceselector: app: wordpressという設定で、app: wordpressというラベルを持つPodを見つけてトラフィックを転送します
    • Docker Compose: コンテナ名を指定するcontainer_nameはありますが、Kubernetesのような柔軟なラベルによる管理概念はありません
  • spec

    • Kubernetes: オブジェクトの具体的な「あるべき状態(Desired State)」を記述するセクションです。replicas: 1と記述することで、「このコンテナを1つ動かしておいてね」と宣言します
    • Docker Compose: 設定項目が直接記述されるため、specのようなセクションはありません
  • コンテナ間の通信

    • Kubernetes: Serviceが重要な役割を果たします。wordpressコンテナのWORDPRESS_DB_HOSTに**mysql-service**と指定することで、WordPressはmysql-serviceという名前でデータベースにアクセスできます。これは、Serviceが提供する安定した内部DNS名による通信です
    • Docker Compose: デフォルトのネットワーク内で、サービス名(この例ではdb)がコンテナのホスト名として機能します。KubernetesのServiceのような、より高度なロードバランシング機能はありません
  • 外部からのアクセス

    • Kubernetes: Serviceオブジェクトのtype: NodePort設定により、クラスター外部から特定のポート経由でサービスにアクセスできるようにします。これは、Kubernetesにおける外部公開の基本的な方法です
    • Docker Compose: ports: "8080:80"でホストOSのポートを直接コンテナにマッピングします

Kubernetesは、より多くの設定が必要ですが、その分、Deploymentによるコンテナの自動修復Serviceによる柔軟なネットワーク管理など、本番環境で必須となる機能を実現できます。


④ アプリケーションのデプロイ

kubectl applyコマンドを使って、作成したマニフェストファイルをKubernetesクラスターに適用します。

kubectl apply -f wordpress.yaml

このコマンドを実行すると、Kubernetesはファイルの内容を読み込み、WordPressとMySQLのコンテナを自動で立ち上げてくれます。

⑤ 動作確認

kubectl get podsコマンドで、コンテナ(Pod)が正しく起動しているか確認します。

kubectl get pods

Running状態のPodが2つ作成されていれば成功です。

NAME                                   READY   STATUS    RESTARTS   AGE
mysql-deployment-xxxx-xxxx             1/1     Running   0          1m
wordpress-deployment-xxxx-xxxx         1/1     Running   0          1m

⑥ 外部からのアクセス

Kind環境では、kubectl port-forwardコマンドを使って、ローカルPCからサービスにアクセスできるようにします。

kubectl port-forward svc/wordpress-service 8080:80 --address サーバのIPアドレス

このコマンドを実行したまま、ウェブブラウザから http://サーバのIPアドレス:8080 にアクセスしてみてください。WordPressの初期設定画面が表示されるはずです。

補足:--addressオプションについて

--addressオプションは、kubectl port-forwardがどのIPアドレスからの接続を待ち受けるかを指定します。

  • --address 0.0.0.0: すべてのネットワークインターフェース(外部からの接続も含む)をリッスンします
  • --address 127.0.0.1: localhostからの接続のみをリッスンします(これがデフォルト動作です)
  • --address [ゲストOSのIPアドレス]: 特定のIPアドレスからの接続のみをリッスンします。セキュリティを考慮する場合に有効です

4. まとめと次のステップ

今回は、Kindを使ってKubernetesにWordPressをデプロイしました。docker-composeが単一ファイルで完結するのに対し、KubernetesではDeploymentServiceといった複数のオブジェクトを組み合わせて、より詳細な設定ができることを体験しました。

次回は、今回デプロイしたアプリケーションのスケーリング自己修復といった、Kubernetesの強力な機能についてさらに深く掘り下げていきます。お楽しみに!


👤 プロフィール

セントラルソフト株式会社
DXビジネス事業本部 所属
花木 光司

  • 🚴 サイクリング好き
  • 🪡 レザークラフト初心者
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?