Elasticsearch, Kibana 및 기타 Elastic 제품을 관리하기 위한 Elastic Cloud on Kubernetes (ECK)를 설치하는 과정을 안내합니다. 아래는 주요 단계들을 정리한 것입니다.
전제 조건
- Kubernetes 클러스터가 이미 실행 중이어야 합니다.
- ECK 설치 전에 지원되는 버전을 확인하세요.
- GKE를 사용하는 경우 사용자가 cluster-admin 권한을 가지고 있어야 합니다.
- Amazon EKS를 사용하는 경우 Kubernetes 제어 평면이 포트 443에서 Kubernetes 노드와 통신할 수 있도록 허용되어야 합니다.
Custom Resource Definitions(CRDs) 설치:Elastic 관련 CRDs가 생성됩니다.
kubectl create -f https://download.elastic.co/downloads/eck/2.10.0/crds.yaml
다음과 같은 Elastic 리소스가 생성되었습니다.
customresourcedefinition.apiextensions.k8s.io/agents.agent.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/beats.beat.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticmapsservers.maps.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/enterprisesearches.enterprisesearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/logstashes.logstash.k8s.elastic.co created
Operator 및 RBAC 규칙 설치:ECK Operator와 관련 RBAC 규칙이 설치됩니다. 기본적으로 ECK Operator는 elastic-system 네임스페이스에서 실행됩니다. 작업 부하에 대한 전용 네임스페이스를 선택하는 것이 좋습니다.
kubectl apply -f https://download.elastic.co/downloads/eck/2.10.0/operator.yaml
Operator 로그 모니터링:Operator의 로그를 실시간으로 모니터링할 수 있습니다.
kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
이제 ECK가 Kubernetes 클러스터에 배포되었습니다. 추가 Elastic 제품을 배포하려면 해당 제품에 대한 Elastic Custom Resource(예: Elasticsearch, Kibana)를 생성하면 됩니다. 자세한 내용은 Elastic 공식 문서를 참조하세요.
Elasticsearch 클러스터 배포
- Elasticsearch Custom Resource 적용
ECK Operator는 Elasticsearch 클러스터의 원하는 상태를 달성하기 위해 Kubernetes 리소스를 자동으로 생성하고 관리합니다. 클러스터가 사용 가능하도록 모든 리소스가 생성될 때까지 몇 분이 걸릴 수 있습니다.cat <<EOF | kubectl apply -f - apiVersion: elasticsearch.k8s.elastic.co/v1 kind: Elasticsearch metadata: name: quickstart spec: version: 8.11.1 nodeSets: - name: default count: 1 config: node.store.allow_mmap: false EOF
- 클러스터 상태 및 생성 진행 모니터링
현재 Kubernetes 클러스터에 있는 Elasticsearch 클러스터의 개요를 확인합니다. HEALTH, 버전 및 노드 수가 표시됩니다.kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=quickstart'
클러스터를 생성하면 HEALTH 상태가 없고 PHASE는 비어 있습니다. 시간이 지나면 PHASE가 Ready로 변하고 HEALTH가 초록색이 됩니다.kubectl get elasticsearch
- 클러스터 엑세스 및 로그 확인
클러스터 내의 Pod의 로그를 확인할 수 있습니다.kubectl logs -f quickstart-es-default-0
- Elasticsearch 엑세스 요청
클러스터용 ClusterIP 서비스가 자동으로 생성됩니다. 이 서비스를 통해 Elasticsearch에 액세스할 수 있습니다.kubectl get service quickstart-es-http
클러스터에 대한 인증 정보를 가져옵니다.PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')
또는 로컬 워크스테이션에서:curl -u "elastic:$PASSWORD" -k "https://quickstart-es-http:9200"
그리고 다른 터미널에서:kubectl port-forward service/quickstart-es-http 9200
주의: -k 플래그를 사용하여 인증서 확인을 비활성화하는 것은 권장되지 않으며 테스트 목적으로만 사용해야 합니다. 응답으로 Elasticsearch 클러스터의 정보가 출력됩니다.curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
이제 Elasticsearch 클러스터가 배포되었고, 해당 클러스터에 대한 상태 및 엑세스가 가능합니다.
Kibana 인스턴스 배포
- Kibana Custom Resource 지정
이로써 Kibana 인스턴스가 Elasticsearch 클러스터와 연결되었습니다.cat <<EOF | kubectl apply -f - apiVersion: kibana.k8s.elastic.co/v1 kind: Kibana metadata: name: quickstart spec: version: 8.11.1 count: 1 elasticsearchRef: name: quickstart EOF
- Kibana 상태 및 생성 진행 모니터링
Kibana 인스턴스에 대한 상세 정보를 확인할 수 있습니다.kubectl get kibana
연관된 Pods에 대한 정보를 확인할 수 있습니다.kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart'
- Kibana 엑세스
Kibana를 위한 ClusterIP 서비스가 자동으로 생성됩니다.kubectl get service quickstart-kb-http
로컬 워크스테이션에서 Kibana에 액세스하기 위해 kubectl port-forward를 사용합니다.kubectl port-forward service/quickstart-kb-http 5601
- 브라우저에서 Kibana 열기
브라우저에서 https://localhost:5601을 열어주세요. 브라우저는 자체 서명된 인증서가 알려진 인증 기관에 의해 확인되지 않아 신뢰할 수 없다는 경고를 표시할 것입니다. 이 퀵스타트의 목적을 위해 경고를 일시적으로 수락할 수 있지만, 프로덕션 배포에서는 유효한 인증서를 구성하는 것이 매우 권장됩니다. - elastic 사용자로 로그인
아래 명령을 사용하여 elastic 사용자로 로그인할 수 있는 패스워드를 가져옵니다.
받은 패스워드로 Kibana에 로그인합니다.kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo
이제 Kibana 인스턴스가 배포되었고, 해당 인스턴스에 대한 상태 및 엑세스가 가능합니다.
클러스터 업그레이드
- Elasticsearch 노드 수 늘리기
Elasticsearch 노드 수를 3개로 늘리는 클러스터 업그레이드를 수행합니다.cat <<EOF | kubectl apply -f - apiVersion: elasticsearch.k8s.elastic.co/v1 kind: Elasticsearch metadata: name: quickstart spec: version: 8.11.1 nodeSets: - name: default count: 3 config: node.store.allow_mmap: false EOF
참고: 클러스터 변경 내용이 기존 Kubernetes 리소스의 유효한 변환으로 전환되어야 합니다. 예를 들어 기존 볼륨 클레임은 축소될 수 없습니다. Operator는 기존 클러스터에 최소한의 중단으로 변경 사항을 적용하려고 노력합니다. 변경을 수용하기 위해 Kubernetes 클러스터에 충분한 리소스(추가 저장 공간, 일시적으로 새로운 파드를 실행하는 데 필요한 충분한 메모리 및 CPU 리소스 등)가 있는지 확인해야 합니다.
이제 Elasticsearch 클러스터가 새로운 구성으로 업그레이드되었습니다. 추가로 변경사항이나 클러스터 구성에 대한 업그레이드는 필요에 따라서 위와 유사한 방식으로 수행할 수 있습니다.
영속적인 스토리지 사용
가이드에서 배포한 클러스터는 기본 스토리지 클래스를 사용하여 1GiB의 영속적인 볼륨을 할당합니다. 그러나 프로덕션 환경에서는 이러한 스토리지의 크기와 속성을 더 정확하게 제어하고 싶을 수 있습니다. 이를 위해 "Volume claim templates"를 참조하시기 바랍니다.
프로덕션 환경에서는 클러스터의 스토리지 구성을 더 세부적으로 조정해야 할 수 있습니다. "Volume claim templates"에서 제공하는 정보를 참고하여 클러스터의 스토리지에 대한 사용자 지정 설정을 수행할 수 있습니다. 이를 통해 보다 효율적이고 안정적인 스토리지 구성을 달성할 수 있습니다.
프로젝트 저장소에서 일련의 샘플 리소스를 찾을 수 있습니다.
각 CustomResourceDefinition (CRD)에 대한 자세한 설명은 API 참조에서 확인하거나 프로젝트 저장소의 CRD 파일을 참조할 수 있습니다. 또한 클러스터에서 CRD에 관한 정보를 검색할 수도 있습니다. 예를 들어 Elasticsearch CRD 사양을 확인하려면 다음과 같이 실행합니다:
kubectl describe crd elasticsearch
이 명령은 Elasticsearch CRD에 대한 자세한 정보를 출력합니다. 프로젝트에서 정의된 Elasticsearch 리소스의 구조 및 설정에 대한 통찰력을 얻는 데 유용할 수 있습니다. 이를 통해 Elasticsearch 클러스터를 관리하기 위한 최적의 구성을 확인할 수 있습니다.
APM Server 배포
ECK로 관리되는 Elasticsearch 클러스터를 사용하여 APM Server와 Elasticsearch 간의 원활하고 보안된 통합을 달성할 수 있습니다. APM Server의 출력 구성은 Elasticsearch와의 신뢰 관계를 자동으로 설정하도록 구성됩니다.
다음 사양을 적용하여 퀵스타트에서 생성한 클러스터에 APM Server를 배포하고 연결합니다.
cat <<EOF | kubectl apply -f -
apiVersion: apm.k8s.elastic.co/v1
kind: ApmServer
metadata:
name: apm-server-quickstart
namespace: default
spec:
version: 8.11.1
count: 1
elasticsearchRef:
name: quickstart
EOF
기본적으로 elasticsearchRef는 Elasticsearch 클러스터의 모든 노드를 대상으로합니다. 클러스터의 특정 노드로 트래픽을 직접 전송하려면 Traffic Splitting을 참조하여 더 많은 정보와 예제를 확인하십시오.
APM Server 인스턴스에 대한 세부 정보를 검색할 수 있습니다.
kubectl get apmservers
결과는 다음과 같이 표시됩니다.
NAME HEALTH NODES VERSION AGE
apm-server-quickstart green 1 8.11.1 8m
또한 특정 배포에 속하는 모든 Pod를 나열할 수 있습니다.
kubectl get pods --selector='apm.k8s.elastic.co/name=apm-server-quickstart'
결과는 다음과 같이 표시됩니다.
NAME READY STATUS RESTARTS AGE
apm-server-quickstart-apm-server-69b447ddc5-fflc6 1/1 Running 0 2m50s
이제 Elasticsearch 클러스터에 APM Server가 배포되었으며, 해당 인스턴스에 대한 상태와 배포를 확인할 수 있습니다.
Fleet Server 및 Elastic Agents 배포
cat <<EOF | kubectl apply -f -
apiVersion: agent.k8s.elastic.co/v1alpha1
kind: Agent
metadata:
name: fleet-server-quickstart
namespace: default
spec:
version: 8.11.1
kibanaRef:
name: kibana-quickstart
elasticsearchRefs:
- name: elasticsearch-quickstart
mode: fleet
fleetServerEnabled: true
policyID: eck-fleet-server
deployment:
replicas: 1
podTemplate:
spec:
serviceAccountName: elastic-agent
automountServiceAccountToken: true
securityContext:
runAsUser: 0
---
apiVersion: agent.k8s.elastic.co/v1alpha1
kind: Agent
metadata:
name: elastic-agent-quickstart
namespace: default
spec:
version: 8.11.1
kibanaRef:
name: kibana-quickstart
fleetServerRef:
name: fleet-server-quickstart
mode: fleet
policyID: eck-agent
daemonSet:
podTemplate:
spec:
serviceAccountName: elastic-agent
automountServiceAccountToken: true
securityContext:
runAsUser: 0
volumes:
- name: agent-data
emptyDir: {}
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: kibana-quickstart
namespace: default
spec:
version: 8.11.1
count: 1
elasticsearchRef:
name: elasticsearch-quickstart
config:
xpack.fleet.agents.elasticsearch.hosts: ["https://elasticsearch-quickstart-es-http.default.svc:9200"]
xpack.fleet.agents.fleet_server.hosts: ["https://fleet-server-quickstart-agent-http.default.svc:8220"]
xpack.fleet.packages:
- name: system
version: latest
- name: elastic_agent
version: latest
- name: fleet_server
version: latest
xpack.fleet.agentPolicies:
- name: Fleet Server on ECK policy
id: eck-fleet-server
namespace: default
monitoring_enabled:
- logs
- metrics
unenroll_timeout: 900
package_policies:
- name: fleet_server-1
id: fleet_server-1
package:
name: fleet_server
- name: Elastic Agent on ECK policy
id: eck-agent
namespace: default
monitoring_enabled:
- logs
- metrics
unenroll_timeout: 900
package_policies:
- name: system-1
id: system-1
package:
name: system
---
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: elasticsearch-quickstart
namespace: default
spec:
version: 8.11.1
nodeSets:
- name: default
count: 3
config:
node.store.allow_mmap: false
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: elastic-agent
rules:
- apiGroups: [""] # "" indicates the core API group
resources:
- pods
- nodes
- namespaces
verbs:
- get
- watch
- list
- apiGroups: ["coordination.k8s.io"]
resources:
- leases
verbs:
- get
- create
- update
- apiGroups: ["apps"]
resources:
- replicasets
verbs:
- list
- watch
- apiGroups: ["batch"]
resources:
- jobs
verbs:
- list
- watch
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: elastic-agent
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: elastic-agent
subjects:
- kind: ServiceAccount
name: elastic-agent
namespace: default
roleRef:
kind: ClusterRole
name: elastic-agent
apiGroup: rbac.authorization.k8s.io
EOF
이 구성은 Fleet Server, Elastic Agents, Elasticsearch 및 Kibana를 배포하고 설정합니다. Elastic Agent는 root 사용자로 실행될 수 있어서 호스트 경로 볼륨에 상태를 유지하고 Fleet 모드에서 Elasticsearch CA를 신뢰해야합니다. Agent 컨테이너를 root로 실행하지 않는 옵션에 대한 자세한 내용은 "Storing local state in host path volume"를 참조하십시오.
ECK는 모든 구성 요소 간의 안전한 연결을 자동으로 구성합니다. Fleet이 설정되고 모든 에이전트가 기본 정책에 등록됩니다.
Fleet Server 및 Elastic Agent의 상태를 모니터링할 수 있습니다.
kubectl get agent
결과는 다음과 같이 표시됩니다.
NAME HEALTH AVAILABLE EXPECTED VERSION AGE
elastic-agent-quickstart green 3 3 8.11.1 14s
fleet-server-quickstart green 1 1 8.11.1 19s
특정 Elastic Agent 사양에 속하는 모든 Pod를 나열할 수 있습니다.
kubectl get pods --selector='agent.k8s.elastic.co/name=elastic-agent-quickstart'
결과는 다음과 같이 표시됩니다.
NAME READY STATUS RESTARTS AGE
elastic-agent-quickstart-agent-t49fd 1/1 Running 0 54s
elastic-agent-quickstart-agent-xbcxr 1/1 Running 0 54s
elastic-agent-quickstart-agent-zqp55 1/1 Running 0 54s
이제 Elastic Agent 정책을 구성하고, Elastic Agent policies를 확인하여 자세한 내용을 확인할 수 있습니다.
Enterprise Search 배포
ECK를 사용하여 Enterprise Search를 배포하려면 다음 명세를 적용하세요. ECK는 Elasticsearch 퀵스타트에서 생성된 quickstart라는 이름의 Elasticsearch 클러스터에 대한 보안 연결을 자동으로 구성합니다.
cat <<EOF | kubectl apply -f -
apiVersion: enterprisesearch.k8s.elastic.co/v1
kind: EnterpriseSearch
metadata:
name: enterprise-search-quickstart
spec:
version: 8.11.1
count: 1
elasticsearchRef:
name: quickstart
EOF
Workplace Search는 7.7부터 7.8까지의 버전에서 ECK에서 엔터프라이즈 라이선스가 필요했습니다. 30일 무료 평가판 라이선스로 시작할 수 있습니다.
Enterprise Search 배포에 대한 세부 정보를 검색합니다.
kubectl get enterprisesearch
결과는 다음과 같이 표시됩니다.
NAME HEALTH NODES VERSION AGE
enterprise-search-quickstart green 1 8.11.1 8m
주어진 배포에 속하는 모든 Pod를 나열합니다.
kubectl get pods --selector='enterprisesearch.k8s.elastic.co/name=enterprise-search-quickstart'
결과는 다음과 같이 표시됩니다.
NAME READY STATUS RESTARTS AGE
enterprise-search-quickstart-ent-58b84db85-dl7c6 1/1 Running 0 2m50s
그 Pod의 로그에 액세스합니다.
kubectl logs -f enterprise-search-quickstart-ent-58b84db85-dl7c6
Enterprise Search에 액세스합니다.
배포를 위해 자동으로 ClusterIP 서비스가 생성되며, 해당 서비스를 사용하여 Kubernetes 클러스터 내에서 Enterprise Search API에 액세스할 수 있습니다.
kubectl get service enterprise-search-quickstart-ent-http
kubectl port-forward를 사용하여 로컬 워크스테이션에서 Enterprise Search에 액세스합니다.
kubectl port-forward service/enterprise-search-quickstart-ent-http 3002
웹 브라우저에서 https://localhost:3002을 엽니다.
Elasticsearch 클러스터와 함께 생성된 elastic 사용자로 로그인합니다. 해당 비밀번호는 다음 명령을 사용하여 얻을 수 있습니다.
kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo
Kibana에서 Enterprise Search UI에 액세스합니다. 7.14.0 버전부터 Kibana에서 Enterprise Search UI에 액세스할 수 있습니다.
Elasticsearch 및 Enterprise Search에 모두 연결하도록 구성된 Kibana를 배포하려면 다음 명세를 적용하세요.
cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 8.11.1
count: 1
elasticsearchRef:
name: quickstart
enterpriseSearchRef:
name: enterprise-search-quickstart
EOF
kubectl port-forward를 사용하여 로컬 워크스테이션에서 Kibana에 액세스합니다.
kubectl port-forward service/quickstart-kb-http 5601
웹 브라우저에서 https://localhost:5601을 열고 Enterprise Search UI로 이동합니다.
Filebeat 배포
Kubernetes 클러스터에서 실행 중인 모든 컨테이너의 로그를 수집하는 구성을 적용합니다. ECK는 Elasticsearch 퀵스타트에서 생성된 quickstart라는 이름의 Elasticsearch 클러스터에 대한 보안 연결을 자동으로 구성합니다.
cat <<EOF | kubectl apply -f -
apiVersion: beat.k8s.elastic.co/v1beta1
kind: Beat
metadata:
name: quickstart
spec:
type: filebeat
version: 8.11.1
elasticsearchRef:
name: quickstart
config:
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
daemonSet:
podTemplate:
spec:
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
securityContext:
runAsUser: 0
containers:
- name: filebeat
volumeMounts:
- name: varlogcontainers
mountPath: /var/log/containers
- name: varlogpods
mountPath: /var/log/pods
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
volumes:
- name: varlogcontainers
hostPath:
path: /var/log/containers
- name: varlogpods
hostPath:
path: /var/log/pods
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
EOF
이 구성은 Filebeat을 배포하고 Elasticsearch 클러스터로 로그를 수집하도록 설정합니다. Filebeat이 Kubernetes 클러스터의 모든 컨테이너 로그를 감지하고 Elasticsearch에 전송하게됩니다.
Filebeat에 대한 세부 정보를 검색합니다.
kubectl get beat
결과는 다음과 같이 표시됩니다.
NAME HEALTH AVAILABLE EXPECTED TYPE VERSION AGE
quickstart green 3 3 filebeat 8.11.1 2m
주어진 Beat에 속하는 모든 Pod를 나열합니다.
kubectl get pods --selector='beat.k8s.elastic.co/name=quickstart-beat-filebeat'
결과는 다음과 같이 표시됩니다.
NAME READY STATUS RESTARTS AGE
quickstart-beat-filebeat-tkz65 1/1 Running 0 3m45s
quickstart-beat-filebeat-kx5jt 1/1 Running 0 3m45s
quickstart-beat-filebeat-nb6qh 1/1 Running 0 3m45s
Pod 중 하나의 로그에 액세스합니다.
kubectl logs -f quickstart-beat-filebeat-tkz65
Filebeat에 의해 수집된 로그에 액세스하는 방법은 두 가지입니다.
- Elasticsearch 배포 가이드를 따라 실행하고:
curl -u "elastic:$PASSWORD" -k "https://localhost:9200/filebeat-*/_search"
- Kibana 배포 가이드를 따라 로그인하고 Kibana > Discover로 이동합니다.
Logstash 배포
Beats 에이전트 또는 Logstash로 데이터를 보내도록 구성된 Elastic Agent가 5044 포트로 전송하도록하는 최소한의 Logstash 배포를 생성하며, 서비스를 생성하고 결과를 Elasticsearch 퀵스타트에서 사용할 것으로 정의합니다.
cat <<EOF | kubectl apply -f -
apiVersion: logstash.k8s.elastic.co/v1alpha1
kind: Logstash
metadata:
name: quickstart
spec:
count: 1
elasticsearchRefs:
- name: quickstart
clusterName: qs
version: 8.11.1
pipelines:
- pipeline.id: main
config.string: |
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => [ "${QS_ES_HOSTS}" ]
user => "${QS_ES_USER}"
password => "${QS_ES_PASSWORD}"
ssl_certificate_authorities => "${QS_ES_SSL_CERTIFICATE_AUTHORITY}"
}
}
services:
- name: beats
service:
spec:
type: NodePort
ports:
- port: 5044
name: "filebeat"
protocol: TCP
targetPort: 5044
EOF
Logstash의 상태를 확인합니다.
kubectl get logstash
결과는 다음과 같이 표시됩니다.
NAME AVAILABLE EXPECTED AGE VERSION
quickstart 3 3 4s 8.11.1
주어진 Logstash 명세에 속하는 모든 Pod를 나열합니다.
kubectl get pods --selector='logstash.k8s.elastic.co/name=quickstart'
결과는 다음과 같이 표시됩니다.
NAME READY STATUS RESTARTS AGE
quickstart-ls-0 1/1 Running 0 91s
Pod의 로그에 액세스합니다.
kubectl logs -f quickstart-ls-0
이것으로 Logstash를 ECK에서 실행하고 설정하는 과정이 완료되었습니다.
댓글