OpenShift 4 に ClusterLogging Operator (Elasticsearch, Fluentd, Kibana, Curator) をデプロイする

# 本稿概要

前回、[OpenShift 4 を AWS にインストール](https://qiita.com/SightSeekerTw/items/a1f6a3aaf8d00b4e8c08) しましたが、今回は、インストール時にはデプロイされていなかった OpenShift のログ集約基盤となる ClusterLogging をインストールしてみます。

OpenShift には元来、コンテナのログを収集,参照する機能として、Elasticsearch, Fluetnd, Kibana をデプロイして運用するのがセオリーでした。
OpenShift 3 では Ansible によるインストールプランが提供されていましたが、OpenShift 4.1 では **ClusterLogging** という Operator によるインストールプランに変更になったため、手順をメモ代わりに残しておきます。


# ClusterLogging Operator 概要

ClsuterLogging Operator は大まかには以下のオブジェクトを **よしなに** 生成してくれます。

- **Curator** の CronJob, ConfigMap
- **Fluentd** の DaemonSet, Secret, ConfigMap, Service
- **Kibana** の Deployment, Secret, Service, Route
- **Elasticsearch** の Secret
- **Elasticsearch Operator** の Custom Resource Object (Elasticsearch)

※ Elasticsearch Operator は Service や Deployment, ConfigMap などを生成してくれます

などと書きましたが、Operator はそれでもう一つのアプリケーションパッケージのようなものですし、特に知らなくてもインストールできます。
インストールに問題が起こったときも、各種Podの起動でどんな問題が発生しているのかウォッチして対処していく程度で良いのではないかとも思います。


# 手順概要

* Elasticsearch Operator 用の Project (Namespace) を作成
* Elasticsearch Operator 用に OperatorGroup を作成
* Elasticsearch Operator を使えるようにするための CatalogSourceConfig を作成
* Prometheus によるモニタリング用に Role と RoleBindings を作成
* ClusterLogging がデプロイされるProject (Namespace) を作成
* Web Console から ClusterLogging Operator を Install
* Web Console から ClusterLogging Operator の Subscription を作成
* ClusterLogging オブジェクトを作成

あとは、ClusterLogging Operator が全部やってくれて、しばらくすると、 Kibana から、 Fluentd が収集して、Elasticsearch に集約されたコンテナのログが参照、検索できるようになっているかと思います。

# 手順詳細

## 事前準備

作る K8sリソースオブジェクトのマニフェストだけ先に書いて置いちゃいます。
内容は [公式ドキュメント](https://docs.openshift.com/container-platform/4.1/logging/efk-logging-deploying.html) と同じです。

```yaml:eo-project.yaml(Elasticsearch,ClusterLoggingOperator用のNamespace)
apiVersion: v1
kind: Namespace
metadata:
  # Namespace 名は固定で、これ以外にすることができないようです
  name: openshift-operators-redhat
  annotations:
    openshift.io/node-selector: ""
  labels:
    openshift.io/cluster-logging: "true"
    openshift.io/cluster-monitoring: "true"
---
apiVersion: v1
kind: Namespace
metadata:
  name: openshift-logging
  annotations:
    openshift.io/node-selector: ""
  labels:
    openshift.io/cluster-logging: "true"
    openshift.io/cluster-monitoring: "true"
```

```yaml:eo-og.yaml(ElasticsearchOperator用のOperatorGroup)
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  # 名前を変えられるのかは調べてないですが、このままのほうが後々良さそう
  name: openshift-operators-redhat
  # ここは固定で変更できないようです
  namespace: openshift-operators-redhat
spec: {}
```

```yaml:eo-csc.yaml(ElasticsearchOperatorを有効化するCatalogSourceConfig)
apiVersion: "operators.coreos.com/v1"
kind: "CatalogSourceConfig"
metadata:
  name: "elasticsearch"
  namespace: "openshift-marketplace"
spec:
  targetNamespace: "openshift-operators-redhat"
  packages: "elasticsearch-operator"
```

```yaml:eo-rbac.yaml(RoleとRoleBindings)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: prometheus-k8s
  namespace: openshift-operators-redhat
rules:
- apiGroups:
  - ""
  resources:
  - services
  - endpoints
  - pods
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: prometheus-k8s
  namespace: openshift-operators-redhat
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: prometheus-k8s
subjects:
- kind: ServiceAccount
  name: prometheus-k8s
namespace: openshift-operators-redhat
```

```yaml:clusterlogging.yaml(ClusterLoggingOperatorのCustomResource)
apiVersion: "logging.openshift.io/v1"
kind: "ClusterLogging"
metadata:
  name: "instance"
  namespace: openshift-logging
spec:
  managementState: "Managed"
  logStore:
    type: "elasticsearch"
    elasticsearch:
      nodeCount: 2
      resources:
        limits:
          memory: 2Gi
        requests:
          cpu: 200m
          memory: 2Gi
      storage:
        storageClassName: "gp2"
        size: "200G"
      redundancyPolicy: "SingleRedundancy"
  visualization:
    type: "kibana"
    kibana:
      resources:
        limits:
          memory: 1Gi
        requests:
          cpu: 500m
          memory: 1Gi
      proxy:
        resources:
          limits:
            memory: 100Mi
          requests:
            cpu: 100m
            memory: 100Mi
      replicas: 2
  curation:
    type: "curator"
    curator:
      resources:
        limits:
          memory: 200Mi
        requests:
          cpu: 200m
          memory: 200Mi
      schedule: "*/10 * * * *"
  collection:
    logs:
      type: "fluentd"
      fluentd:
        resources:
          limits:
            memory: 1Gi
          requests:
            cpu: 200m
            memory: 1Gi
```

## インストール

### 作成したマニフェスト (clusterlogging.yaml以外) をデプロイ

```bash
oc apply -f eo-project.yaml
oc apply -f eo-og.yaml
oc apply -f eo-csc.yaml
oc apply -f eo-rbac.yaml
```

### ClusterLogging Operator をインストール

OpenShift の Web Console での操作になります

Catalog -> OperatorHub から **Cluster Logging** を選択
(OpenShift Logging を選んだ状態でにしとく)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/4d3234c3-da3d-2205-7ce7-68cd7470ab53.png)

**Install** を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/41e021a8-7a59-e76a-c5a0-8ae88ce6d33e.png)

**Subscribe** を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/f381244c-3f95-f580-9803-fd261f4da59b.png)

数十秒すると、**Installed Operators** に **Cluster Logging** が **Install Succeeded** になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/8d52006a-a12f-c686-833b-4450bccf1819.png)

**Create New** を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/c774db7b-c2e7-1e17-36b9-83932460342d.png)

**clusterlogging.yaml** の内容をコピペして、**Create** を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/00e017c5-c6db-b136-6979-3111d64eb652.png)


すべてのPodが上がってくるまで少し時間がかかりますが、

https://kibana-openshift-logging.apps.YOURCLUSTERNAME.YOURDOMAIN/ にアクセスすると、Kibanaにアクセスでき、そこから Elasticsearch にストアされたログが見ることができるようになっているはずです。


# 気になる点

**Cluster Logging Operator** の Subscribe と同様に、 **Elasticsearch Operator** についてもやらないとだめなんじゃないかと思いますが、公式ドキュメントには書いてない気がします。
Installed になることを確認するとは書いてあるのですが、Elasticsearch Operator を Subscribe するだけでは、Elasticsearch Operator は Subscribe されませんでした... (手順ミスった？)

# 参考資料

* [About cluster logging and OpenShift Container Platform](https://docs.openshift.com/container-platform/4.1/logging/efk-logging.html)