이 구조도는 AWS에서 Flask 애플리케이션을 실행하기 위해 EKS 클러스터와 Aurora DB를 포함한 하이브리드 클라우드 아키텍처를 보여줍니다. 각 구성 요소의 역할과 전체 아키텍처의 동작 방식을 설명하고, EKS 클러스터를 구축하는 방법을 단계별로 안내하겠습니다.
### 구조도 설명
#### 주요 구성 요소
1. **VPC (Virtual Private Cloud)**:
- AWS 리소스가 배치되는 격리된 네트워크 환경입니다.
2. **Public Subnet**:
- **NAT Gateway**: Private Subnet에 있는 인스턴스들이 인터넷에 접근할 수 있도록 합니다.
- **Bastion Host**: 외부에서 SSH를 통해 Private Subnet의 인스턴스에 접근할 수 있는 보안 게이트웨이 역할을 합니다.
3. **ALB (Application Load Balancer)**:
- 외부 트래픽을 받아 Nginx와 Flask 애플리케이션 서버로 라우팅합니다.
4. **Private Subnet**:
- **Nginx 및 Flask 서버**: Nginx는 리버스 프록시로 사용되고, Flask는 애플리케이션 서버입니다.
- **Auto Scaling 그룹**: 애플리케이션 서버의 수를 자동으로 조절하여 트래픽 부하를 관리합니다.
- **Aurora DB**: 고가용성과 데이터 복원을 위한 다중 AZ 설정이 포함된 관계형 데이터베이스입니다.
### EKS 클러스터 구축 단계
#### 1. AWS CLI 및 필요한 도구 설치
먼저, AWS CLI, eksctl, kubectl을 설치합니다.
- **AWS CLI 설치**:
```bash
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
```
- **eksctl 설치**:
```bash
curl --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_Darwin_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
```
- **kubectl 설치**:
```bash
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
```
#### 2. AWS IAM 설정
EKS 클러스터를 만들기 전에 IAM 역할을 설정해야 합니다. EKS 클러스터와 노드 그룹에 필요한 권한을 부여합니다.
- **IAM 역할 생성**:
- AWS Management Console에서 `IAM`을 열고 `역할`을 클릭합니다.
- `역할 생성`을 클릭하고, `EKS`를 선택한 후 `EKS - Cluster` 역할을 생성합니다.
- `EKS - Node` 역할도 비슷한 방식으로 생성합니다.
#### 3. VPC 및 서브넷 구성
EKS 클러스터를 호스팅할 VPC와 서브넷을 구성합니다. 이미 VPC가 설정된 경우 이 단계를 생략할 수 있습니다.
- **VPC 및 서브넷 생성**:
```bash
eksctl create cluster \
--name my-cluster \
--version 1.21 \
--region us-west-2 \
--vpc-private-subnets subnet-xxxxxxx,subnet-xxxxxxx \
--vpc-public-subnets subnet-xxxxxxx,subnet-xxxxxxx \
--nodegroup-name linux-nodes \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4 \
--managed
```
#### 4. EKS 클러스터 생성
`eksctl`을 사용하여 EKS 클러스터를 생성합니다.
- **EKS 클러스터 생성**:
```bash
eksctl create cluster \
--name my-cluster \
--version 1.21 \
--region us-west-2 \
--nodegroup-name linux-nodes \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4 \
--managed
```
#### 5. 클러스터 설정 확인
클러스터가 성공적으로 생성되었는지 확인합니다.
- **클러스터 설정 확인**:
```bash
aws eks --region us-west-2 update-kubeconfig --name my-cluster
```
- **kubectl로 클러스터 상태 확인**:
```bash
kubectl get nodes
```
#### 6. 애플리케이션 배포
EKS 클러스터에 애플리케이션을 배포합니다. 구조도에 나와 있는 Nginx와 Flask 애플리케이션을 배포합니다.
- **Nginx와 Flask 애플리케이션 배포**:
- **Deployment 및 Service 파일 작성**:
```yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
```
```yaml
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
```
- **kubectl을 사용하여 배포**:
```bash
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
```
#### 7. IAM 역할 연결
EKS와 EC2 인스턴스 간의 권한을 설정하여 필요한 작업을 수행할 수 있도록 합니다.
- **IAM 역할 연결**:
- AWS Management Console에서 EKS 클러스터의 `Compute` 섹션을 열고 `Node IAM Role ARN`을 복사합니다.
- `aws-auth` ConfigMap에 IAM 역할을 추가합니다.
```bash
kubectl edit configmap aws-auth -n kube-system
```
- 다음 내용을 추가:
```yaml
mapRoles: |
- rolearn: arn:aws:iam::<ACCOUNT_ID>:role/<NodeInstanceRole>
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
```
#### 8. CI/CD 설정 (GitHub Actions, Jenkins, ArgoCD)
1. **GitHub Actions 설정**:
- GitHub 저장소에 워크플로우 파일을 작성하여 코드 변경 시 CI/CD 파이프라인이 트리거되도록 설정합니다.
2. **Jenkins 설정**:
- Jenkins를 설치하고, 빌드 파이프라인을 작성하여 Docker 이미지를 생성하고 ECR에 푸시하도록 설정합니다.
3. **ArgoCD 설정**:
- ArgoCD를 설치하고, GitOps 방식으로 애플리케이션을 EKS 클러스터에 배포하도록 설정합니다.
#### 9. 모니터링 설정
1. **CloudWatch 설정**:
- CloudWatch를 통해 인프라 및 애플리케이션의 메트릭을 모니터링합니다.
2. **Lambda 설정**:
- Lambda 함수를 작성하여 이벤트 기반 알림을 설정합니다.
3. **Slack 통합**:
- CloudWatch와 Lambda를 Slack과 연동하여 알림을 받도록 설정합니다.
4. **WhatTap 설정**:
- WhatTap을 사용하여 시스템 성능을 모니터링하고, 문제 발생 시 알림을 받도록 설정합니다.
### 결론
위의 단계를 따라 AWS EKS 클러스터를 설정하고, 애플리케이션을 배포하며, CI/CD 파이프라인을 구성할 수 있습니다. 이 과정은 AWS와 Kubernetes의 다양한 기능을 결합하여 고가용성과 확장성을 제공하는 클라우드 네이티브 애플리케이션을 운영할 수 있게 합니다. 추가적인 설정과 세부적인 명령어는 AWS 문서와 각 도구의 공식 문서를 참고하여 진행하면 됩니다.
'DevOps' 카테고리의 다른 글
[k8s] 쿠버네티스를 활용하여 웹 서비스 배포하기 (django) (0) | 2024.06.21 |
---|---|
[k8s] 쿠버네티스 인그레스 알아보기 ingress (0) | 2024.06.20 |
[k8s] Amazon EKS로 웹 애플리케이션 구축해보기(환경 구축) - 1 (0) | 2024.06.19 |
[k8s] 쿠버네티스 스토리지 볼륨이 뭘까? (0) | 2024.06.18 |
[k8s] 쿠버네티스 서비스 개념 부수기 (0) | 2024.06.18 |