개요
이 시리즈는 코드로 인프라를 구축하는 IaC(Infrastructure as Code)를 이해하기 위해 작성했다.
AWS의 EKS 클러스터를 코드로 구축하고 ArgoCD를 이용해 클러스터 내 어플리케이션을 배포한다.
인프라 구성 방법을 개개인의 노하우와 숙련도가 아닌 자산으로 코드로 남길 수 있도록 한다.
목표
- EKS를 생성하는 다양한 방법에 대해 알아본다.
- EKS 클러스터의 필수요소와 권장요소를 알아본다.
- Terraform으로 EKS 클러스터를 생성해본다.
여
이 글에서는 완전히 실행 가능한 코드를 다루고 있지 않습니다!
대신 충분한 힌트는 드리고 있으니 양해 부탁드립니다!
EKS 클러스터 필수 요소 : 인프라 레벨
클라우드에서 클러스터를 생성하는데는 온프레미스 환경보다 다른 설정이 필요하다
다음은 EKS 클러스터 생성에 필요한 요소들이다.
- 클러스터가 사용할 Subnet
- 클러스터의 Node를 생성할 Node Group
- 클러스터를 생성/삭제/수정할 수 있는 권한
- 클러스터의 리소스를 생성/삭제/수정할 수 있는 권한
- Node Group이 Node를 관리할 수 있는 권한
- 클러스터 내 네트워크를 관리할 수 있는 권한
- ....
그래서 전체적인 필요 요소를 그림으로 그리면 아래와 같다
OIDC Provider는 쉽게 말해 인증을 제 3자가 신원을 보증해주는 것이다.
클러스터 내에 어플리케이션 배포를 할 때,
배포하려는 사람이 누구인줄 알고 권한을 줘? 라고 할때
OICD(여기서는 AWS)가 신원이 확실함을 보증해준다.
이렇듯 클라우드 환경에서는 사용자 권한 설정이 굉장히 중요하다.
AWS에서는 IAM(Identity and Access Management)이라고 하는 리소스로 권한을 설정할 수 있다.
보통 JSON 형식으로 다음과 같은 Default 값을 가진다.
resource "aws_iam_role" "cluster_role" {
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
그리고 다음과 같이 AWS에서 미리 지정해놓은 값을 추가할 수 있다
resource "aws_iam_role_policy_attachment" "eks_cluster_policy" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
role = aws_iam_role.cluster_role.name
}
그리고 이정도 정보만 있으면 빈 깡통에 가까운 EKS 클러스터를 생성할 수 있다.
resource "aws_eks_cluster" "my_cluster" {
name = local.cluster_name
version = local.kubernetes_version
role_arn = aws_iam_role.cluster_role.arn
vpc_config {
subnet_ids = local.subnet_ids
security_group_ids = local.sg_all_nodes_ids
}
depends_on = [aws_iam_role_policy_attachment.eks_cluster_policy]
}
여기에 입맛대로 클러스터 환경을 구축하면 되는데,
필요한 요소는 아래와 같다.
- Node Group
- 네트워크 필수 요소 (Kube Proxy, Core DNS, VPC CNI)
- 스토리지 클래스 (EBS, EFS)
- Load Balancer (ALB)
- 공통 어플리케이션 (Metric Server, Monitoring Dashboard 등)
이 떄, 필요한만큼 Worker Node를 배치할 수 있도록 Node Group과 그에 맞는 권한을 넣어준다.
resource "aws_eks_node_group" "nodes" {
cluster_name = aws_eks_cluster.my_cluster.name
node_group_name = "${local.cluster_name}-nodes"
node_role_arn = aws_iam_role.nodes.arn
# Single subnet to avoid data transfer charges while testing.
subnet_ids = local.subnet_ids
capacity_type = "SPOT" # ON_DEMAND, SPOT
instance_types = "m6i.xlarge"
scaling_config {
desired_size = 3
max_size = 4
min_size = 3
}
update_config {
max_unavailable = 1
}
depends_on = [
aws_iam_role_policy_attachment.nodes_amazon_eks_worker_node_policy,
aws_iam_role_policy_attachment.nodes_amazon_eks_cni_policy,
aws_iam_role_policy_attachment.nodes_amazon_ec2_container_registry_read_only,
]
}
필요한 상황에 따라 instance_type과 scaling_config를 수정하여 적용하면 된다.
(인스턴스 타입 선정에 참고한 자료는 이곳이다.)
여기까지 따라오느라 다들 고생이 많았다.
사실, 더 편하게 AWS에서 제공하는 Module을 사용하는 방법도 있었다.
하지만, 어떤 요소들이 필요하고, 어떤 부분이 생성되는지
알지 못하면 의미가 없다고 생각해서 직접 생성해보았다.
아래 목록에 EKS를 생성하는 다양한 예제를 모아두었으니
이렇게 생성할 수도 있구나! 하고 한번씩 참고해보자
- hashicorp/learn-terraform-provision-eks-cluster (github.com)
- terraform-provider-kubernetes/_examples/eks/README.md at main · hashicorp/terraform-provider-kubernetes (github.com)
- 1. Workshop Introduction :: Terraform EKS Workshop
- tutorials/lessons/138/terraform/06-eks.tf at main · antonputra/tutorials (github.com)
- Terraform EKS Cluster Example (AWS EKS IAM Roles | AWS EKS Load Balancer | AWS EKS Node Group ) Ep 6 - YouTube
EKS 클러스터 필수 요소 : 어플리케이션 레벨
이제 기본 EKS 환경은 갖춰졌으니
어플리케이션 레벨에서 필수 요소만 추가해주면 된다.
설치 코드를 제공하지는 않으려 한다.
이제부터는 설치하는데 굉장히 많은 방법과 조합이 있다.
helm으로 설치하거나 terraform module로 설치하거나 등등
다만, 어떤 이유로 설치하는지는 알고 가도록 하자.
필요 요소는 아래와 같다.
네트워크 필수 요소 (참고자료)
- Kube Proxy : 내부 트래픽을 관리하는 컴포넌트 (서비스 디스커버리 및 로드 밸런싱 처리, 노드 간 통신 관리)
- Core DNS : 클러스터 내 DNS 서비스를 제공하는 컴포넌트 (DNS 주소는 서비스 디스커버리에 사용)
- VPC CNI :클러스터 내에서 파드-파드 및 파드-서비스 간 통신을 위한 네트워크 인터페이스를 관리한다.
스토리지 클래스
- EBS : AWS의 스토리지 서비스, ReadWriteOnce 정책만 허용한다.
- EFS : AWS의 관리형 파일 스토리지 서비스, ReadWriteMany 정책을 허용한다
Load Balancer
- ALB : AWS에서 제공되는 로드 밸런싱 서비스로, 클라이언트 요청을 여러 백엔드 파드로 분산
공통 어플리케이션
- Metric Server : 클러스터 내의 리소스 사용 및 성능 지표를 수집하고 노출하는 컴포넌트
- Monitoring Dashboard : 클러스터의 모니터링 및 리소스 상태를 시각화하는 컴포넌트
- ArgoCD : GitOps 워크플로를 구현하는 컴포넌트, 클러스터 내 어플리케이션을 Git 리포지토리와 동기화시킨다.
마지막에 제시된 ArgoCD는 사실 필수요소는 아니다!
하지만 클러스터를 구축했으면 어플리케이션도 자동으로 배포되어야 한다.
이러한 방법론을 Gitops라고 하는데 이러한 측면에서 ArgoCD는 필수요소이다.
다음 게시글에서 계속 진행하도록 하자!
마무리
이번 시간에는 EKS 생성에 필요한 요소를 알아보고,
테라폼으로 생성하는 간략한 코드를 작성해보았다.
다음 시간에는 어플리케이션 레벨에서 실천하는 IaC인 Gitops의 개념과 ArgoCD 예제를 작성해볼 것이다.
'DevOps' 카테고리의 다른 글
[쿠.짤] 쿠버네티스 짤팁 | 자원 요구사항을 정의하자! (QoS, Priority Class, Resource Quota, LimitRange) (0) | 2023.12.22 |
---|---|
코드로 클러스터 구축하기 - (4) GitOps 적용 (0) | 2023.08.12 |
코드로 클러스터 구축하기 - (2) 네트워크 생성 (0) | 2023.08.10 |
코드로 클러스터 구축하기 - (1) AWS 네트워크 기본 개념 (0) | 2023.08.10 |
Kubeflow 라이징 - Charmed Kubeflow (Optional) (0) | 2023.04.19 |