이 모든 환경은 openshift가 구축된 상태에서 진행합니다.
이번 환경은 openshift 4.14.0에서 Test 진행된 사항입니다.
MinIO Operator + Loki 적용 이유
- OpenShift Logging의 Log 저장소가 기존에는 Elasticsearch 기반이였으나. 추후에는 deprecated 및 removed 예정
- Elasticsearch의 고질적인 문제를 해결하기 위한 Loki 사용
- 과도한 로그 발생시 OOM 발생 등
- Fluentd 의 OOM 등..
- OpenShift의 Loki Stack의 경우 S3 Stroage가 필요함.
- 오픈소스의 경우 NFS Storage도 가능
MinIO 구축
1. MinIO Operator 설치
- OperatorHub의 Certified Operator중 Minio Operator 설치

2. MinIO Operator Console Expose
- 생성되는 console service 기반으로 Router 생성
- Router 생성시 TLS 사용하며 Passthrough/redirect 모드로 console svc의 9443 포트 사용


3. MinIO kubectl plugin 설치
Minio Operator Console에 접속하기 위한 JWT 토큰 발급이 필요하기에 kubectl minio plugin 설치 해야함.
$ https://github.com/minio/operator/releases/latest/download/kubectl-minio_linux_amd64_v1.zip
$ unzip kubectl-minio_linux_amd64_v1.zip
$ mv kubectl-minio /usr/local/bin
[root@bastion nfsshare]# oc minio version
Kubectl-Plugin Version: v5.0.11
[root@bastion nfsshare]# oc minio proxy
Starting port forward of the Console UI.
To connect open a browser and go to http://localhost:9090
Current JWT to login: eyJhbGciOiJSUzI1NiIsImtpZCI6IjlMMDE3VUpZUkltNms0MldUTEtiRUMtRFhTNVJXdVhDbGRReVZIT29lbUUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtaW5pby1vcGVyYXRvciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJjb25zb2xlLXNhLXRva2VuLTh2OWdjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImNvbnNvbGUtc2EiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NDIzOWM1ZS02MWU3LTQ2MDAtYTY4ZS05NzRjYTU3Y2JhOTUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bWluaW8tb3BlcmF0b3I6Y29uc29sZS1zYSJ9.viKMGuA13HwCWfXwRW_7Y2yHrWD8--54z8fAbE5Rc7p-VfrAwecVKfiTiatfrKHGVzkLTCTVAV8VrTQIb_Uz9XQZTsgNBFTE0prAaWmwsz61xllPS86UQwK_Qr86L6jSK06YnLnmsYJjkIkAa2V9rvt5eRRlBhbiMFCTlnIG2nVOjJNEhF5oXCwj8CXmV2NOrhxfrFSm-83sVgdKk454ttOtkj3DdT69bDiMgUM01JQkvLl6sQdIoQyQi5Gn-46SP52yaVCPOK6NomP-zCYLx1fyIYCPKbl5pzj2ehJE4e6iCiOg-Hb1_3F2KwZPUqD9g3mFJTyQ527x4-Ev7weQGuQRajTXaaH9R2JI8eVa_rG_mGUxd9RABVaLg29qWC2BNdzl8DojyHhGInUSiB9EddJwpycUmzLysK_OChJk4eaPhxXB51mrvSlcF87QH04xIqoMqaxAUHT3OxEDNeP_tZTbGY9AzuYCuOXZS57E0DhfpYh2W4KL-4Hn0-htWPhI5PoIAOWFdXaKqF5RfOM_wbOck6gYjACm8A5rLDif0NhkJAX6K1XdoDO5fsN-vLNCZLKSpYWCXM__VFpGE6n1d2vgsxdVFBjFPseT6Mt-l7cETCMPo0x-dKlvi9nRxZ2vJ7Y_cZDkTqk_e6CenyXIlkl9R75uTOIaLSWXW8blO7Y
Forwarding from 0.0.0.0:9090 -> 9090
4. MinIO Operator Console 접속
- JMT token으로 로그인 진행 후 접속
- Tenant 생성을 진행 한다.

5. Tenant 생성하기
- MinIO Operator Console에 접속시 오른쪽 상단의 Create Tenant를 클릭하여 Tenant를 생성.(※ storage class는 사전 구성 필요)
- Tenant Name / Namespace 설정 ( namespace는 미리 생성되어있어야 함.)
- Storage Class 지정하기
- Server 개수 지정 ( Number of Servers )
- Server당 사용할 PV 개수 지정 ( Drives Per Server)

2. Configure

- Expose MinIO Service: OFF
- Expose Console Service: OFF
3. Images
- disconnected 환경에서 수정 필요
4. Pod Placement
- 미수정
5. Identity Provider

- 원하는 계정/패스워드로 수정하여 생성 진행
6. security

