記事ディレクトリ
名前空間
Kubernetes の名前空間は、クラスター内のリソースを整理および分離するためのメカニズムです。ネームスペースは、物理クラスターを複数の論理部分に分割する仮想クラスターとみなすことができ、各部分には独自のリソースのセット (ポッド、サービス、ConfigMap など) があります。
名前空間は、さまざまなユーザーによって作成されたリソースを分離するのに適しています
クラスター内のオブジェクト グループを分類、フィルタリング、管理するために使用されます。Kubernetes クラスターに追加されるすべてのワークロードは、名前空間に配置する必要があります。
異なるビジネス (Web、データベース、メッセージ センター) を異なる名前空間に展開してビジネスの分離を実現したり、リソース クォータを課して CPU やメモリなどのリソースの使用を制限したりできます。
名前空間の重要性
ネームスペースは、クラスター内のオブジェクト名にスコープを与えます。名前はネームスペース内で一意である必要がありますが、異なるネームスペースで同じ名前を使用できます。これは、一部のシナリオでは非常に役立ちます。たとえば、名前空間を使用してアプリケーションのライフサイクル環境 (開発、ステージング、運用環境など) を分割すると、各環境で同じオブジェクトのコピーを同じ名前で維持できます。
ネームスペースを使用すると、ユーザーはクラスターの特定の部分にポリシーを簡単に適用できます。ResourceQuota オブジェクトを定義することで、リソースの使用量を制御できます。これにより、名前空間ごとにリソースの使用量に制限が設定されます。同様に、Calico や Canal (ポリシーには Calico、ネットワークには Flannel) など、クラスター上でネットワーク ポリシーをサポートする CNI (コンテナ ネットワーク インターフェイス) を使用する場合も同様です。NetworkPolicy を名前空間に適用します。このルールにより、ポッドが相互に通信する方法が定義されます。名前空間が異なれば、ポリシーも異なる場合があります。
名前空間を使用する最大の利点の 1 つは、Kubernetes RBAC (ロールベースのアクセス制御) を利用できることです。RBAC を使用すると、単一の名前でロールを開発できるため、権限や機能のリストをグループ化できます。ClusterRole オブジェクトはクラスター スケールの使用パターンを定義するために使用され、ロール オブジェクト タイプは特定の名前空間に適用され、より詳細な制御と粒度が提供されます。ロールの作成後、RoleBinding は、単一の名前空間のコンテキスト内で、定義された機能を特定のユーザーまたはユーザー グループに付与できます。このように、名前空間を使用すると、クラスター オペレーターが同一のポリシーを組織化されたリソースのコレクションにマップできるようになります。
名前空間の使用シナリオ
- チームまたはプロジェクトへの名前空間のマッピング
チームに専用の名前空間を提供することで、RBAC ポリシーを使用して、自己管理と自動化のために特定の機能を委任できます。チームやプロジェクトのリソース割り当てを設定することも非常に便利です。これにより、組織のビジネス ニーズと優先順位に基づいてリソースに適切にアクセスできます。 - ネームスペースを使用してライフサイクル環境を分割する ネーム
スペースは、クラスター内の開発環境、ステージング環境、実稼働環境を分割するのに最適です。通常、最大限の分離を確保するために、実稼働ワークロードを完全に別個のクラスターにデプロイすることをお勧めします。 - 名前空間を使用してさまざまなコンシューマーを分離し、
コンシューマーに基づいてワークロードをセグメント化します。たとえば、クラスターが複数の顧客にインフラストラクチャを提供する場合、名前空間ごとにセグメント化することで、請求書の行き先を追跡しながら各顧客を管理できるようになります。
初期名前空間
Kubernetes は、起動時に 4 つの初期名前空間を作成します。
-
default
Kubernetes にはこの名前空間が含まれているため、新しい名前空間を作成せずに新しいクラスターの使用を開始できます。
-
kube-node-lease
この名前空間には、各ノードに関連付けるために使用されるLeaseオブジェクトが含まれています。ノードのリースにより、kubelet がハートビートを送信できるようになり、コントロール プレーンがノードの障害を検出できるようになります。
-
kube-public
すべてのクライアント (認証されていないクライアントを含む) は、この名前空間を読み取ることができます。この名前空間は主にクラスターで使用するために予約されているため、特定のリソースはクラスター全体で表示および読み取り可能である必要があります。この名前空間のパブリック属性は規則であり、要件ではありません。
-
kube-system
この名前空間は、Kubernetes システムによって作成されたオブジェクトに使用されます。
共通コマンド操作
1. すべての名前空間を表示する
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 7d6h
kube-node-lease Active 7d6h
kube-public Active 7d6h
kube-system Active 7d6h
quota-mem-cpu-example Active 47h
k8s の起動に付属する 4 つの初期名前空間が表示されます。
2. 名前空間の詳細を表示する
[root@k8s-master ~]# kubectl describe namespace kube-system
Name: kube-system
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
このコマンドは、名前空間のリソース クォータ オブジェクトを確認できます。
3. ネームスペースを作成する
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
名前空間の表示
[root@k8s-master ~]# kubectl get namespace
4. 特定の名前空間の下のポッドを表示する
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-6949477b58-m954m 1/1 Running 15 7d3h
calico-node-c55c9 1/1 Running 11 7d3h
calico-node-cxnbg 1/1 Running 9 7d3h
calico-node-pm4jp 1/1 Running 10 7d3h
coredns-7f89b7bc75-hl2tf 1/1 Running 9 7d6h
coredns-7f89b7bc75-wkf68 1/1 Running 10 7d6h
etcd-k8s-master 1/1 Running 11 7d6h
kube-apiserver-k8s-master 1/1 Running 14 7d6h
kube-controller-manager-k8s-master 1/1 Running 14 7d6h
kube-proxy-55krt 1/1 Running 11 7d6h
kube-proxy-5zjxj 1/1 Running 9 7d3h
kube-proxy-dnvgg 1/1 Running 10 7d3h
kube-scheduler-k8s-master 1/1 Running 11 7d6h
metrics-server-769f6c8464-wqwdd 1/1 Running 2 26h
注: -n 名前空間を指定しない場合、デフォルトの名前空間のポッドがデフォルトで表示されます。ポッドの作成時に名前空間を指定しない場合、ポッドはデフォルトの名前空間でのみ作成されます。
5. ネームスペースの削除
[root@k8s-master ~]# kubectl delete namespace mem-example
公式 Web サイトのケース: 名前空間を作成し、メモリと CPU クォータを構成し、名前空間を使用するポッドを作成します。
公式 Web サイトのドキュメントを参照してください: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/
1. ネームスペースを作成する
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
名前空間の表示
[root@k8s-master ~]# kubectl get namespace
2. リソース クォータ オブジェクトを作成し、このリソース オブジェクトに値を割り当てます。
[root@k8s-master ~]# vim quota-mem-cpu.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
- apiversion、apiserver バージョンを v1 であると宣言します。
- 種類、オブジェクト、リソース クォータ オブジェクトを作成します
- メタデータ、バージョンデータ、指定された名前
- ハードウェアの制限
- request.cpu: "1"、CPU を申請します
- limits.cpu: "2"、最大 2 つの CPU を使用できます
3. ネームスペースとリソース クォータ オブジェクトをバインドする
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
4. 名前空間に対応するリソースクォータオブジェクト情報を参照し、yamlファイル形式で出力します。
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
ResourceQuota は、quota-mem-cpu-example 名前空間に次の要件を設定します。
- 名前空間内の各ポッドのすべてのコンテナには、CPU リクエストと制限だけでなく、メモリ リクエストと制限も必要です。
- 名前空間内のすべての Pod の合計メモリ リクエストは 1 GiB を超えることはできません。
- 名前空間内のすべての Pod の合計メモリ制限は 2 GiB を超えることはできません。
- 名前空間内のすべてのポッドの合計 CPU リクエストは 1 CPU を超えることはできません。
- 名前空間内のすべてのポッドの合計 CPU 制限は 2 CPU を超えることはできません。
5.ポッドの作成
yamlファイルを編集する
[root@k8s-master ~]# vim quota-mem-cpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
ポッドの作成
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
指定された名前空間で作成されたポッドを表示する
[root@k8s-master ~]# kubectl get pod --namespace=quota-mem-cpu-example
NAME READY STATUS RESTARTS AGE
quota-mem-cpu-demo 1/1 Running 0 70s
6. ポッドを作成した後、リソース クォータ オブジェクトを再度表示します。
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
ポッドを作成した後、対応する CPU とメモリが使用されていることがわかりました。
7. 2 番目のポッドを作成してみる
yamlファイルを編集する
[root@k8s-master ~]# vim quota-mem-cpu-pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
ポッドの作成
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example
Error from server (Forbidden): error when creating "quota-mem-cpu-pod-2.yaml": pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: requests.memory=700Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi
マニフェストでは、Pod のメモリ要求が 700 MiB であることがわかります。新しいメモリ リクエストとすでに使用されているメモリ リクエストの合計がメモリ リクエスト クォータを超えていることに注意してください: 600 MiB + 700 MiB > 1 GiB
2 番目のポッドを正常に作成できません。出力は、2 番目の Pod を作成すると、合計メモリ リクエストがメモリ リクエスト クォータを超えることを示しています。