SaevOps
[k8s] Kubernetes에 ELK(Elasticsearch+Kibana) 구축하기 본문
테스트 환경
장비 부족으로 마스터 노드 1대로 kubernetes 구성
사설IP : 172.16.10.184
OS : Rocky Linux 8.7 ( Green)
CPU : 3Core
Memory : 16GB
최종 테스트 날짜 : 2024.03.26
쿠버네티스 설정
# swap 끄기 & hostname 설정
# swap 끄기
sudo swapoff -a
sudo sed -i -e '/swap/d' /etc/fstab
# hostname 설정
hostname kubemaster
su -
# hosts 파일에 추가
vi /etc/hosts
...
172.16.10.184 kubemaster
# dnf 레포지토리 등록
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# dnf 업데이트
sudo dnf update -y --nobest
# 충돌나는 패키지를 교체(ex, podman)
sudo dnf install -y docker-ce docker-ce-cli containerd.io --allowerasing
# 도커 버전 확인
docker --version
# 도커 상시 시작 확인
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
# 도커용 폴더 생성 & 데몬설정
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 도커 데몬 재기동
sudo systemctl daemon-reload
sudo systemctl restart docker
# 컨테이너 추가 설정
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# 커널 overlay 모듈 br_netfilter 모듈 로드
- 1. overlay : 오버레이 파일 시스템을 사용하기 위해 필요
- - br_netfilter : 브리지 네트워킹 시스템에서 패킷 필터링을 위해 필요
sudo modprobe overlay sudo modprobe br_netfilter
# 커널 매개변수 조정
- net.bridge.bridge-nf-call-iptables = 1: 이 설정은 리눅스 커널이 브리지 네트워크 트래픽을 iptables로 보내도록 하는 것을 제어함. 브리지 네트워크는 두 개 이상의 네트워크를 연결하는 데 사용되며, 이 설정이 활성화되면 브리지 트래픽이 iptables를 통과하여 방화벽 규칙이 적용됨
- net.ipv4.ip_forward = 1: 이 설정은 리눅스 커널에서 IPv4 패킷을 전달하는 기능을 활성화함 즉, 이 설정이 활성화되면 리눅스 시스템이 패킷을 라우팅할 수 있음. 이것은 라우터 또는 게이트웨이로서의 역할을 수행하도록 시스템을 설정하는 데 사용됨.
- net.bridge.bridge-nf-call-ip6tables = 1: 이 설정은 리눅스 커널이 IPv6 브리지 네트워크 트래픽을 ip6tables로 보내도록 하는 것을 제어함. IPv6 패킷에 대한 방화벽 규칙을 적용하기 위해 사용됨
# 커널 매개변수 조정
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 변경사항 적용
sudo sysctl --system
# 쿠버네티스 레포지토리 추가
- 2024년 3월 26일 기준 베이스주소가 기존 k8s -> pkgs로 변경
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl
EOF
# 쿠버네티스 설치 및 자동재기동
sudo dnf -y install kubelet kubeadm kubectl --disableexcludes=kubernetes epel-release
sudo systemctl enable --now kubelet
# 컨테이너 데몬 설정파일 수정
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo vi /etc/containerd/config.toml
---------------------------
......
[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options]
SystemdCgroup = true
......
---------------------------
컨테이너 재기동 및 kubelet 재기동
systemctl restart containerd
systemctl restart kubelet
# kubeadm 실행
- pod-network-cidr : Kubernetes 클러스터 내의 Pod 네트워크의 CIDR (Classless Inter-Domain Routing)를 지정
- apiserver-advertise-address : Kubernetes API 서버가 사용할 IP 주소를 지정 (접속할때 IP -노드IP )
- upload-certs : TLS 인증서를 클러스터 저장소에 업로드하는 데 사용
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.16.10.184 --upload-certs
# 이때 출력되는 연결 명령어 기록
- 2024-03-21
kubeadm join 172.16.10.184:6443 --token ee5ekv.vw8nowkcstbhgmfp \
--discovery-token-ca-cert-hash sha256:78611d8e21170c1b04ce5be8bf38254c082533d474ee7656d33e35f045875fe8
# 별칭 설정
# 단순 설정
alias k=kubectl
# 영구 설정
vi ~/.bashrc
…
alias k=kubectl
# 설정파일 복제 및 권한 부여
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 마스터노드가 워커노드 역할도 수행하게 설정
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
## 워커노드 별도로 존재시 카피
scp /etc/kubernetes/admin.conf 172.16.10.184:/root/.kube/config
# 임시폴더 생성 후 파일 가져오기
cd /usr/local/imsi
curl https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml -O
# kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# calico 설정 파일 수정 (수정이 어려울시 밑의 파일 사용)
vi calico.yaml
---------------------------
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16 (파드가 사용할 IP)
---------------------------
# calico 설정파일 기반 설치
kubectl apply -f calico.yaml
kubectl get pods -o wide -A
# calico-kube-controllers 가 Pending 상태이면 아래명령을 수행하자.
sudo systemctl restart containerd
# pv 생성
- slave node에 폴더 생성 (클러스터용 3개 생성)
mkdir -p /data/volumes/pv1
mkdir -p /data/volumes/pv2
mkdir -p /data/volumes/pv3
# pv 생성 (pvall.yaml파일 )
[root@kubemaster pvctest]# k apply -f pvall.yaml
# 헬름설치
[root@kubemaster ~]#wget https://get.helm.sh/helm-v3.7.0-linux-amd64.tar.gz
[root@kubemaster ~]#tar -zxvf helm-v3.7.0-linux-amd64.tar.gz
[root@kubemaster ~]#sudo mv linux-amd64/helm /usr/local/bin/helm
[root@kubemaster ~]#helm version
# 헬름 레포지토리에 elastic 추가
helm repo add elastic https://helm.elastic.co
# 프로젝트를 위한 elk namespace 생성
k create ns elk
# Elasticsearch / kibana 설치
# install 명령어
helm install elasticsearch elastic/elasticsearch -n elk --values ela_values.yaml
helm install kibana elastic/kibana -n elk --values kib_values.yaml
# uninstall 명령어
helm uninstall elasticsearch -n elk
# 관련 명령어
# 패스워드 조회
kubectl get secrets --namespace=elk elasticsearch-master-credentials -ojsonpath='{.data.password}' | base64 -d
# 토큰 발급
kubectl get secrets --namespace=elk kibana-kibana-es-token -ojsonpath='{.data.token}' | base64 -d
# 인덱스조회
https://172.16.10.184:30000/_cat/indices?v
설명 및 후기
- elasticsearch 기본 계정은 yaml 파일에서 설정가능하다.
- helm은 이미지 보관소이며, values 파일에서 기타 설정값들을 변경후 설치하면 간편하게 설치가능하다.
- 2부에서는 실제 고객사나 사내시스템에 beat 설치하고, elasticsearch와 kibana에서 값을 받아오는것을 포스팅할 예정이다.
- 근데 이걸로 회사내 서비스용서버에 깔아두고, 유지보수하는 업체에 beat 깔아서 모니터링하면 유지보수가 쉽게 되지 않을까? 관제 가능할거같은데? 라는 생각이 든다.
'클라우드 > Kubernetes' 카테고리의 다른 글
[CKA] 자격증 문제 (0) | 2025.02.10 |
---|---|
[RKE2] KTCloud 서버 ElasticSearch 설치 (1) | 2024.12.31 |
[ELK] ElasticSearch 설치 (1) | 2023.10.17 |
[k8s] 명령어 자동 완성 / 별칭 / 약어 정리 (0) | 2023.02.16 |
[OCI] OKE 구성 (0) | 2022.11.25 |