名前空間を使ったワークロードの分離

KubernetesBeginner
オンラインで実践に進む

はじめに

Kubernetes は、クラスタ内のワークロードとリソースを分離するための方法として名前空間を提供します。この実験では、名前空間を使用してワークロードとリソースを分離する方法を学びます。名前空間を作成し、その名前空間に単純な Web アプリケーションをデプロイし、Web アプリケーションがクラスタ内の他のリソースから分離されていることを確認します。

Minikube クラスタを起動する

リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカル マシン上で動作する軽量の Kubernetes 環境です。

  1. 作業ディレクトリに移動する:

    ターミナルを開き、デフォルトのプロジェクト フォルダに移動します。

    cd /home/labex/project
    
  2. Minikube を起動する:

    Minikube を起動して Kubernetes クラスタを初期化します。

    minikube start
    
    • このコマンドは、ローカル マシン上に単一ノードの Kubernetes クラスタをセットアップします。
    • Minikube は、システムの性能に応じて数分かかる場合があります。
  3. Minikube が動作していることを確認する:

    Minikube クラスタの状態を確認します。

    minikube status
    
    • kubeletapiserver などのコンポーネントが Running と表示されていることを確認します。
    • クラスタが動作していない場合は、minikube start を再度実行します。

Minikube の起動に問題がある場合は、必要に応じて minikube delete を使用して環境をリセットします。

名前空間を作成する

このステップでは、クラスタ内の他のリソースから Web アプリケーションを分離するために、webapp と呼ばれる名前空間を作成します。

次の内容を持つ namespace.yaml という名前のファイルを作成します。

apiVersion: v1
kind: Namespace
metadata:
  name: webapp

次のコマンドを使用して、名前空間をクラスタに適用します。

kubectl apply -f namespace.yaml

次のコマンドを使用して、名前空間が作成されたことを確認します。

kubectl get namespaces

名前空間の一覧に webapp 名前空間が表示されるはずです。

Web アプリケーションをデプロイする

このステップでは、webapp 名前空間に単純な Web アプリケーションをデプロイします。

次の内容を持つ web-app.yaml という名前のファイルを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: webapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

このファイルは、最新バージョンの Nginx Web サーバーを実行するコンテナの 1 レプリカを持つ Deployment を作成します。

次のコマンドを使用して、Deployment をクラスタに適用します。

kubectl apply -f web-app.yaml

次のコマンドを使用して、webapp 名前空間で Web アプリケーションが実行されていることを確認します。

kubectl get pods -n webapp

webapp 名前空間で実行されているポッドの一覧に web-app ポッドが表示されるはずです。

Web アプリケーションを公開する

このステップでは、Kubernetes サービスを使用して Web アプリケーションを外部に公開します。

次の内容を持つ web-app-service.yaml という名前のファイルを作成します。

apiVersion: v1
kind: Service
metadata:
  name: web-app
  namespace: webapp
spec:
  selector:
    app: web-app
  ports:
    - name: http
      port: 80
      targetPort: 80
  type: ClusterIP

このファイルは、ClusterIP を使用して Web アプリケーションをクラスタに公開するサービスを作成します。

次のコマンドを使用して、サービスをクラスタに適用します。

kubectl apply -f web-app-service.yaml

次のコマンドを使用して、webapp 名前空間でサービスが実行されていることを確認します。

kubectl get services -n webapp

webapp 名前空間で実行されているサービスの一覧に web-app サービスが表示されるはずです。

名前空間の分離を確認する

このステップでは、Web アプリケーションがクラスタ内の他のリソースから分離されていることを確認します。

次の内容を持つ other-app.yaml という名前のファイルを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: other
spec:
  replicas: 1
  selector:
    matchLabels:
      app: other
  template:
    metadata:
      labels:
        app: other
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80

このファイルでは、nginx イメージを持つコンテナを実行する、デフォルト名前空間に other と呼ばれる別の Deployment を作成しています。

次のコマンドを使用して、Deployment をクラスタに適用します。

kubectl apply -f other-app.yaml

次のコマンドを使用して、Deployment がデフォルト名前空間で実行されていることを確認します。

kubectl get pods | grep other

デフォルト名前空間で実行されているポッドの一覧に other ポッドが表示されるはずです。

クロス名前空間アクセスの検証

まず、以下のコマンドを実行して、アプリケーションを実行している Pod の名前を見つけます。

kubectl get pods -l app=other

other Pod が表示されるはずです。Pod の名前をメモしてください。

次に、以下のコマンドを実行して、アプリケーションを実行しているコンテナでシェルセッションを開きます。

kubectl exec -it pod-name -- /bin/sh

<pod-name> を、先ほどメモした Pod の名前に置き換えてください。

シェルセッションに入ったら、以下のコマンドを実行して web-app Deployment にアクセスします。

curl web-app.webapp

Nginx Web サーバーからの HTML レスポンスが表示されるはずです。

まとめ

この実験では、Kubernetes クラスタ内のワークロードとリソースを分離するために名前空間をどのように使用するかを学びました。名前空間を作成し、その名前空間に単純な Web アプリケーションをデプロイし、Kubernetes サービスを使用して Web アプリケーションを外部に公開し、Web アプリケーションがクラスタ内の他のリソースから分離されていることを確認しました。