OpenShift Cluster Logging が要求しているリソース量を調べる

# はじめに
個人的な実験メモで、他の方が読む事を想定してはおらず、読みやすいものではないのでご了承頂ければ幸いです。

# 環境確認

記録用に環境の情報を取得する。

## 各 Node の情報 (OpenShift 4.8.26) 

```
[root@bastion openshift]# oc version
Client Version: 4.8.26
Server Version: 4.8.26
Kubernetes Version: v1.21.6+bb8d50a
[root@bastion openshift]#
[root@bastion openshift]# oc get nodes
NAME                          STATUS   ROLES          AGE     VERSION
ocp48-6vldl-infra-94vjm       Ready    infra,worker   11d     v1.21.6+bb8d50a
ocp48-6vldl-infra-gjgwb       Ready    infra,worker   11d     v1.21.6+bb8d50a
ocp48-6vldl-infra-ocs-dbjbd   Ready    infra,worker   4d12h   v1.21.6+bb8d50a
ocp48-6vldl-infra-ocs-rdt8b   Ready    infra,worker   4d12h   v1.21.6+bb8d50a
ocp48-6vldl-infra-ocs-xdhvn   Ready    infra,worker   4d12h   v1.21.6+bb8d50a
ocp48-6vldl-infra-qvwvk       Ready    infra,worker   11d     v1.21.6+bb8d50a
ocp48-6vldl-master-0          Ready    master         16d     v1.21.6+bb8d50a
ocp48-6vldl-master-1          Ready    master         16d     v1.21.6+bb8d50a
ocp48-6vldl-master-2          Ready    master         16d     v1.21.6+bb8d50a
ocp48-6vldl-worker-85crs      Ready    worker         16d     v1.21.6+bb8d50a
ocp48-6vldl-worker-hdj9r      Ready    worker         16d     v1.21.6+bb8d50a
ocp48-6vldl-worker-xp4bf      Ready    worker         16d     v1.21.6+bb8d50a
[root@bastion openshift]# 
```

* Master Node x 3
* Worker Node x 3
* Infra Node x 6
合計 12本の Node で構成されたクラスター。環境は VMware。

## OpenShift Cluster Logging の バージョンの確認

2種類の Operator の組み合わせとして提供される。それぞれバージョンが付けられている。

```
[root@bastion openshift]# oc get csv
NAME                              DISPLAY                            VERSION    REPLACES   PHASE
cluster-logging.5.3.5-20          Red Hat OpenShift Logging          5.3.5-20              Succeeded
elasticsearch-operator.5.3.5-20   OpenShift Elasticsearch Operator   5.3.5-20              Succeeded
[root@bastion openshift]# 
```
`OpenShift Logging` の Opearator のバージョンは、`5.3.5-20`
`Cluster Logging` Operator と、`Elastic Search` Operator で構成される。

これらは通常、OpenShift コンソールの `Operator Hub`から導入する。(コマンドラインからも導入できるはず）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/65b6c117-c91d-ebe5-938f-9bfdf542b54f.png)


## openshift-logging namespace の Pod のデプロイ状況

`nodeSelector` と `taint` 等を使って　infra ノードに配置

