はじめに
Kubernetes の expose
コマンドは、ネットワーク サービス経由でポッドまたはデプロイメントにアクセスできるようにするための、シンプルで強力なツールです。この実験では、Kubernetes クラスターを起動し、デプロイメントを作成し、サービスとして公開し、サービスにアクセスして機能を検証するプロセスを案内します。この実験が終了すると、Kubernetes でデプロイメントを公開し、サービスと協働する方法を明確に理解しているでしょう。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
Kubernetes の expose
コマンドは、ネットワーク サービス経由でポッドまたはデプロイメントにアクセスできるようにするための、シンプルで強力なツールです。この実験では、Kubernetes クラスターを起動し、デプロイメントを作成し、サービスとして公開し、サービスにアクセスして機能を検証するプロセスを案内します。この実験が終了すると、Kubernetes でデプロイメントを公開し、サービスと協働する方法を明確に理解しているでしょう。
Kubernetes をローカルで実行するには、単一ノードの Kubernetes クラスターをセットアップする Minikube を使用します。Kubernetes の操作を開始する前に、Minikube が起動して実行されていることを確認してください。
ターミナルを開き、次のコマンドで Minikube を起動します。
minikube start
これによりクラスターが初期化されます。必要に応じて、--cpus
や --memory
などのフラグを使用してリソース制限を指定して、クラスターに十分なリソースを確保できます。
Minikube が実行されていることを確認します。
minikube status
クラスターとそのコンポーネントが正常に実行されていることが表示されるはずです。
Minikube を起動することで、Kubernetes が後続の手順でデプロイメントとサービスを管理できる状態になります。
Kubernetes では、デプロイメントは、常に必要な数のレプリカが稼働していることを保証するためのリソース オブジェクトです。デプロイメントはポッドを管理し、クラスター内でそれらの状態を維持するのに役立ちます。このステップでは、Nginx ウェブ サーバーを実行するデプロイメントを作成します。
次のコマンドを使用して、nginx
イメージを使用して hello-world
という名前のデプロイメントを作成します。
kubectl create deployment hello-world --image=nginx
このコマンドは、Nginx ウェブ サーバーを実行する単一のポッドを持つデプロイメントを作成します。--image
フラグは使用するコンテナ イメージを指定します。レプリカが明示的に設定されていないため、Kubernetes は既定で 1 つのポッドを作成します。
次のコマンドを実行して、デプロイメントが正常に作成されたことを確認します。
kubectl get deployments
このコマンドは、現在の名前空間内のすべてのデプロイメントを一覧表示し、その名前、必要なレプリカ数、および状態を表示します。
このデプロイメントを作成することで、Kubernetes が自動的にポッドの作成と再起動を行って、必要なアプリケーション状態を維持することが保証されます。
kubectl expose
コマンドを調べるkubectl expose
コマンドは、既存のリソース(たとえば、ポッド、デプロイメント、またはリプリケーション コントローラー)を公開するための新しい Kubernetes サービスを作成するために使用されます。提供されたリソースに基づいて自動的にサービスを作成することで、ネットワーク構成を簡素化します。
kubectl expose
の利用可能なオプションを表示するには、次のコマンドを実行します。
kubectl expose -h
次の出力が表示されます。
既存のリソースを新しい Kubernetes サービスとして公開します。
名前でデプロイメント、サービス、レプリカ セット、リプリケーション コントローラー、またはポッドを検索し、そのリソースのセレクターを使用して、指定されたポートで新しいサービスのセレクターとします。デプロイメントまたはレプリカ セットは、そのセレクターがサービスがサポートするセレクターに変換可能な場合、つまりセレクターに matchLabels コンポーネントのみが含まれている場合にのみ、サービスとして公開されます。ただし、--port を指定してポートが指定されていない場合、または公開されるリソースが複数のポートを持っている場合、新しいサービスはすべてのポートを再利用します。また、ラベルが指定されていない場合、新しいサービスは公開するリソースのラベルを再利用します。
利用可能なリソースには(大文字小文字は区別されません):
pod (po)、service (svc)、replicationcontroller (rc)、deployment (deploy)、replicaset (rs)
例:
## ポート 80 で提供され、コンテナーにポート 8000 で接続する、複製された nginx 用のサービスを作成します
kubectl expose rc nginx --port=80 --target-port=8000
## "nginx-controller.yaml" に指定された型と名前で識別されるリプリケーション コントローラー用のサービスを作成します。
このサービスはポート 80 で提供され、コンテナーにポート 8000 で接続します
kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000
## ポート 444 で提供され、名前が "frontend" のポッド valid-pod 用のサービスを作成します
kubectl expose pod valid-pod --port=444 --name=frontend
## 上記のサービスに基づいて 2 番目のサービスを作成し、コンテナー ポート 8443 をポート 443 として公開し、名前を
"nginx-https" にします
kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https
## ポート 4100 で複製されたストリーミング アプリケーション用のサービスを作成し、UDP トラフィックをバランスさせ、名前を 'video-stream' にします。
kubectl expose rc streamer --port=4100 --protocol=UDP --name=video-stream
## レプリカ セットを使用して複製された nginx 用のサービスを作成します。このサービスはポート 80 で提供され、コンテナーにポート 8000 で接続します
kubectl expose rs nginx --port=80 --target-port=8000
## nginx デプロイメント用のサービスを作成します。このサービスはポート 80 で提供され、コンテナーにポート 8000 で接続します
kubectl expose deployment nginx --port=80 --target-port=8000
Kubernetes クラスターの外部からデプロイメントにアクセスできるようにするには、それをサービスとして公開する必要があります。Kubernetes のサービスは、基になるポッドが変化しても安定したネットワーク エンドポイントとして機能します。
次のコマンドを実行して、hello-service
という名前の NodePort サービスを作成します。
kubectl expose deployment hello-world --name=hello-service --port=80 --target-port=80 --type=NodePort
--port
フラグは、サービスが外部クライアントに公開するポートを指定します。--target-port
フラグは、サービスがトラフィックをルーティングするコンテナー上のポートを定義します。--type=NodePort
フラグは、クラスター内の各ノードの特定のポートでサービスにアクセスできるようにします。サービスが正常に作成されたことを確認します。
kubectl get services hello-service
このコマンドは、サービスの詳細を表示します。その種類と割り当てられた NodePort も含まれます。
NodePort のようなサービスは、外部クライアントが正しいコンテナー ポートに要求を転送することで、Kubernetes クラスター内のポッドと対話できるようにします。
公開されたサービスにアクセスするには、サービスに割り当てられた NodePort とクラスター内のノードの内部 IP アドレスが必要です。これらの詳細により、外部クライアントがアプリケーションに接続できるようになります。
次のコマンドを実行して、hello-service
に割り当てられた NodePort を取得します。
kubectl get service hello-service -o jsonpath='{.spec.ports[0].nodePort}'
このコマンドは、サービス定義から NodePort 値を抽出します。
次のコマンドを使用して、クラスター内の任意のノードの内部 IP アドレスを取得します。
kubectl get nodes -o wide
出力の INTERNAL-IP
フィールドに注目してください。この IP アドレスは、ノードのプライベート ネットワーク アドレスを表します。
NodePort と InternalIP があれば、外部からサービスにアクセスするための必要な詳細がそろいました。
NodePort とノードの IP アドレスを使えば、curl
やウェブ ブラウザーなどのツールを使ってサービスをテストできます。
前の手順で取得した値で <NODE_IP>
と <NODE_PORT>
を置き換えた後、次のコマンドを実行します。
curl <NODE_IP>:<NODE_PORT>
すべてが正しく構成されていれば、ターミナルに Nginx のデフォルトのウェルカム ページが表示されるはずです。この出力は、サービスが稼働しており、外部からアクセス可能であることを確認します。
<!doctype html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html {
color-scheme: light dark;
}
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
</p>
<p>
For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br />
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.
</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
サービスにアクセスすることで、Kubernetes がクライアントと適切なコンテナ ポートの間でトラフィック ルーティングをどのように行うかが示されます。
実験を完了した後は、Kubernetes クラスターで不要なリソース消費を避けるために、作成したリソースをクリーンアップすることが重要です。
次のコマンドを実行して、hello-service
を削除します。
kubectl delete service hello-service
次のコマンドで hello-world
デプロイメントを削除します。
kubectl delete deployment hello-world
リソースのクリーンアップにより、クラスターがクリーンな状態を保ち、将来の実験に備えることができます。
この実験では、Kubernetes の expose
コマンドを使って NodePort サービスを作成する方法を学びました。Nginx のデプロイメントを公開し、NodePort を通じてアクセスし、その機能を確認しました。この演習では、Kubernetes サービスのコア コンセプトと、ワークロードへのネットワーク アクセスをどのように提供するかが示されました。