๋ก๊ทธ ์์ง์ ๋ฐฐ๊ฒฝ
์ฟ ๋ฒ๋คํฐ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก Pod๊ฐ ์ ์์ํ๊ฐ ์๋๋ผ๋ฉด Pod๋ฅผ killํ๊ณ ์๋ก ์์ฑํ๋ค.
ํ์ง๋ง ์ด์์ ์
์ฅ์์๋ Pod๊ฐ ์ฃฝ์ ์์ธ์ ์์์ผ ํ๋ค.
ํ์ง๋ง, Pod๊ฐ ์ฃฝ์ผ๋ฉด ๋ก๊ทธ๊น์ง ๊ฐ์ด ์์ด์ง๋ค. (Pod ์์ ์์ ๋ณผ๋ฅจ์ด ์ญ์ ๋จ)
๋ฐ๋ผ์, ์ปจํ ์ด๋๊ฐ ์ด์์์ ๋ ๋ก๊ทธ ์ ์ฅ์์ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ๋์์ผ ํ๋ค.
EFK Stack ๊ตฌ์ถ์ ํตํ ๋ก๊ทธ ์์ง
์ปจํ ์ด๋ ํ๊ฒฝ์์๋ ๋ก๊ทธ ์์ง์ ์ํด EFK Stack์ ๊ตฌ์ถํ ์ ์๋ค.
( EFK = ElasticSearch + Fluentd + Kibana )
- ElasticSearch: ๋์ฉ๋ ๋ก๊ทธ ์ ์ฅ์๋ก ์ด์ฉ
- Fluentd: ์ปจํ ์ด๋์ ์คํธ๋ฆผ ๋ก๊ทธ๋ฅผ ์์งํ๋ ๋ก๊ทธ ์์ง๊ธฐ. (๋ชจ๋ ๋ ธ๋๋ง๋ค ๋์ผํ๊ฒ ๋ฐฐํฌํด์ผํจ)
- Kibana: ๋ก๊ทธ ์๊ฐํ ํด (ElasticSearch์ ์ฐ๋ํ์ฌ ํ์ํ ๋ถ๋ถ๋ง ์ถ์ถํ์ฌ ๋ก๊ทธ ์๊ฐํ)
์ปจํ
์ด๋์ ๋ก๊ทธ๋ฅผ ๋ก๊ทธ ์ ์ฅ์์ ์์งํ๊ธฐ ์ํ Stack
๋๋ค NodePortํ์ ์ผ๋ก ๋ฐฐํฌํด์ผ ํจ.
1. ElasticSearch ๋ฐฐํฌ
NodePort ํ์ ์ผ๋ก ๋ฐฐํฌ
ํ
์คํธ, ์ซ์, ์์น ๊ธฐ๋ฐ ์ ๋ณด, ์ ํ ๋ฐ ๋น์ ํ ๋ฐ์ดํฐ ๋ฑ ๋ชจ๋ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ํ ๋ถ์ฐํ ์คํ ์์ค ๊ฒ์ ๋ฐ ๋ถ์ ์์ง
๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ ์ ์๊ณ ๋ถ์ํ ์ ์๋ค.
๋๊ฐ์ง ์ค์น ๋ฐฉ๋ฒ
1. ElasticSearch๋ JVM ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ Java8์ ์ธํ
ํด๋ ์ํ์์ ์ค์นํ๋ค.
2. ElasticSearch yaml ํ์ผ์ ์์ฑํ๋ฉด kubectl apply ๋ช
๋ น์ ํตํด ๊ฐ๋จํ๊ฒ ๋ฐฐํฌ๊ฐ๋ฅํ๋ค.
apiVersion: v1
kind: Service
metadata:
labels:
app: elasticsearch
name: elasticsearch-svc
namespace: default
spec:
ports:
- name: elasticsearch-rest
nodePort: 30920 // Node์ Port
port: 9200 // Service์ Port
protocol: TCP
targetPort: 9200 // Pod์ Port
๊ณผ์
1. LoadBalancer์ Security group์์ 9200๋ฒ ํฌํธ๋ฅผ Open ( ์ธ๋ถ ์ธํฐ๋ท์์ ์ ๊ทผํ๊ธฐ ์ํด)
[EC2 -> ๋ก๋๋ฐธ๋ฐ์ -> Security์์ ํธ์ง(type, Protocol: TCP / Port: 9200 / Socure: ๋ณธ์ธ IP ๋๋ ๊ทธ๋ฃน]
2. LoadBalancer์ Listener ํธ์ง -> 9200๋ฒ ํฌํธ๋ก ์ ๋ฌ๋ ํธ๋ํฝ์ instance(WorkerNode)์ 30920 ํฌํธ๋ก ์ ๋ฌ
3. Worker Node๋ก ์ ๋ฌ๋ ํธ๋ํฝ์ 9200 ํฌํธ๋ฅผ ํตํด์ Service๋ก ์ ๋ฌ
yamlํ์ผ์ Service ๋ถ๋ถ์ ์ ์๋ ๋๋ก 9200 ํฌํธ๋ฅผ ํตํด ์๋น์ค๋ ํด๋ฌ์ค ํใด์์ ๋ด๋ถ์ ์ผ๋ก ๋
ธ์ถ๋จ
4. 9200๋ฒ ํฌํธ๋ก ๋ณด๋ด์ง ์์ฒญ์ ์๋น์ค์ ์ํด ์ ํ๋ Pod์ 9200 ํฌํธ๋ก ์ ๋ฌ๋จ
[ec2-user@ip-10-0-0-xxx ~]$ cat<<EOF > ~/elasticSearch.yaml
> apiVersion: apps/v1
> kind: Deployment
> metadata:
> name: elasticsearch
> labels:
> app: elasticsearch
> spec:
> replicas: 1
> selector:
> matchLabels:
> app: elasticsearch
> template:
> metadata:
> labels:
> app: elasticsearch
> spec:
> containers:
> - name: elasticsearch
> image: elastic/elasticsearch:6.4.0
> env:
> - name: discovery.type
> value: "single-node"
> ports:
> - containerPort: 9200
> - containerPort: 9300
>
> ---
> apiVersion: v1
> kind: Service
> metadata:
> labels:
> app: elasticsearch
> name: elasticsearch-svc
> namespace: default
> spec:
> ports:
> - name: elasticsearch-rest
> nodePort: 30920
> port: 9200
> protocol: TCP
> targetPort: 9200
> - name: elasticsearch-nodecom
> nodePort: 30930
> port: 9300
> protocol: TCP
> targetPort: 9300
> selector:
> app: elasticsearch
> type: NodePort
> EOF
kubectl apply -f elasticSearch.yaml ์ ์ ๋ ฅํ์ฌ deployment, service๋ฅผ ์์ฑํ๋ค.
1. kubectl get pod
2. kubectl get service
์ดํ์ ๋ก๋๋ฐธ๋ฐ์์ ์ค์ ๋ ๋ณด์๊ทธ๋ฃน์์ 9200ํฌํธ๋ฅผ ์ด์ด์ฃผ๋ฉด ๋๋ค.
๋ํ ๋ก๋๋ฐธ๋ฐ์์ ๋ฆฌ์ค๋ ํธ์ง์ ๋ค์ด๊ฐ์ TCP 9200๋ฒ ํฌํธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ธ์คํด์ค์ 30920ํฌํธ๋ก ์ฐ๊ฒฐํด์ฃผ๋๋ก ํ๋ค.
์ด์ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํตํด์ 9200๋ฒ ํฌํธ๋ก ์ ๊ทผ์ ElasticSearch๋ก ์ฐ๊ฒฐ๋๋ค.
2. Kibana ๋ฐฐํฌ
NodePort ํ์ ์ผ๋ก ๋ฐฐํฌ
cat<<EOF > ~/kibana.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
labels:
app: kibana
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: elastic/kibana:6.4.0
env:
- name: SERVER_NAME
value: "kibana.kubenetes.example.com"
- name: ELASTICSEARCH_URL
value: "http://elasticsearch-svc.default.svc.cluster.local:9200"
ports:
- containerPort: 5601
---
apiVersion: v1
kind: Service
metadata:
labels:
app: kibana
name: kibana-svc
namespace: default
spec:
ports:
- nodePort: 30561
port: 5601
protocol: TCP
targetPort: 5601
selector:
app: kibana
type: NodePort
EOF
kubectl apply -f kibana.yaml ๋ช ๋ น ์ ๋ ฅ
๋ก๋๋ฐธ๋ฐ์์ ์ค์ ๋ ๋ณด์๊ทธ๋ฃน์์ 5601ํฌํธ๋ฅผ ์ด์ด์ฃผ๋ฉด ๋๋ค.
๋ฆฌ์ค๋ ํธ์ง์์๋ TCP 5601 ํฌํธ๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ธ์คํด์ค์ 30561 ํฌํธ๋ก ์์ฒญ์ ์ ๋ฌํ๋๋ก ์ค์ ํ๋ค.
3. Fluentd ๋ฐฐํฌ
๋ก๊ทธ ์์ง๊ธฐ๋ก์จ, ๋ค์ํ ๋ฐ์ดํฐ ์์ค(HTTP, TCP) ๋ก๋ถํฐ ์ํ๋ ํํ๋ก ๊ฐ๊ณต๋์ด ElasticSearch, S3์ ๊ฐ์ ์ฌ๋ฌ ๋ชฉ์ ์ง๋ก ์ ๋ฌ ๊ฐ๋ฅํ๋ค.
Fluentd๋ Daemonset์ ํตํด ๋ฐฐํฌํด์ผ ํ๋ค๋๊ฒ์ด ํน์ง์ด๋ค.
Daemonset์ด๋?
- ์ฟ ๋ฒ๋คํฐ์ค ์ปจํธ๋กค๋ฌ((Deployment, ReplicaSet ๋ฑ) ์ค ํ๋์ด๋ค. (์ปจํธ๋กค๋ฌ: Pod๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ )
- Pod๊ฐ ๊ฐ๊ฐ์ ๋ ธ๋์ ํ๋์ฉ๋ง ๋ฐฐํฌ๋๊ฒ ํ๋ Pod ๊ด๋ฆฌ ์ปจํธ๋กค๋ฌ (ex: ๋ชจ๋ ๋ ธ๋์ ํ๊ฐ์ฉ ๋ ์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ)
- ๋ ธ๋๊ฐ ์๋ก ์์ฑ๋๊ฑฐ๋ ์ญ์ ๋์ด๋ ์๋์ผ๋ก Pod๋ฅผ ์์ฑํ๊ณ ์ญ์ ํด์ค.
cat<<EOF > ~/fluentd.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluentd
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: fluentd
namespace: kube-system
rules:
- apiGroups:
- ""
resources:
- pods
- namespaces
verbs:
- get
- list
- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd
roleRef:
kind: ClusterRole
name: fluentd
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: fluentd
namespace: kube-system
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
labels:
k8s-app: fluentd-logging
version: v1
kubernetes.io/cluster-service: "true"
spec:
selector:
matchLabels:
k8s-app: fluentd-logging
version: v1
template:
metadata:
labels:
k8s-app: fluentd-logging
version: v1
kubernetes.io/cluster-service: "true"
spec:
serviceAccount: fluentd
serviceAccountName: fluentd
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch-svc.default.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: FLUENT_ELASTICSEARCH_SCHEME
value: "http"
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
EOF
kubectl apply -f fluentd.yaml ๋ช
๋ น์ ํตํด ๋ฐฐํฌํ๊ณ
kubectl get pod -n kube-system | grep fluentd ๋ช
๋ น์ ํตํด ๋ฐฐํฌ๋ ์๋น์ค ํ์ธํ๋ค.
-n ์ต์ ์ ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํ ์ ์๋ ์ต์ ์ธ๋ฐ fluentd์๋ namespace๋ฅผ ํตํด ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌํ์ผ๋ ์ฌ์ฉํ ์ ์๋ค.
(1) ๋ค์ ์คํ์ด์ค ํน์ ์กฐํ, (2) ๊ทธ๋ฅ ์กฐํ (3) -A ์ต์ ์กฐํ
ํ์ฌ๋ ๋ ธ๋๊ฐ 1๊ฐ์ด๊ธฐ ๋๋ฌธ์ fluentd Pod๊ฐ 1๊ฐ๋ง ๋ด์ง๋ง, ๋ ธ๋๊ฐ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๋ ธ๋ ๊ฐ์์ ๋ง์ถฐ์ Pod๊ฐ ๋ฌ๋ค.
4. Kibana Index Pattern ์์ฑ
์ด์ Kibana์ ์น์ ํตํด index pattern์ ์์ฑํด์ค๋ค.
๋ณด๋ฉด ์ด๋ฏธ logstash๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ง๋๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์์ผ๋ฏ๋ก ๋๋ ๋๊ฐ์ด logstash*์ผ๋ก ์์ง ํจํด์ ์ง์ ํด์ค๋ค.
kubectl 1.26 ๋ฒ์ ์ค์น์ ์ค๋ฅ ๋๋ฉด
aws-cli ๋ฒ์ ์ ์ ๋ฐ์ดํธํด์ฃผ๊ธฐ
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
'๐ณ DevOps > Cloud Infra' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
24*365 ์ฅ์ ๋ชจ๋ํฐ๋ง์ ๋ํด์(with AWS CloudWatch) (1) | 2023.07.13 |
---|---|
Ansible (0) | 2023.07.04 |
AWS EKS ํ๊ฒฝ๊ตฌ์ถ ์ค์ต (0) | 2023.06.29 |
AWS VPC ๊ตฌ์ถํ๊ธฐ (0) | 2023.06.17 |