```
[root@bastion openshift]# oc get pods -o wide
NAME                                            READY   STATUS      RESTARTS   AGE     IP             NODE                          NOMINATED NODE   READINESS GATES 
cluster-logging-operator-6df7db84bb-rg868       1/1     Running     0          11d     10.128.4.25    ocp48-6vldl-infra-gjgwb       <none>           <none>
collector-5jzxh                                 2/2     Running     0          47h     10.130.4.67    ocp48-6vldl-infra-ocs-xdhvn   <none>           <none>
collector-7bf6t                                 2/2     Running     0          47h     10.130.0.45    ocp48-6vldl-master-0          <none>           <none>
collector-7kmfv                                 2/2     Running     0          47h     10.129.2.9     ocp48-6vldl-worker-85crs      <none>           <none>
collector-9njjr                                 2/2     Running     0          47h     10.129.4.12    ocp48-6vldl-infra-ocs-rdt8b   <none>           <none>
collector-9z77f                                 2/2     Running     0          47h     10.131.2.10    ocp48-6vldl-infra-94vjm       <none>           <none>
collector-b7hjd                                 2/2     Running     0          47h     10.128.2.10    ocp48-6vldl-worker-hdj9r      <none>           <none>
collector-cctmt                                 2/2     Running     0          47h     10.131.4.67    ocp48-6vldl-infra-ocs-dbjbd   <none>           <none>
collector-j7pb9                                 2/2     Running     0          47h     10.131.0.8     ocp48-6vldl-worker-xp4bf      <none>           <none>
collector-mz9ql                                 2/2     Running     0          47h     10.130.2.10    ocp48-6vldl-infra-qvwvk       <none>           <none>
collector-pd4g4                                 2/2     Running     0          47h     10.128.4.132   ocp48-6vldl-infra-gjgwb       <none>           <none>
collector-srbdx                                 2/2     Running     0          47h     10.129.0.47    ocp48-6vldl-master-2          <none>           <none>
collector-wl6ng                                 2/2     Running     0          47h     10.128.0.46    ocp48-6vldl-master-1          <none>           <none>
elasticsearch-cdm-gjm8weln-1-7fc97cc94-b7qr6    2/2     Running     0          19h     10.131.4.8     ocp48-6vldl-infra-ocs-dbjbd   <none>           <none>
elasticsearch-cdm-gjm8weln-2-75787bdc7f-thh2f   2/2     Running     0          19h     10.129.4.11    ocp48-6vldl-infra-ocs-rdt8b   <none>           <none>
elasticsearch-cdm-gjm8weln-3-6478496ddd-tp78x   2/2     Running     0          19h     10.130.4.8     ocp48-6vldl-infra-ocs-xdhvn   <none>           <none>
elasticsearch-im-app-27476700-lk5s4             0/1     Completed   0          3m34s   10.128.4.209   ocp48-6vldl-infra-gjgwb       <none>           <none>
elasticsearch-im-audit-27476700-qnbzd           0/1     Completed   0          3m34s   10.128.4.208   ocp48-6vldl-infra-gjgwb       <none>           <none>
elasticsearch-im-infra-27476700-hckww           0/1     Completed   0          3m34s   10.128.4.210   ocp48-6vldl-infra-gjgwb       <none>           <none>
kibana-6f894f5bc4-7zkc4                         2/2     Running     0          19h     10.128.4.92    ocp48-6vldl-infra-gjgwb       <none>           <none>
[root@bastion openshift]#
```

**環境認識**
* 各 Node毎に `collector` が Deploy されている。Master 含めた Node が12本あるので合計 12 の collector
* `elasticsearch-cdm-xxxx` の `Pod` は、デフォルト設定を使ったので、冗長化のため 3つデプロイされている。
* `kibana` の `Pod` もデフォルト設定をそのまま使ったので 1つデプロイされている。
* `cluster-logging-operator-xxxx` は、1つだけ depoy されている。
* `elasticsearch-im-app/audit/infra-xxx` は、ジョブぽい (後で調べる)

## ClusterLogging 設定用の Custom Resource

Cluster Logging Operator を Deploy した後、実際の Pod 群を生成するために `ClusterLogging` という CRD の Customer Resource を作成する必要がある。デフォルトで `instance` という名前がセットされたテンプレートが用意されているのでそれを改造する。

replica 数などはデフォルトを使用。`nodeSelector` や `toleration` は `infrastructure Node` に配置するために追加。

<details><summary> ClusterLogging 設定用の Custom Resource</summary>

```yaml
[root@bastion openshift]# oc get ClusterLogging instance -o yaml
apiVersion: logging.openshift.io/v1
kind: ClusterLogging
metadata:
  creationTimestamp: "2022-03-28T01:09:18Z"
  generation: 3
  name: instance
  namespace: openshift-logging
  resourceVersion: "11292909"
  uid: a7735abe-3541-4b70-bf88-5bda1f8dfab7
spec:
  collection:
    logs:
      fluentd: {}
      type: fluentd
  logStore:
    elasticsearch:
      nodeCount: 3
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      redundancyPolicy: SingleRedundancy
      storage:
        size: 200G
        storageClassName: thin
      tolerations:
      - effect: NoSchedule
        key: infra
        value: reserved
      - effect: NoExecute
        key: infra
        value: reserved
    retentionPolicy:
      application:
        maxAge: 7d
    type: elasticsearch
  managementState: Managed
  visualization:
    kibana:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      replicas: 1
      tolerations:
      - effect: NoSchedule
        key: infra
        value: reserved
      - effect: NoExecute
        key: infra
        value: reserved
    type: kibana
status:
  <略>
[root@bastion openshift]#
```

</details>

# 主要 Pod の Request / Limit 調査

Pod 毎に egrep で、Requests/Limits 周辺の値を抜いていく