7. Encryption
- 미수정
8. Create 생성
- Statefulset이 생성이 되는데 해당 Statefulset은 테넌트이름-sa 의 serviceaccount 계정으로 기동됨
- 해당 serviceaccountd에 anyuid 권한 필요
# example
$ oc adm policy add-scc-to-user anyuid -z test-sa -n minio-operator
# default 설정 값
$ oc adm policy add-scc-to-user anyuid -z 테넌트이름-sa -n 테넌트이름
6. Tenant Console Expose
Tenant가 정상적으로 생성이 되었다면 테넌트이름-console 이름으로 Service Object가 생성이 된다.
$ oc expose svc 테넌트이름-console
$ oc expose svc test-console
$ oc get svc

7. Tenant Console 접속 및 Bucket 생성
- 원하는 bucket명을 작성하여 생성 진행

8. Access Key 생성
- 해당 Tenant에 접속할 수 있는 Access key를 생성한다.
- 탭 왼쪽에서 Access Key를 클릭 후 새롭게 생성을 진행한다

- credentials.json download 진행
{"url":"http://test-console-minio-operator.apps.ocp.dhwon.com/api/v1/service-account-credentials","accessKey":"RIiKRT4LZO0uiMSqGWIb","secretKey":"7OSjPKdtduOItdZvzsPMhfgYrqlVkojZxMdw6zoG","api":"s3v4","path":"auto"}
Loki Sizing
- Loki 인스턴스의 size를 지정해야하기 때문에 다음 문서들을 참조하여 사이징 해야함
[참조사이트]
- https://www.redhat.com/en/blog/benchmarking-the-loki-operator
- https://loki-operator.dev/docs/storage_size_calculator.md/
- https://docs.openshift.com/container-platform/4.14/logging/log_storage/installing-log-storage.html
Loki Operator 구성
1. Loki Operator 설치
- OperatorHub에서 Red Hat Certified Loki Operator 설치

2. Loki에서 사용할 MinIO 접속 정보 만들기
OpenShift의 Loki Operator 생성할 때 S3 Storage로 MinIO를 사용하기 위한 API 정보를 미리 만들어야 함.
credentials.json 파일을 참고해 생성 할 것
bucketname: 생성한 bucket nameendpoint: url 뒤에 parameter 값 빼고--from-literal=access_key_id: accessKey--from-literal=access_key_secret: secretKey
# 예시
oc create secret generic logging-loki-minio --from-literal=bucketnames="test" --from-literal=endpoint="http://test-console-minio-operator.apps.ocp.dhwon.com" --from-literal=access_key_id="RIiKRT4LZO0uiMSqGWIb" --from-literal=access_key_secret="7OSjPKdtduOItdZvzsPMhfgYrqlVkojZxMdw6zoG" -n openshift-logging
# 참고
oc create secret generic logging-loki-minio --from-literal=bucketnames="<bucket_name>" --from-literal=endpoint="<minio_bucket_endpoint>" --from-literal=access_key_id="<minio_access_key_id>" --from-literal=access_key_secret="<minio_access_key_secret>" -n openshift-logging
3. Loki Instance 만들기
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
name: lokistack-sample
namespace: openshift-logging
spec:
tenants:
mode: openshift-logging
managementState: Managed
limits:
global:
queries:
queryTimeout: 3m
storage:
schemas:
- effectiveDate: '2020-10-11'
version: v11
secret:
name: logging-loki-minio
type: s3
tls:
caName: openshift-service-ca.crt
hashRing:
type: memberlist
size: 1x.extra-small <-- 앞서 수행한 size 규모를 지정
storageClassName: managed-nfs-storage <-- block storage 권장..
- 이때 선언하는 storageClassName은 Loki가 Backend Storage(MinIO)로 데이터를 전송하기 전에 임시로 데이터를 저장하고 있을 공간. Block Storage Class 권장
- OpenShift가 사용하는 TLS도 설정해야함. 설정하지 않으면 Lokistack 리소스 생성 안됨
Openshift Logging Operator
1. Openshift Logging Opertor 설치
- OperatorHub의 Red Hat Certified OpenShift Logging 설치
2. Cluster Logging Instance 만들기
apiVersion: logging.openshift.io/v1
kind: ClusterLogging
metadata:
name: instance
namespace: openshift-logging
spec:
logStore:
type: lokistack
lokistack:
name: lokistack-sample
collection:
type: vector
3. OpenShift Web Console로 Loki Dashboard 확인
- 개발자 콘솔에 들어가서 모니터링을 보면 Logs라는 탭이 추가 된 것을 확인 가능

[참조자료]
- Loki Flush API : https://grafana.com/docs/loki/latest/reference/api/#flush-in-memory-chunks-to-backing-store
- MinIO Tenant Deploy : https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-minio-tenant.html
- MinIO Github : https://github.com/minio/operator/tree/master
- OpenShift Logging Using Loki : https://docs.openshift.com/container-platform/4.13/logging/cluster-logging-loki.html