マルチテナントの Container Service for Kubernetes (ACK) クラスターでは、複数のチームが同じクラスターを共有するため、リソースが際限なく消費されてしまう可能性があります。名前空間を利用することで、クラスターリソースを分離されたグループに分割し、チームや環境ごとにクォータの適用、権限の管理、コストの追跡が可能になります。
名前空間
ACK クラスターでは、名前空間によってクラスターリソースが分離されたグループに分割されます。複数のチームがクラスターを共有する場合、名前空間を作成してチームや環境ごとにリソースを分類し、リソースクォータを使用して各名前空間が消費できるリソースを制限します。
デフォルトでは、実行中の状態にある Pod は、ノード上の CPU およびメモリリソースを無制限に消費できます。単一の名前空間内の Pod が、クラスター全体のリソースを使い果たす可能性があります。これを防ぐために、名前空間ごとに CPU、メモリ、Pod 数などのリソースクォータを設定します。
割り当て例:RAM が 32 GiB、CPU コアが 16 個のクラスターで、チーム A に 20 GiB と 10 コア、チーム B に 10 GiB と 4 コアを割り当て、2 GiB と 2 コアを予備として確保します。あるいは、testing 名前空間に 1 コアと 1 GiB の RAM を割り当て、production 名前空間に残りのリソースを使用させることもできます。
名前空間の作成
ACK コンソール経由での設定
kubectl を使用
名前空間を作成します。
kubectl create namespace test名前空間が作成されたことを確認します。
kubectl get namespaces期待される出力:
NAME STATUS AGE default Active 46h kube-node-lease Active 46h kube-public Active 46h kube-system Active 46h test Active 9s名前空間
testがリスト内でアクティブな状態になっていることがわかります。
リソースクォータと使用制限の設定
名前空間に CPU とメモリのクォータを設定すると、その名前空間で作成されるすべての Pod で CPU とメモリの使用制限を指定する必要があります。Pod の作成失敗を避けるために、名前空間内のコンテナのデフォルトリソース制限を設定してください。
ACK コンソール経由での設定
[名前空間] ページで、管理する名前空間の [操作] 列にある [リソースクォータと使用制限] をクリックします。
[リソースクォータと使用制限] ダイアログボックスで、リソースクォータとデフォルトのリソース制限を設定します。設定の詳細については、リソースクォータおよび名前空間のデフォルトのメモリリクエストと制限の設定をご参照ください。
クォータ変更のベストプラクティス
ベストプラクティス:クォータの変更は、オフピーク時に行ってください。変更を加える前に、既存のワークロードのリソース使用量を確認してください。
Horizontal Pod Autoscaler (HPA) の自動スケーリングのために十分なリソースを確保します。
クォータを調整した後、少なくとも 30 分間クラスターを監視し、HPA が期待どおりに実行されることを確認します。
名前空間の削除
組み込みの名前空間 (default、kube-system、kube-public、kube-node-lease) は削除できません。名前空間を削除する前に、その中のすべてのリソースをクリアしてください。名前空間が長時間 Terminating ステータスのままである場合は、「名前空間が Terminating ステータスでスタックした場合の対処法」をご参照ください。
ACK コンソールを使用
[名前空間] ページで、削除する名前空間を見つけ、[操作] 列の
> [削除] をクリックします。 まず削除保護を無効にするには、[操作] 列の
> [削除保護の無効化] をクリックします。[確認] ダイアログボックスで、名前空間内の関連リソースを確認し、[削除の確認] をクリックします。
kubectl を使用
kubectl delete namespace testよくある質問
名前空間が Terminating ステータスでスタックした場合の対処法
リソースがまだ残っている名前空間を削除しようとすると、削除プロセスが Terminating ステータスのまま無期限に停止することがあります。この問題を解決するには、名前空間の spec にある finalizers 配列をクリアします。これにより、Kubernetes が自動的に名前空間を削除します。ただし、この操作を行うとクラスター内に孤立したリソースが残る可能性があるため、実行する前に名前空間内のワークロードをクリーンアップしてください。
以下の手順に従って、名前空間を強制的に削除します (例として istio-system 名前空間を使用します):
ターミナルを開き、クラスターのリバースプロキシを起動します。
kubectl proxy期待される出力:
Starting to serve on 127.0.0.1:80012つ目のターミナルを開きます。トークンをエクスポートし、API サーバーへの接続性を確認します。
export TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t') curl http://localhost:8001/api/v1/namespaces --header "Authorization: Bearer $TOKEN" --insecure名前空間の設定を JSON ファイルにエクスポートします。
kubectl get namespace istio-system -o json > istio-system.jsonistio-system.jsonを開き、specセクションのfinalizers配列をクリアします。"spec": { "finalizers": [] }更新された設定を適用して finalizer を削除します。
curl -X PUT --data-binary @istio-system.json http://localhost:8001/api/v1/namespaces/istio-system/finalize -H "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --insecure
次のステップ
クラウドサービスとクラスターの設定制限、個々のクラスターのキャパシティ制限、クラスタークォータ、および依存するクラウドサービスのクォータについては、「クォータと制限」をご参照ください。
特定の API オブジェクトタイプに対するクォータ設定については、「API オブジェクトのクォータ設定」をご参照ください。
クラスターまたは名前空間に対して、RAM ユーザー、RAM ロール、およびロールベースアクセス制御 (RBAC) を使用した詳細な権限管理を実装するには、RAM を使用してクラスターおよびクラウドリソースへのアクセスを承認するおよびRBAC を使用してクラスター内のリソースに対する操作権限を管理するをご参照ください。