티스토리 뷰
목차
2. 인프라 설정 및 Nginx 띄워보기 👈 here
4. ELK Stack으로 로그 모니터링 시스템 구축하기
이번에는 인프라를 설정하고 쿠버네티스로 Nginx index 페이지에 접근해 보는 것까지 진행해 보겠다.
나는 네이버 클라우드 플랫폼의 쿠버네티스 컨테이너 서비스를 사용하여 쿠버네티스 클러스터를 생성했다.
네트워크 설정하기
쿠버네티스 클러스터를 설정하기 전에 몇 가지 선수 작업이 있다.
간단한 개념과 함께 살펴보자.
1. VPC 생성하기
VPC는 논리적으로 격리된 네트워크 공간으로, 사용자가 VPC 별로 자체 네트워크 환경을 구축하고 리소스를 관리할 수 있도록 도와준다.
IP 주소 범위는 private 대역(10.0.0.0/8,172.16.0.0/12,192.168.0.0/16) 안에서 생성해 주면 된다.
2. 서브넷 생성하기
서브넷은 VPC 내에서 망을 더 쪼갠 개념으로, 하나의 VPC IP 대역 안에서 여러 개의 서브넷을 생성할 수 있다. 인터넷 게이트웨이 연결 여부에 따라 public과 private으로 나뉜다. 나는 클러스터를 private으로 세팅하기 위해 서브넷 역시 private으로 생성했다.
3. 라우팅 테이블 생성하기
VPC 내에 public용, private용 라우팅 테이블을 생성하고 서브넷과 매핑시켜 주어야 한다. 그래야 트래픽이 들어왔을 때 어디에서 목적지를 찾을지 알 수 있다. public 라우팅 테이블에는 인터넷 게이트웨이를 연결했다면, private 라우팅 테이블에는 NAT 게이트웨이를 연결한다. 기본적으로 private 서브넷은 인바운드/아웃바운드 모두 인터넷 연결이 불가능하다. 그러나 리소스 설치 등 내부에서 인터넷이 필요한 경우가 있기 때문에, 아웃바운드에 한해 인터넷 연결이 가능하도록 하는 것이 NAT 게이트웨이이다.
모든 외부 트래픽 요청이 가능하도록 아래와 같이 NATGW(NAT 게이트웨이)를 추가해 주었다.
쿠버네티스 클러스터 생성하기
네트워크 설정을 마쳤으니 이제 쿠버네티스 클러스터를 생성해 보자.
옵션 중 몇 가지를 살펴보면,
- CNI Plugin : CNI란 Container Network Interface로 컨테이너 내 네트워크 통신 제어에 대한 인터페이스로, 쿠버네티스에서는 Pod 간의 통신에서 사용된다. NCP에서는 cilium이라는 플러그인하나만 제공하고 있다.
- VPC : 위에서 생성해 준 VPC를 선택해 주면 된다.
- 가용 Zone : 생성한 서브넷과 같은 AZ를 선택해 준다.
다음 페이지에서는 노드를 추가할 수 있다.
옵션 정보 추가와 노드를 추가하고 등록하면 아래와 같이 생성된다.
그리고 노드 수 = 인스턴스 수이기 때문에 서버 메뉴에 들어가 보면 서버가 2개 생성된 것도 확인할 수 있다.
kubectl 설치 및 클러스터 연결하기
쿠버네티스 클러스터를 띄웠으니 이제 접근해 보자. 우선 앞서 설정한 것처럼 private 클러스터로 세팅했기 때문에 외부에서 바로 접근할 수가 없다. 물론 인증키를 사용해서 서버 접속은 가능하지만 여러 개의 서버를 띄운 입장에서 서버 하나씩 들어가 확인하는 것은 목표한 바가 아니다. 쿠버네티스 관리용 CLI인 kubectl을 사용해 접근 및 세팅해 볼 것이다.
kubectl은 연습하는 입장에서 로컬에 세팅해도 되지만, 나는 베스천 서버를 하나 파서 거기다 kubectl를 설치해 주었다.
kubectl 설치 가이드:
다음으로 NCP에서 제공하는 ncp-iam-authenticator 인증을 사용하여 IAM인증이 적용된 kubeconfig를 가져와 볼 것이다.
ncp-iam-authenticator 설치 가이드 : https://guide.ncloud-docs.com/docs/k8s-iam-auth-ncp-iam-authenticator
kubectl을 설치할 서버에 아래와 같이 인증키를 세팅해 준다. 인증키는 마이페이지 > 계정관리 > 인증키 관리에서 발급받으면 된다.
$ export NCLOUD_ACCESS_KEY=ACCESSKEYIDACCESSKEY
$ export NCLOUD_SECRET_KEY=SECRETACCESSKEYSECRETACCESSKEYSECRETACCE
$ export NCLOUD_API_GW=https://ncloud.apigw.ntruss.com
또는 confiure파일을 하나 생성하여 추가할 수도 있다.
$ cat ~/.ncloud/configure
[DEFAULT]
ncloud_access_key_id = ACCESSKEYACCESSKEYAC
ncloud_secret_access_key = SECRETKEYSECRETKEYSECRETKEYSECRETKEYSECR
ncloud_api_url = https://ncloud.apigw.ntruss.com
그런 다음 아래명령어로 config파일에 클러스터 정보를 업데이트할 수 있도록 한다.
region-code는 KR, clusteruuid는 클러스터 상세정보에서 확인할 수 있다.
ncp-iam-authenticator update-kubeconfig --region <region-code> --clusterUuid <cluster-uuid>
그런 다음 아래 명령어로 클러스터 정보를 잘 가져오나 테스트해 본다.
에러 없이 보여주는 정보가 있다면 세팅이 잘된 것이다!
Nginx Pod 배포하고 접근해 보기
쿠버네티스도 띄우고, kubectl까지 클러스터와 연동에 성공했으니 이제 nginx를 띄어보고 외부에서 접근해 보자.
디플로이먼트 오브젝트를 사용해서 배포해보려 한다. 아래와 같이 작성한다.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.2
name: nginx
ports:
- containerPort: 80
protocol: TCP
각 요소에 대해 살펴보면,
- apiVersion : 쿠버네티스 api를 사용하여 리소스 개체를 읽고 쓰기 때문에 그에 맞는 버전을 적어주면 된다. 해당 문서에서 리소스 별 apiVersion을 확인할 수 있다.
- kind: 리소스의 종류를 명시한다.
- metadata: 리소스의 라벨과 이름을 지정하는 하나의 큰 범주이다.
- labels: key와 value를 임의로 지정할 수 있다. 예시에는 app key와 nginx value를 설정한 것이다. 이 레이블을 기준으로 리소스를 탐색할 수 있다.
- name : 리소스에 대한 이름으로 필수값이다.
- spec : 리소스에 대한 상세 설명을 담는다.
- replicas: 유지할 파드의 개수를 의미한다.
- selector: selector 하위의 정보로 감시할 리소스를 필터링한다. 여기서는 레이블의 key가 app이고 값이 nginx인(matchLables) pod에 대해서 감시한다는 의미로 해석된다.
- template: 새 pod를 론칭하는 데 사용되는 템플릿으로 예시에서는 metadata를 사용하여 label을 추가하고 spec에서 container image와 연결 포트 및 프로토콜을 지정했다.
아래 yml파일을 작성한 후 apply명령어로 deployment를 실행시키고 최종적으로 pod가 띄워진다.
kubectl apply -f nginx-deployment.yaml
pod 정보를 확인한다.
deployment도 확인할 수 있다.
참고로 컨테이너를 삭제하고 싶으면 pod가 아닌 deployment를 삭제해야 된다. pod를 삭제하면 replicas에 설정된 유지 개수 옵션에 의해 다시 새로 뜬다 ^,,^
kubectl delete deployment nginx
오 이제 nginx 컨테이너까지 띄웠다. 어떻게 접근해야 할까? 앞서 설명한 것처럼 private클러스터이기 때문에 바로 접근이 불가능하다.
바로, public 로드밸런서와 연결되는 Service를 생성하는 것이다.! 아래와 같이 작성한다.
kind: Service
apiVersion: v1
metadata:
name: nginx
annotations:
service.beta.kubernetes.io/ncloud-load-balancer-layer-type: "nlb"
service.beta.kubernetes.io/ncloud-load-balancer-internal: "true"
service.beta.kubernetes.io/ncloud-load-balancer-size: "SMALL"
spec:
ports:
- port: 80
targetPort: 80
selector:
run: nginx
type: LoadBalancer
서비스(Service)는 파드에서 실행되는 애플리케이션을 네트워크에 노출시키는 역할을 한다. 파드가 죽고 새로 뜰 때마다 IP가 변하기 때문에 파드를 네트워크에 직접 노출시키는 것이 아닌 서비스에서 파드를 관리하고 서비스로 네트워크 요청이 들어오면 적절한 파드를 찾아 트래픽을 전달하는 것이다.
spec부분의 type에서 LoadBalaner로 지정해 줌으로써 로드밸런서가 생성되고, 브라우저에서 접근이 가능해진다.
다음 명령어로 서비스를 추가하고 등록 여부를 확인한다.
kubectl apply -f nginx-svc-lb.yml
kubectl get svc
EXTERNAL-IP에 나타난 호스트는 실제로 NCP의 로드밸런서 메뉴에서도 확인할 수 있다.
그리고 해당 호스트로 접근해 보면 반가운 nginx index 페이지를 만날 수 있다.!
혹시 접근이 안된다면, 로드밸런서가 public이 맞는지 확인을 해봐야 한다. 80 포트로 설정하지 않았다면 포트번호도 붙여야 한다.
다음 포스팅에서는 CD 지원도구인 ArgoCD를 세팅해 보겠다.
'개발계발 > Project' 카테고리의 다른 글
[kubernetes로 모니터링시스템 구축하기] 0. 프로젝트 시작 (0) | 2023.05.03 |
---|---|
[kubernetes로 모니터링시스템 구축하기] 5. Prometheus와 Grafana 사용해보기 (0) | 2023.05.02 |
[kubernetes로 모니터링시스템 구축하기] 4. ELK Stack으로 로그 모니터링 시스템 구축하기 (0) | 2023.05.02 |
[kubernetes로 모니터링시스템 구축하기] 3. ArgoCD 개념 파악 및 배포하기 (1) | 2023.05.01 |
[kubernetes로 모니터링시스템 구축하기] 1. 쿠버네티스 구성 살펴보기 (0) | 2023.05.01 |
- Total
- Today
- Yesterday
- elasticsearch
- Supervisor
- NCP
- Pydantic
- fastapi
- OAuth
- Project
- kubernetes
- grafana
- JWT
- coroutine
- kibana
- supervisord
- bugfix
- numble
- jwt로그인
- DevOps
- factory_boy
- pytest
- await
- logstash
- miniproject
- ArgoCD
- elk
- async
- sns로그인
- kubectl
- GitOps
- gradle
- promethus
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |