Kubernetes基礎(8)：Namespace, ResourceQuota, LimitRange

<img width="1158" alt="スクリーンショット 2020-07-03 10.20.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/55aa839f-bb31-96ba-9563-0774965efe98.png">
**[Cluster構成]**
上の図のようにClusterの中には一般的なメモリやCPUなどのリソースがある。
Clusterの中にはNamespace及びNamespaceの中に複数のPodを作ることもできる。
各Podは必要なリソースをクラスタのリソースを共有して使う。

**[ResourceQuotaを使う理由]**
ResourceQuotaを設定してない状況で上の図の右側のPodのように1つのNamespace中のPodがCluster内の残りの全てのリソースを使ってしまうと、他のPodは使えるリソースがなくなってリソースが必要なときに問題が発生する。
このような問題を解決するのがResourceQuotaです。
ResourceQuotaを設定するとNamespaceが使える最大のリソース制限を設定することができる。
1つのPodでリソースが不足して問題になっても他のPodには影響を及ぼさない。

**[LimitRangeを使う理由]**
1つのPodがNamespaceで使える最大のリソースを使っている場合、他のPodをそのNamespace中に設定することができなくなる。このような問題を管理するためにLimitRangeを使えばNamespaceに入ってくるPodのサイズを制限することができる。

**簡単に予約すると**
ResourceQuotaはNamespaceに対してリソース制限をかける。
LimitRangeはPodに対してリソース制限をかける。
※ResourceQuota、LimitRangeはClusterにも設定ができ、全体のリソースの制限をかけることもできる。
###1. Namespace
![How to use Namespace for Kubernetes.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/1f0a16fd-2ec7-0d5a-b0de-e9ad30da5ab0.jpeg)
1-1) Namespace
*Namespaceを作成するときは名前以外に特に指定する項目はない*

```Yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nm-1
```
1-2) Pod

```Yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: nm-1
  labels:
    app: pod
spec:
  containers:
  - name: container
    image: <image file name>
    ports:
    - containerPort: 8080
```
1-3) Service

```Yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-1
  namespace: nm-1
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
```
*PodやServiceを作成するときにnamespaceキーに指定することで簡単に設定ができる*

上記の図の×の1-2PodのようにNamespace中には同じタイプのオブジェクトは作成できない。
（例：Podの名前が同じPodは作れない）
ObjectごとにUUIDが存在するがNamespaceの中では同じタイプのオブジェクトであれば名前もUUIDのようにキーになる。
Namespaceの特徴はNamespaceのリソースは他のNamespaceのリソースとは完全に分離して管理されていることだ。
上記の図のようにNamespace1のServiceでselectorにNamespace2のPod1のlabelを設定してもNamespaceが違うので繋げることができない。
殆どのリソースは、Namespaceの中だけで使えるが、[PersistentVolume](https://qiita.com/umkyungil/items/218be95f7a1f8d881415)と[Node](https://qiita.com/umkyungil/items/2a8c9b0afb672bf3a6d2)は、すべてのNamespaceで供用で使えるObjectである。
Namespaceを削除すると、その中のすべてのリソースも削除されるので気をつかないといけない。
###2. ResourceQuota
![How to use ResourceQuota for Kubernetes.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/eabd2be2-7b6c-f04b-a818-c3289fbb06e1.jpeg)
2-1) Namespace

```Yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nm-3
```
2-2) ResourceQuota

```Yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: rq-1
  namespace: nm-3
spec:
  hard:
    requests.memory: 1Gi
    limits.memory: 1Gi
```
nm-3名前のNamespaceのResourceQuota詳細照会
ResourceQuota Check Command：kubectl describe resourcequotas --namespace=nm-3

2-3) Pod

```Yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-2
spec:
  containers:
  - name: container
    image: <image file name>
```
2-4) Pod

```Yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
  containers:
  - name: container
    image: <image file name>
    resources:
      requests:
        memory: 0.5Gi
      limits:
        memory: 0.5Gi
```
Namespaceのリソース制限を設定するObjectである。
上の図の2-2はNamespaceに設定するPodの全requestのメモリを最大1Gに設定してlimitは1Gに設定している。
ResourceQuotaが設定されているNamespaceでPodを作成する場合はSpec（requests、limits）を指定しなければならない。(図2-3)
Specがない場合はNamespaceが作れない。
例えばrequestのメモリリソースを3Gに設定した場合は1つのPodがメモリリソースを2G使っていて、他のPodが同じく2Gを設定することはできない。(図 2-4, 2-4')

メモリだけでなく、cpu、storageも制限することができる。
Objectの数も制限できますが、すべてのオブジェクトを制限できるということではない。
###3. LimitRange
![How to use LimitRange1 for Kubernetes.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/db419cc9-8915-f84f-f4ed-a237f53faf81.jpeg)
3-1) Namespace

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nm-5
```
3-2) LimitRange

```yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: lr-1
spec:
  limits:
  - type: Container
    min:
      memory: 0.1Gi
    max:
      memory: 0.4Gi
    maxLimitRequestRatio:
      memory: 3
    defaultRequest:
      memory: 0.1Gi
    default:
      memory: 0.2Gi
```
nm-5名前のNamespaceのLimitRange詳細照会
LimitRange Check Command：kubectl describe limitranges --namespace=nm-5

3-3) Pod

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container
    image: <image file name>
    resources:
      requests:
        memory: 0.1Gi
      limits:
        memory: 0.5Gi
```
PodをNamespaceに設定できるかリソースのチェックを行う。
図3-2のチェック項目を説明すると
・min:memory: 0.1Gi（Podに設定するメモリのlimit値が0.1Gが以上）
・max:memory: 0.4Gi（0.4G以下）
・maxLimitRequestRatio:memory: 3（requestsとlimitsの値の比率が最大3倍以下）
※defaultRequestはrequestの値でdefaultは、limitの値に設定されている

3-3の場合は、requestとlimitの割合が3倍を超えているのでNamespaceに設定できない。
3-2のようにdefaultRequestとdefaultが設定されていれば3-3'のPodのように何も設定しなくてもNamespaceに設定ができる。
#Referenece
Share a Cluster with Namespaces : https://kubernetes.io/docs/tasks/administer-cluster/namespaces/
Resource Quotas : https://kubernetes.io/docs/concepts/policy/resource-quotas/
Limit Ranges : https://kubernetes.io/docs/concepts/policy/limit-range/