Amazon Elastic Kubernetes Service(Amazon EKS)
의 약자로 ,
클라우드, 또는 온프레미스에서 Kubernetes 어플리케이션을 실행하고 크기를 조정하는 관리형 컨테이너 서비스 이다.
Elasticsearch 접속확인
Kibana와 Elasticsearch 클러스터링 연결 확인
Kubernetes Pods 구성 확인
Elasticsearch → docker.elastic.co/elasticsearch/elasticsearch:7.12.0
Kibana → docker.elastic.co/kibana/kibana:7.12.0
쿠버네티스의 설정이나 용어들이 낯설어서 명시
인그레스는 클러스터 외부에서 클러스터 내부 서비스로 HTTP와 HTTPS 경로를 노출한다.
즉 Pods를 호출 할 수 있는 도메인 주소
이다.
어플리케이션의 stateFul을 관리하는데 사용하는 워크로드 API 오브젝트이다.
Pods 집합의 Deployment와 Scaling을 관리하며, Pods의 순서 및 고유성을 보장
한다.
즉, ES의 내부 클러스터링과 Kinaba의 클러스터링이 연결이 되려면 해당 방식을 사용해야 한다.
Key-Value로 기밀이 아닌 데이터를 저장하는데 사용하는 API 오브젝트이다. Pods는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성파일로 컨피그맵을 사용할 수 있다. 컨테이너 이미지에서 환경별 구성을 분리하여, 어플리케이션에 이직할 수 있다.
즉, elasticsearch.yml, kibana.yml을 해당 기능으로 구성이 가능
해 진다.
CPU사용량을 관찰하여 replication controller, deployment, replicaSet, statefulSet의 Pods 개수를 자동으로 스케일링한다
즉, 가변적으로 상황에 따라 Pods개수가 설정된 범위내에서 변경
된다
Pods 집합에서 실행중인 어플리케이션을 네트워크 서비스로 노출하는 추상화 방법
즉, 외부 DNS를 지정하고 로드밸런스를 여기서 수행
한다.
노드가 클러스터 리소스인 것처럼 PV는 클러스터 리소스.
즉, Pods의 외부 적재 스토리지
특정 Pods의 Application을 접근할 수 있도록 지정. NodePort 서비스를 만든다는 것은 Service를 포트로 지정하여 서로 연결
즉, 외부에서 Pods로 연결
하기 위한 방법
deploy될때, 이미지에 대한 정책을 정한다. 예제는 IfNotPresent
지만 제대로 동작하지 않는다. 해서 Always로 변경
실제 적용시, 나뉘어진 yml파일에 대해 직접적으로 apply를 해주어야 한다.
현재의 예시에서는 hpa.yml
, config.yml
, service.yml
, deployment.yml
이 적용되어야 한다
kubectl apply -f [yml 파일이름]
여러 문서를 확인 한 결과 ConfigMap을 통해서 노드별 환경구성이 되는것을 알게 되었고
(예시에서는 Master Node, Data Node를 나누는 기준으로 사용된다)
해당 예시를 이용해서 클러스터링 구성을 위해 적용해보았다
apiVersion: v1
kind: ConfigMap
metadata:
namespace: dev
name: elasticsearch-config
labels:
app: elasticsearch-node
role: master
data:
elasticsearch.yml: |-
cluster.name: ${cluster.name}
node.name: ${node.name}
discovery.seed_hosts: ${discovery.seed_hosts}
cluster.initial_master_nodes: ${cluster.initial_master_nodes}
network.host: 0.0.0.0
xpack.security.enabled: false
xpack.monitoring.enabled: true
xpack.monitoring.collection.enabled: true
Elasticsearch에서 클러스터링 구성시, 1대는 마스터 노드여야하고, 나머지 2대는 이중화 구성이 되어야 하므로 권장하는 최소 클러스터링 구성은 3이다.
최소 3대에서 최대 5대까지 클러스터링이 구성
된다
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: elasticsearch-hpa
namespace: dev
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: elasticsearch-node
minReplicas: 3
maxReplicas: 5
targetCPUUtilizationPercentage: 50
apiVersion: v1
kind: Service
metadata:
name: elasticsearch-node
namespace: dev
spec:
selector:
app: elasticsearch-node
type: NodePort
ports:
- name: serving
protocol: TCP
port: 9200
- name: node-to-node
protocol: TCP
port: 9300
실제로는 deployment가 아니라 statefulset, 편의상 deployment라고 부름
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch-node
labels:
app: elasticsearch-node
role: master
namespace: dev
spec:
serviceName: elasticsearch-node
replicas: 3
selector:
matchLabels:
app: elasticsearch-node
role: master
template:
metadata:
labels:
app: elasticsearch-node
role: master
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
imagePullPolicy: Always
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
ports:
- containerPort: 9200
name: rest
protocol: TCP
- containerPort: 9300
name: inter-node
protocol: TCP
env:
- name: cluster.name
value: elasticsearch-cluster
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: discovery.seed_hosts
value: "elasticsearch-node"
- name: cluster.initial_master_nodes
value: "elasticsearch-node-0,\
elasticsearch-node-1,\
elasticsearch-node-2"
- name: ES_JAVA_OPTS
value: "-Xms1024m -Xmx1024m"
volumeMounts:
- mountPath: "/usr/share/elasticsearch/data"
name: data
initContainers:
- name: fix-permissions
image: busybox:1.32.0-musl
imagePullPolicy: Always
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
securityContext:
privileged: true
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
- name: increase-vm-max-map
image: busybox:1.32.0-musl
imagePullPolicy: Always
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: busybox:1.32.0-musl
imagePullPolicy: Always
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
statefulset의 대표이름을 명시
해야한다statefulset에 의해 부여받은 이름을 명시
해야한다---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: dev
name: kibana-config
labels:
app: kibana
role: master
data:
kibana.yml: |-
elasticsearch:
hosts: ${ELASTICSEARCH_HOSTS}
username: lific
password: lific
---
키바나는 내부에서만 사용하므로 Pods의 구성은 1로 고정한다
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: kibana-hpa
namespace: dev
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: kibana-node
minReplicas: 1
maxReplicas: 1
targetCPUUtilizationPercentage: 50
apiVersion: v1
kind: Service
metadata:
name: dev-kibana-service
namespace: dev
spec:
selector:
app: kibana
type: NodePort
ports:
- protocol: TCP
port: 5601
targetPort: 5601
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: dev
labels:
app: kibana
role: master
spec:
replicas: 1
selector:
matchLabels:
app: kibana
role: master
template:
metadata:
labels:
app: kibana
role: master
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:7.12.0
imagePullPolicy: Always
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 700m
memory: 1Gi
env:
- name: ELASTICSEARCH_HOSTS
value: http://elasticsearch-node:9200
ports:
- containerPort: 5601
안녕하세요.
EKS에서도 클러스터링이 되는지 찾아보고 있었는데 좋은 글 잘 읽었습니다!
혹시 "여러 문서를 확인 한 결과 ConfigMap을 통해서 노드별 환경구성이 되는것을 알게 되었고" 해당 문장에 대한 레퍼런스 기억나시는 링크가 있을까요..??
추가로 혹시 Fargate 기반의 EKS일까요? EC2 기반의 EKS일까요?
감사합니다.