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

KubernetesKubernetesBeginner
今すぐ練習

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

はじめに

この実験では、内部および外部サービスの作成、ラベルの操作、およびイングレスの基本を学ぶなど、さまざまな手法を使って Kubernetes アプリケーションを公開する方法を学びます。まず、Minikube を使ってローカル Kubernetes クラスタをセットアップし、次にサンプルの NGINX アプリケーションをデプロイして内部および外部で公開します。また、ラベルを使ってリソースを整理および選択する方法を学び、最後にイングレスについて学び、簡単なイングレス YAML の例を見ます。


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/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("Delete") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("Label") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/version("Version") subgraph Lab Skills kubernetes/initialization -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} kubernetes/get -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} kubernetes/create -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} kubernetes/delete -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} kubernetes/apply -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} kubernetes/describe -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} kubernetes/label -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} kubernetes/version -.-> lab-434647{{"Kubernetes アプリケーションを公開する"}} end

Kubernetes クラスタを起動する

このステップでは、Minikube を使ってローカル Kubernetes クラスタを起動して検証する方法を学びます。これは、ローカル マシンで Kubernetes アプリケーションを開発およびテストするための必須の最初のステップです。

まず、Minikube クラスタを起動します。

minikube start

出力例:

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀  Launching Kubernetes...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

複数のコマンドを使ってクラスタの状態を検証します。

minikube status
kubectl get nodes

minikube status の出力例:

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

kubectl get nodes の出力例:

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

これらのコマンドは、以下のことを確認します。

  1. Minikube が正常に動作している
  2. ローカル Kubernetes クラスタが作成されている
  3. クラスタが使用可能になっている
  4. コントロール プレーン機能を備えた単一ノードのクラスタがある

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

このステップでは、YAML マニフェストを使って Kubernetes アプリケーションを作成およびデプロイする方法を学びます。Kubernetes リソースを定義および適用するプロセスを示すために、簡単な NGINX ウェブ サーバーのデプロイを作成します。

まず、Kubernetes マニフェスト用のディレクトリを作成します。

mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests

NGINX のデプロイ用の YAML ファイルを作成します。

nano nginx-deployment.yaml

次のデプロイ マニフェストを追加します。

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

ファイルを保存します (Ctrl+X で次に Y で Enter)。

Kubernetes クラスタにデプロイを適用します。

kubectl apply -f nginx-deployment.yaml

出力例:

deployment.apps/nginx-deployment created

デプロイとポッドを検証します。

kubectl get deployments
kubectl get pods

kubectl get deployments の出力例:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           1m

kubectl get pods の出力例:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          1m
nginx-deployment-xxx-zzz            1/1     Running   0          1m
nginx-deployment-xxx-www            1/1     Running   0          1m

次の手順に進む前に、ポッドが「Running」状態になるまで待ちます。

YAML マニフェストを解説しましょう。

  • apiVersion: Kubernetes API のバージョンを指定します
  • kind: リソースの種類 (Deployment) を定義します
  • metadata: デプロイに名前とラベルを提供します
  • spec.replicas: ポッドのレプリカ数を設定します
  • selector: デプロイが正しいポッドを管理するのを助けます
  • template: ポッドの仕様を定義します
  • containers: コンテナ イメージとポートを指定します

このデプロイは 3 つの同じ NGINX ポッドを作成し、Kubernetes がコンテナ化されたアプリケーションをどのように管理するかを示しています。

YAML を使ってサービスを作成してアプリケーションを内部または外部に公開する

このステップでは、Kubernetes サービスを作成して NGINX のデプロイを内部および外部に公開する方法を学びます。2 つの一般的なサービスの種類:ClusterIP と NodePort を示します。

まず、プロジェクト ディレクトリに移動します。

cd ~/project/k8s-manifests

ClusterIP サービスの YAML ファイルを作成します。

nano nginx-clusterip-service.yaml

次のサービス マニフェストを追加します。

apiVersion: v1
kind: Service
metadata:
  name: nginx-clusterip-service
spec:
  selector:
    app: nginx
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80

次に、NodePort サービスの YAML ファイルを作成します。

nano nginx-nodeport-service.yaml

次のサービス マニフェストを追加します。

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-service
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

両方のサービスの設定を適用します。

kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml

出力例:

service/nginx-clusterip-service created
service/nginx-nodeport-service created

サービスを検証します。

kubectl get services

出力例:

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        30m
nginx-clusterip-service     ClusterIP   10.104.xxx.xxx   <none>        80/TCP         1m
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   1m

NodePort サービスにアクセスするには、Minikube の IP を取得します。

minikube ip

出力例:

192.168.49.2

サービスの種類の主な違い:

  • ClusterIP:内部クラスタのアクセスのみ
  • NodePort:各ノードの IP の静的なポートでサービスを公開する
  • NodePort の範囲:30000 - 32767

