Kubernetes での Ingress によるネットワーキング

KubernetesKubernetesBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Kubernetes クラスタ内で実行されているサービスに外部トラフィックをルーティングするために Ingress をどのように使用するかを学びます。

Kubernetes Ingress は、Kubernetes クラスタ内のサービスへの外部アクセスを管理するための強力なツールです。Ingress は 7 層ロードバランサとして機能し、入力 URL パスまたはホスト名に基づいてトラフィックを異なるサービスにルーティングすることができます。

この実験では、サンプルアプリケーションを作成し、Ingress を使用して外部に公開します。Kubernetes Ingress に人気があり広く使用されているソリューションであるnginx-ingressを Ingress コントローラとして使用します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") subgraph Lab Skills kubernetes/initialization -.-> lab-9681{{"Kubernetes での Ingress によるネットワーキング"}} kubernetes/get -.-> lab-9681{{"Kubernetes での Ingress によるネットワーキング"}} kubernetes/create -.-> lab-9681{{"Kubernetes での Ingress によるネットワーキング"}} kubernetes/apply -.-> lab-9681{{"Kubernetes での Ingress によるネットワーキング"}} kubernetes/describe -.-> lab-9681{{"Kubernetes での Ingress によるネットワーキング"}} end

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を使用して環境をリセットします。

Nginx Ingress コントローラをインストールする

まず、クラスタ内にnginx-ingressコントローラをインストールする必要があります。これは、Ingress コントローラを実行するための Deployment と Service を作成することで行うことができます。

Ingress コントローラ用の名前空間を作成します。

kubectl create namespace ingress-nginx

kubectlを使用してingress-nginxチャートをインストールします。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml

ingress-nginxコントローラのポッドが実行されていることを確認します。

kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS              RESTARTS   AGE
ingress-nginx-admission-create-zjfqx        0/1     ContainerCreating   0          2s
ingress-nginx-admission-patch-8rvzw         0/1     ContainerCreating   0          2s
ingress-nginx-controller-6bdb654777-qz8fb   0/1     ContainerCreating   0          2s

サンプルアプリケーションを作成する

次に、Ingress を使用して公開するサンプルアプリケーションを作成します。

サンプルアプリケーション用の Deployment を作成します。

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

この YAML ファイルはsample-app.yamlと呼ばれます。次のコマンドでクラスタに Deployment を適用します。

kubectl apply -f sample-app.yaml

サンプルアプリケーション用の Service を作成します。

apiVersion: v1
kind: Service
metadata:
  name: sample-app
spec:
  selector:
    app: sample-app
  ports:
  - name: http
    port: 80
    targetPort: 80

この YAML ファイルはservice-sample-app.yamlと呼ばれます。次のコマンドでクラスタに Deployment を適用します。

kubectl apply -f service-sample-app.yaml

Ingress リソースを作成する

これで Ingress コントローラがセットアップされ、バックエンドサービスが実行されているので、Ingress リソースのルールを作成することができます。

この例では、test.localドメインのトラフィックをバックエンドサービスにルーティングするための単純なルールを作成します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: test.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: sample-app
            port:
              name: http

この YAML ファイルはingress.yamlと呼ばれます。クラスタに Ingress リソースを適用します。

kubectl apply -f ingress.yaml

Ingress リソースをテストする

最後に、すべてが正常に動作していることを確認するために、Ingress リソースをテストすることができます。

まず、ノードの IP アドレスを確認します。

kubectl get node -o wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
minikube   Ready    control-plane   93s   v1.26.1   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   5.15.0-56-generic   docker://20.10.23

このコマンドでは、Kubernetes ノードのアドレスが取得され、INTERNAL-IPとしてラベル付けされた IP アドレスが表示されます。

次に、/etc/hostsファイルにエントリを追加して、test.localドメインをノードの IP アドレスにマップします。

echo "<IP_ADDRESS> test.local" | sudo tee -a /etc/hosts

<IP_ADDRESS>をノードアドレスの内部 IP アドレスに置き換えます。たとえば:

echo "192.168.49.2 test.local" | sudo tee -a /etc/hosts

次に、ingress-nginxのサービスノードポートを取得します。

kubectl get services -n ingress-nginx

このコマンドでは、ingress-nginx名前空間内のサービスの一覧が表示されます。nginx-ingress-controllerサービスを探して、そのNodePortをメモします。

NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.104.99.158   <pending>     80:32518/TCP,443:31620/TCP   2m45s
ingress-nginx-controller-admission   ClusterIP      10.100.46.109   <none>        443/TCP                      2m45s

最後に、curlを使用して Ingress エンドポイントに HTTP 要求を行います。

curl test.local:NodePort

たとえば:

curl test.local:32518

<NodePort>nginx-ingress-controllerサービスのNodePortに置き換えます。

すべてが正しく設定されていれば、Nginx のウェルカムページが表示されるはずです。

また、Web ブラウザを使用してtest.local:<NodePort>/nginxにアクセスすることで、Ingress をテストすることもできます。

おめでとうございます。Kubernetes に Ingress リソースを正常にセットアップし、それが正しく動作していることを確認しました。

まとめ

この実験では、Kubernetes における Nginx イングレスコントローラのセットアップと構成の手順を学びました。また、サンプルアプリケーションを作成し、イングレスを使って外部トラフィックを Nginx サービスにルーティングしました。これは Kubernetes ネットワーキングでできることの始まりにすぎず、さらに探求することをお勧めします。