```
[root@bastion openshift]#  oc describe pod cluster-logging-operator-6df7db84bb-rg868  | egrep 'Limits|Requests' -A3
[root@bastion openshift]#
[root@bastion openshift]# oc describe pod elasticsearch-cdm-gjm8weln-1-7fc97cc94-b7qr6 | egrep 'Limits|Requests' -A3
    Limits:
      memory:  16Gi
    Requests:
      cpu:      1
      memory:   16Gi
    Readiness:  exec [/usr/share/elasticsearch/probe/readiness.sh] delay=10s timeout=30s period=5s #success=1 #failure=3
--
    Limits:
      memory:  256Mi
    Requests:
      cpu:     100m
      memory:  256Mi
    Environment:
[root@bastion openshift]#  oc describe pod collector-5jzxh | egrep 'Limits|Requests' -A3
    Limits:
      memory:  736Mi
    Requests:
      cpu:     100m
      memory:  736Mi
    Environment:
[root@bastion openshift]#
[root@bastion openshift]#  oc describe pod kibana-6f894f5bc4-7zkc4 | egrep 'Limits|Requests' -A3
    Limits:
      memory:  736Mi
    Requests:
      cpu:      100m
      memory:   736Mi
    Readiness:  exec [/usr/share/kibana/probe/readiness.sh] delay=5s timeout=4s period=5s #success=1 #failure=3
--
    Limits:
      memory:  256Mi
    Requests:
      cpu:     100m
      memory:  256Mi
    Environment:
[root@bastion openshift]# 
```

**上記のコマンドの結果のまとめ**
空白部分は特に指定が無かった事を表す。

|Pod 名                       | container名  |CPU (Limits) |CPU (Requests) | Memory (Limits) | Memory (Requests) |
|-----------------------------|-------------|------------|----------------|-----------------|-------------------|
|**Operator(controller)**       |             |            |                |                 |                   |
|cluster-logging-operator-xxxx|             |            |                |                 |                   |
|**ElasticSearch**            |             |            |                |                 |                   | 
|elasticsearch-cdm-xxxx       |elasticsearch|            |        1       |         16Gi    |      16Gi         | 
|                             |proxy        |            |      100m     |          256Mi    |      256Mi        | 
|**collector**                |             |            |                |                 |                   | 
|collector-xxxx               |             |            |      100m     |         736Mi    |      736Mi        | 
|**kibana**                   |             |            |                |                 |                   | 
|kibana-xxxx                  |kibana       |            |      100m      |         736Mi   |      736Mi        | 
|                            |kibana-proxy |            |      100m      |         256Mi   |      256Mi        | 

Pod内のcontainer 名は、別コマンドで確認して別途補則


後で、`jsonpath` で、`Pod` 内の `container` 毎の `limits`/`requests` の取り方を考えたが時すでに遅し。

```
[root@bastion openshift]# oc get pod elasticsearch-cdm-gjm8weln-1-7fc97cc94-b7qr6 -o=jsonpath='{range .spec.containers[*]} {.name}{"\t"}{.resources}{"\n"}'
 elasticsearch  {"limits":{"memory":"16Gi"},"requests":{"cpu":"1","memory":"16Gi"}}
 proxy  {"limits":{"memory":"256Mi"},"requests":{"cpu":"100m","memory":"256Mi"}}

[root@bastion openshift]# 
```

## 実際のリソース消費量

OpenShift を単純インストール後、ほぼ素の状態でのリソース使用量。

```
[root@bastion openshift]# kubectl top pods -n openshift-logging --use-protocol-buffers
NAME                                            CPU(cores)   MEMORY(bytes)   
cluster-logging-operator-6df7db84bb-rg868       1m           61Mi
collector-5jzxh                                 6m           363Mi
collector-7bf6t                                 18m          550Mi
collector-7kmfv                                 3m           327Mi
collector-9njjr                                 5m           354Mi
collector-9z77f                                 5m           409Mi
collector-b7hjd                                 4m           314Mi
collector-cctmt                                 5m           361Mi
collector-j7pb9                                 4m           339Mi
collector-mz9ql                                 10m          408Mi
collector-pd4g4                                 7m           406Mi
collector-srbdx                                 29m          611Mi
collector-wl6ng                                 17m          669Mi
elasticsearch-cdm-gjm8weln-1-7fc97cc94-b7qr6    365m         10129Mi
elasticsearch-cdm-gjm8weln-2-75787bdc7f-thh2f   376m         10079Mi
elasticsearch-cdm-gjm8weln-3-6478496ddd-tp78x   411m         10126Mi
kibana-6f894f5bc4-7zkc4                         2m           134Mi
[root@bastion openshift]# 
```

`elasticsearch-cdm-xxxx` の CPU / Memory 使用量がやはり多い。
`elasticsearch-cdm-xxxx` は、Memory の request は 16Gi だが、インストール直後では、10Gi 程度になっている。