サービスの設定を検証する

このステップでは、kubectl describe service を使って Kubernetes サービスの詳細な設定を調べ、そのネットワーク プロパティを理解する方法を学びます。

まず、プロジェクト ディレクトリにいることを確認します。

cd ~/project/k8s-manifests

ClusterIP サービスの詳細を表示します。

kubectl describe service nginx-clusterip-service

出力例:

Name:              nginx-clusterip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.104.xxx.xxx
IPs:               10.104.xxx.xxx
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity:  None
Events:            <none>

次に、NodePort サービスの詳細を表示します。

kubectl describe service nginx-nodeport-service

出力例:

Name:                     nginx-nodeport-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=nginx
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.108.yyy.yyy
IPs:                      10.108.yyy.yyy
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30080/TCP
Endpoints:                10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

ネットワーク接続性を検証するために、サービス エンドポイントを調べます。

kubectl get endpoints

出力例:

NAME                        ENDPOINTS                               AGE
kubernetes                  192.168.49.2:8443                       45m
nginx-clusterip-service     10.244.0.7:80,10.244.0.8:80,10.244.0.9:80   15m
nginx-nodeport-service      10.244.0.7:80,10.244.0.8:80,10.244.0.9:80   15m

サービスの説明から理解すべき重要な情報:

  • セレクター:サービスの一部となるポッドを示します
  • IP:サービスのクラスタ内の IP アドレス
  • エンドポイント:サービスを提供するポッドの IP アドレスとポートの一覧
  • ポートとターゲット ポート:トラフィックがルーティングされる方法を定義します
  • NodePort:NodePort サービスの種類の外部ポート

ラベルを使ってリソースを整理して選択する

このステップでは、Kubernetes でラベルを使って効率的にリソースを整理して選択する方法を学びます。ラベルは、Kubernetes オブジェクトを管理および整理するのに役立つキーと値のペアです。

まず、ポッドの現在のラベルを検証します。

kubectl get pods --show-labels

出力例:

NAME                                READY   STATUS    RESTARTS   AGE   LABELS
nginx-deployment-xxx-yyy            1/1     Running   0          30m   app=nginx,pod-template-hash=xxx
nginx-deployment-xxx-zzz            1/1     Running   0          30m   app=nginx,pod-template-hash=yyy
nginx-deployment-xxx-www            1/1     Running   0          30m   app=nginx,pod-template-hash=zzz

特定のラベルを使ってポッドを選択します。

kubectl get pods -l app=nginx

出力例:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          30m
nginx-deployment-xxx-zzz            1/1     Running   0          30m
nginx-deployment-xxx-www            1/1     Running   0          30m

ポッドの 1 つにカスタム ラベルを追加しましょう。

kubectl label pods nginx-deployment-xxx-yyy environment=development

nginx-deployment-xxx-yyy を自分のポッドの名前に置き換えてください。

出力例:

pod/nginx-deployment-xxx-yyy labeled

次に、複数のラベル セレクタを持つポッドを選択します。

kubectl get pods -l app=nginx,environment=development

出力例:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          30m

ポッドからラベルを削除します。

kubectl label pods nginx-deployment-xxx-yyy environment-

出力例:

pod/nginx-deployment-xxx-yyy unlabeled

サービスでのラベル選択を示します。

kubectl describe service nginx-clusterip-service

サービスがポッドを識別するためにラベルをどのように使用するかを示す「Selector」セクションを探します。

ラベルに関する要点:

  • ラベルは、Kubernetes オブジェクトに付加されるキーと値のペアです
  • リソースの整理、選択、およびフィルタリングに使用されます
  • 動的に追加、変更、または削除できます
  • サービスとデプロイは、関連するポッドを管理するためにラベルを使用します

サービスの削除と管理

このステップでは、kubectl コマンドを使用して Kubernetes サービスを削除および管理する方法を学びます。サービス管理を理解することは、Kubernetes リソースの維持と整理に不可欠です。

まず、現在のサービスを一覧表示します。

kubectl get services

出力例:

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        1h
nginx-clusterip-service     ClusterIP   10.104.xxx.xxx   <none>        80/TCP         45m
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   45m

kubectl delete を使用して特定のサービスを削除します。

kubectl delete service nginx-clusterip-service

出力例:

service "nginx-clusterip-service" deleted

サービスの削除を確認します。

kubectl get services

出力例:

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        1h
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   45m

カンマ区切りのリストを使用して、一度に複数のサービスを削除します。

kubectl delete service nginx-nodeport-service,nginx-clusterip-service

複数のサービスの削除をより明確に示すために、サービスを再作成してから一緒に削除しましょう。

## Recreate services
kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml
## Delete multiple services at once
kubectl delete service nginx-clusterip-service nginx-nodeport-service

出力例:

