Kubernetes ネームスペースとは
ネームスペースは、クラスタを仮想的なサブクラスタに分けて整理する方法です。複数のチームやプロジェクトで 1 つの Kubernetes クラスタを共有する際に役立ちます。1 つのクラスタ内のネームスペースの数に制限はありません。各ネームスペースは論理的に分離されますが、相互に通信できます。ネームスペースをネストすることはできません。
Kubernetes 内に存在するリソースは、default ネームスペース、またはクラスタの運用担当者が作成したネームスペースに存在します。ノードとパーシステント ストレージ ボリュームだけがネームスペース外に存在します。これらの低位リソースは、クラスタ内のすべてのネームスペースから常に認識できる状態になります。

Kubernetes の現状

Kubernetes Up and Running
Kubernetes の「default」ネームスペースとは
Kubernetes には、3 つのネームスペースがあらかじめ用意されています。次のとおりです。
- default:その名前のとおり、すべての Kubernetes コマンドがデフォルトで参照するネームスペースであり、すべての Kubernetes リソースがデフォルトで配置される場所です。新しいネームスペースが作成されるまで、クラスタ全体が「default」に存在します。
- kube-system:Kubernetes コンポーネント用のため、使用は避ける必要があります。
- kube-public:パブリック リソース用です。ユーザーによる使用は推奨されません。
Kubernetes ネームスペースのメリット
Kubernetes ネームスペースには、次のような多くのユースケースがあります。
- チームやプロジェクトごとに独自の仮想クラスタを使用できるため、互いの作業に影響を与えずに済む
- ユーザーやプロセスを特定のネームスペースに限定することで、ロールベースのアクセス コントロール(RBAC)を強化できる
- リソース クォータにより、クラスタのリソースをチーム間やユーザー間で分割できる
- コンテナ化されたアプリケーションの開発、テスト、デプロイの分離が容易になり、同じクラスタ上でライフサイクル全体に対応できる
複数の Kubernetes ネームスペースが必要になる場合
小規模なチームや組織では、default ネームスペースだけで十分かもしれません。開発者やユーザーを互いに分離する必要がない場合は特にそう言えるでしょう。ただし、複数のネームスペースを使用すると、次のような多くの有益なメリットが得られます。
- 分離:大規模なチームや拡大中のチームでは、複数のネームスペースを使用して、プロジェクトやマイクロサービスを互いに分離できます。ワークスペースが異なれば、同じリソース名を再利用しても問題ありません。また、あるワークスペースのアイテムに対してアクションを実行しても、その他のワークスペースにはまったく影響しません。
- 組織:開発、テスト、本番用に単一のクラスタを使用する組織では、複数のネームスペースを使用して開発環境とテスト環境をサンドボックス化できます。これにより、アプリケーションのライフサイクル全体を通して、開発者やテスト担当者がそれぞれのネームスペースで行った変更から、本番環境のコードを保護できます。
- 権限:ネームスペースによって Kubernetes RBAC を使用できるようになるため、権限や能力のセットを単一の名前でグループ化するロールを定義できます。これにより、指定したネームスペースのリソースへのアクセスを、認可されたユーザーだけに限定できます。
- リソース制御:CPU やメモリの使用率に関するリソース クォータを定義して、ポリシーベースのリソース制限をネームスペースに設定できます。これにより、すべてのプロジェクトまたはネームスペースで実行に必要なリソースを確保し、1 つのネームスペースが利用可能なすべてのリソースを占有するような状態を防止できます。
- パフォーマンス:ネームスペースを使用すると、特定のクラスタのパフォーマンスを向上させることができます。1 つのクラスタが複数のプロジェクトに対応して複数のネームスペースに分かれている場合、Kubernetes API で操作を実行する際に検索するアイテムが少なくなります。これにより、そのクラスタで実行されている各アプリケーションについて、遅延が低減し、アプリケーション全体のパフォーマンスが高速化します。
Kubernetes ネームスペース間でポッドが通信する方法
ネームスペースは互いに独立していますが、簡単に互いに通信できます。Kubernetes DNS サービス ディレクトリでは、次のような DNS アドレス指定の拡張形式を使用して、目的のサービスをその名前で簡単に見つけることができます。
..svc.cluster.local
サービス名にネームスペース名を付加するだけで、クラスタ上の任意のネームスペースに含まれるサービスにアクセスできます。たとえば、development ネームスペースの payroll サービスにアクセスするには、次のアドレスを使用します。
payroll.development
production ネームスペースの payroll サービスにアクセスするには、次を使用します。
payroll.production
必要に応じ、ネットワーク ポリシーを利用してネームスペース間のアクセスを制御できます。たとえば、ネットワーク ポリシーで、ほかのネームスペースからのすべてのトラフィックを許可または拒否できます。ネットワーク ポリシーは接続にのみ適用され、パケット検査を実行するファイアウォールの代わりにはなりません。
ネームスペースに関連する基本的な kubectl コマンド
現在の Kubernetes ネームスペースを検索するコマンド
クラスタ内のすべてのネームスペースを表示するには、次のコマンドを使用します。
kubectl get namespace
このコマンドを実行すると、default ネームスペースを含むクラスタ内のすべてのネームスペースのリストに加えて、そのステータスと経過時間が返されます。
新しい Kubernetes ネームスペースを作成するコマンド
ネームスペースは、次のコマンドで簡単に作成できます。
kubectl create namespace
その他の Kubernetes リソースと同様に、YAML ファイルを作成して適用し、ネームスペースを作成することもできます。
newspace.yaml:
kind: Namespace
apiVersion: v1
metadata:
name: newspace
labels:
name: newspacekubectl apply -f newspace.yaml
Kubernetes ネームスペースを切り替える方法
ネームスペースを作成後に指定するには、-namepsace= オプションをコマンドに含める必要があります。これは手間がかかるため、簡単な方法として、kubectl config コマンドでクラスタのコンテキストに目的のネームスペースを設定することにより、default ネームスペースを変更できます。
たとえば、default ネームスペースから「testing」という名前のネームスペースに変更するには、次のように入力します。
kubectl config set-context --current --namespace=testing
これにより、それ以降のすべての kubectl コマンドでデフォルトのネームスペースが「testing」に設定されます。
Kubernetes ネームスペースの名前を変更する方法
Kubernetes ネームスペースの名前を変更するのは標準的な方法ではないため、(default 以外の)ネームスペースは慎重に選択してください。
Kubernetes ネームスペースを削除する方法
ネームスペースを削除するには、次のコマンドを使用します。
kubectl delete namespaces
削除は非同期処理であるため、ネームスペースが削除されるまでは「Terminating」と表示されます。
Kubernetes ネームスペースの削除に関する注意事項
ネームスペースの削除は、元に戻すことができない操作です。すべてのサービス、実行中のポッド、アーティファクトなど、そのネームスペースに含まれるすべての要素が削除されます。そのネームスペース内に存在していた要素に対して、ガベージ コレクションが実行されます。この操作を行う前に、ネームスペース内に必要なものが含まれていないことを確認してください。
関連するソリューションおよび製品
ラボ:アプリケーションのモダナイゼーション
既存のアプリケーションを数週間でクラウドに移行
Tanzu for Kubernetes Operations
最新のマルチクラウド コンテナ インフラストラクチャの基盤
Tanzu Application Platform
Kubernetes 環境でマルチクラウド対応の優れた開発者体験を提供