service "nginx-clusterip-service" deleted
service "nginx-nodeport-service" deleted

すべてのサービスが削除されたことを確認します(デフォルトの kubernetes サービスを除く)。

kubectl get services

出力例:

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   1h

サービス削除に関する要点:

  • サービスを削除すると、ネットワークエンドポイントが削除されます。
  • サービスが削除されても、ポッドは削除されません。
  • デフォルトの kubernetes サービスは削除できません。
  • 名前、YAML ファイル、またはラベルを使用してサービスを削除できます。
  • 複数のサービスをリストするか、ラベルセレクターを使用することで、同時に削除できます。

Ingressの基本を紹介し、シンプルなIngressのYAML例を示す

このステップでは、Kubernetesクラスタ内のサービスへの外部アクセスを管理する強力な方法であるKubernetes Ingressについて学びます。

Ingressとは何ですか?

Ingressは、Kubernetesクラスタ内のサービスへの外部アクセス(通常はHTTP)を管理するAPIオブジェクトです。Ingressは以下の機能を提供します。

  • ロードバランシング:トラフィックを複数のバックエンドサービスに分散させます。
  • SSL/TLS終端:安全な接続を処理します。
  • 名前ベースの仮想ホスティング:ホスト名に基づいてリクエストを異なるサービスにルーティングします。
  • パスベースのルーティング:URLパスに基づいてリクエストを異なるサービスにルーティングします。

Ingressは2つのコンポーネントで構成されています。

  1. Ingressリソース:ルーティングルールを定義するKubernetes APIオブジェクト
  2. Ingressコントローラ:Ingressリソースで定義されたルールを適用する実装

注意:この実験ではIngressの基本的な紹介のみを提供しています。本番環境では、Ingressの設定ははるかに複雑になり、高度なルーティング、認証、レート制限などが含まれます。

MinikubeでIngressアドオンを有効にしましょう。

minikube addons enable ingress

出力例:

💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
🔉  ingress was successfully enabled

2つのサンプルアプリケーションのデプロイメントを作成します。

kubectl create deployment web1 --image=nginx:alpine
kubectl create deployment web2 --image=httpd:alpine

これらのデプロイメントをサービスとして公開します。

kubectl expose deployment web1 --port=80 --type=ClusterIP --name=web1-service
kubectl expose deployment web2 --port=80 --type=ClusterIP --name=web2-service

IngressのYAMLファイルを作成します。

nano ingress-example.yaml

以下のIngress設定を追加します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /web1
            pathType: Prefix
            backend:
              service:
                name: web1-service
                port:
                  number: 80
          - path: /web2
            pathType: Prefix
            backend:
              service:
                name: web2-service
                port:
                  number: 80

このIngress設定の主要なコンポーネント:

  • metadata.annotations:Ingressコントローラの特定の設定
  • spec.rules:トラフィックをサービスにルーティングする方法を定義します。
  • path:一致するURLパス
  • pathType:パスの一致方法(Prefix、Exact、またはImplementationSpecific)
  • backend.service:トラフィックをルーティングするサービスとポート

Ingress設定を適用します。

kubectl apply -f ingress-example.yaml

Ingressリソースを確認します。

kubectl get ingress

出力例:

NAME              CLASS   HOSTS   ADDRESS        PORTS   AGE
example-ingress   nginx   *       192.168.49.2   80      1m

Ingressの詳細を確認します。

kubectl describe ingress example-ingress

出力例にはルーティングルールとバックエンドサービスが表示されます。

Ingressのテスト:

## Get the Minikube IP
minikube ip

## Test access to the services through Ingress
curl $(minikube ip)/web1
curl $(minikube ip)/web2

各コマンドは、それぞれのWebサーバーのデフォルトページを返すはずです。

本番環境では、Ingressを以下のように設定できます。

  • 複数のホスト名ベースのルール
  • HTTPS用のTLS証明書
  • 認証メカニズム
  • レート制限
  • カスタムタイムアウト設定
  • セッションアフィニティ
  • その他多数の高度な機能

Ingressのより包括的な情報については、Kubernetesのドキュメントを参照し、NGINX IngressやTraefikなどの専用のIngressコントローラのドキュメントを調べることを検討してください。

まとめ

この実験では、Minikube を使ってローカルの Kubernetes クラスタを起動して検証する方法を学びました。これは、ローカル マシン上で Kubernetes アプリケーションを開発およびテストする際に不可欠です。次に、YAML マニフェストを使って簡単な NGINX ウェブ サーバーのデプロイを作成してデプロイし、Kubernetes リソースを定義して適用するプロセスを示しました。また、Kubernetes サービスを作成してアプリケーションを内部または外部に公開する方法と、ラベルを使ってリソースを整理して選択する方法を学びました。最後に、Kubernetes Ingress の基本を学び、簡単な Ingress YAML の例を見ました。