728x90
반응형
3 쿠버네티스 모듈
AWS에서 제공하는 EKS를 사용해 쿠버네티스 클러스터를 구성
EKS 클러스터는 쿠버네티스 시스템 소프트웨어를 호스팅하는 컨트롤 플레인과 마이크로서비스가 실행될 VM을 호스팅하는 노드 그룹을 포함
3.1 깃 클론
c:\msur> git clone https://github.com/naanjini/module-aws-kubernetes.git
3.2 EKS 클러스터 모듈 정의
C:\msur\module-aws-kubernetes\main.tf
AWS 공급자 선언 및 클러스터 액세스 관리
전체 클러스터 수준에서 EKS가 노드나 VM에서 마이크로서비스를 실행할 수 있는 정책과 보안 규칙을 정의
# AWS 공급자 선언
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs
provider "aws" {
region = var.aws_region
}
locals {
cluster_name = "${var.env_name}-${var.cluster_name}"
}
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role
resource "aws_iam_role" "sk403-003-ms-cluster" {
name = "${local.cluster_name}-role"
# 임시자격증명을 받을 수 있도록 정책을 설정
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
# 관리형 IAM 정책을 IAM 역할에 연결
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment
resource "aws_iam_role_policy_attachment" "sk403-003-ms-cluster-AmazonEKSClusterPolicy" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
role = aws_iam_role.sk403-003-ms-cluster.name
}
네트워크 보안 정책을 정의
네트워크로 들어오고 나가는 트래픽의 종류를 보안 그룹 설정을 통해 제한
아웃바운드 트래픽(egress)은 무제한 허용하지만, 인그레스 규칙을 정의하지 않았으므로 인바운드 트래픽은 허용하지 않음
# 관리형 IAM 정책을 IAM 역할에 연결
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment
resource "aws_iam_role_policy_attachment" "sk403-003-ms-cluster-AmazonEKSClusterPolicy" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
role = aws_iam_role.sk403-003-ms-cluster.name
}
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
resource "aws_security_group" "sk403-003-ms-cluster" {
name = "${local.cluster_name}-sg"
vpc_id = var.vpc_id
# 수신 규칙 (인바운드 규칙)
# ingress {
# from_port = 0
# to_port = 0
# protocol = "-1" # -1은 모두(all)를 의미하며, from_port, to_port의 값을 0으로 설정해야 함
# cidr_blocks = ["0.0.0.0/0"]
# self = true
# }
# 송신 규칙 (아웃바운드 규칙)
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
# self = true
}
tags = {
Name = "ms-up-running"
}
}
클러스터에 대한 선언을 추가
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_cluster
resource "aws_eks_cluster" "ms-up-running" {
name = "${local.cluster_name}-cls"
role_arn = aws_iam_role.sk403-003-ms-cluster.arn
vpc_config {
security_group_ids = [aws_security_group.sk403-003-ms-cluster.id]
subnet_ids = var.cluster_subnet_ids
}
depends_on = [
aws_iam_role_policy_attachment.sk403-003-ms-cluster-AmazonEKSClusterPolicy
]
}
EKS 노드 그룹에 적용할 역할과 정책을 정의
생성된 모든 노드가 Amazon Container Registry 및 VM 서비스와 통신할 수 있도록 허용
# 노드 역할
resource "aws_iam_role" "ms-node" {
name = "${local.cluster_name}-node-role"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
# 노드 정책
resource "aws_iam_role_policy_attachment" "ms-node-AmazonEKSWorkerNodePolicy" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"
role = aws_iam_role.ms-node.name
}
resource "aws_iam_role_policy_attachment" "ms-node-AmazonEKS_CNI_Policy" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
role = aws_iam_role.ms-node.name
}
resource "aws_iam_role_policy_attachment" "ms-node-AmazonEC2ContainerRegistryReadOnly" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
role = aws_iam_role.ms-node.name
}
EKS 노드 그룹을 정의
resource "aws_eks_node_group" "ms-node-group" {
cluster_name = aws_eks_cluster.ms-up-running.name
node_group_name = "sk403-003-microservices"
node_role_arn = aws_iam_role.ms-node.arn
subnet_ids = var.nodegroup_subnet_ids
scaling_config {
desired_size = var.nodegroup_desired_size
max_size = var.nodegroup_max_size
min_size = var.nodegroup_min_size
}
disk_size = var.nodegroup_disk_size
instance_types = var.nodegroup_instance_types
depends_on = [
aws_iam_role_policy_attachment.ms-node-AmazonEKSWorkerNodePolicy,
aws_iam_role_policy_attachment.ms-node-AmazonEKS_CNI_Policy,
aws_iam_role_policy_attachment.ms-node-AmazonEC2ContainerRegistryReadOnly,
]
}
kubeconfig 파일 생성
생성된 클러스터를 기반으로 큐브 구성 파일 생성
# Create a kubeconfig file based on the cluster that has been created
# https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file
resource "local_file" "kubeconfig" {
content = <<KUBECONFIG
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ${aws_eks_cluster.ms-up-running.certificate_authority.0.data}
server: ${aws_eks_cluster.ms-up-running.endpoint}
name: ${aws_eks_cluster.ms-up-running.arn}
contexts:
- context:
cluster: ${aws_eks_cluster.ms-up-running.arn}
user: ${aws_eks_cluster.ms-up-running.arn}
name: ${aws_eks_cluster.ms-up-running.arn}
current-context: ${aws_eks_cluster.ms-up-running.arn}
kind: Config
preferences: {}
users:
- name: ${aws_eks_cluster.ms-up-running.arn}
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
command: aws-iam-authenticator
args:
- "token"
- "-i"
- "${aws_eks_cluster.ms-up-running.name}"
KUBECONFIG
filename = "kubeconfig"
}
3.3 입력 값 정의
C:\msur\module-aws-kubernetes\variables.tf
variable "aws_region" {
description = "AWS region ID for deployment (e.g. eu-west-1)"
type = string
default = "us-west-2"
}
variable "env_name" {
type = string
}
variable "cluster_name" {
type = string
}
variable "vpc_id" {
type = string
}
variable "cluster_subnet_ids" {
type = list(string)
}
variable "nodegroup_subnet_ids" {
type = list(string)
}
variable "nodegroup_desired_size" {
type = number
default = 1
}
variable "nodegroup_min_size" {
type = number
default = 1
}
variable "nodegroup_max_size" {
type = number
default = 5
}
variable "nodegroup_disk_size" {
type = string
}
variable "nodegroup_instance_types" {
type = list(string)
}
3.4 출력 값 정의
C:\msur\module-aws-kubernetes\outputs.tf
# EKS 클러스터의 식별자
output "eks_cluster_id" {
value = aws_eks_cluster.ms-up-running.id
}
output "eks_cluster_name" {
value = aws_eks_cluster.ms-up-running.name
}
# 클러스터가 준비되고 작동할 때 다른 모듈에서 클러스터에 접근하는데 사용되는 값
output "eks_cluster_certificate_data" {
value = aws_eks_cluster.ms-up-running.certificate_authority.0.data
}
output "eks_cluster_endpoint" {
value = aws_eks_cluster.ms-up-running.endpoint
}
output "eks_cluster_nodegroup_id" {
value = aws_eks_node_group.ms-node-group.id
}
3.5 형식 지정, 작업 디렉터리 초기화, 구성 검사
C:\msur\module-aws-kubernetes> terraform fmt
C:\msur\module-aws-kubernetes> terraform init
C:\msur\module-aws-kubernetes> terraform validate
3.6 깃허브 저장소에 푸시
C:\msur\module-aws-kubernetes> git add .
C:\msur\module-aws-kubernetes> git commit -m "쿠버네티스 모듈 생성"
C:\msur\module-aws-kubernetes> git push origin
3.7 샌드박스 환경에 쿠버네티스 클러스터 생성
쿠버네티스 클러스터 모듈 추가
C:\msur\env-sandbox\main.tf
… (생략) …
# EKS 클러스터 구성
module "aws-eks" {
source = "git::https://github.com/naanjini/module-aws-kubernetes.git"
env_name = local.env_name
aws_region = local.aws_region
cluster_name = local.k8s_cluster_name
vpc_id = module.aws-network.vpc_id
cluster_subnet_ids = module.aws-network.subnet_ids
nodegroup_subnet_ids = module.aws-network.private_subnet_ids
nodegroup_disk_size = "20"
nodegroup_instance_types = ["t3.medium"]
nodegroup_desired_size = 1
nodegroup_min_size = 1
nodegroup_max_size = 3
}
# TODO 깃옵스 구성
형식 지정, 작업 디렉터리 초기화, 구성 검사
c:\msur\env-sandbox> terraform fmt
c:\msur\env-sandbox> terraform init
c:\msur\env-sandbox> terraform validate
릴리스 태그 지정 및 깃허브 저장소에 푸시
c:\msur\env-sandbox> git add .
c:\msur\env-sandbox> git commit -m "쿠버네티스 클러스터 구성"
c:\msur\env-sandbox> git push
c:\msur\env-sandbox> git tag -a v1.1 -m "쿠버네티스 클러스터 구성"
c:\msur\env-sandbox> git push origin v1.1
워크플로 실행 확인
클러스터 생성 확인
c:\msur\env-sandbox> aws eks list-clusters
{
"clusters": [
"sandbox-sk403-003-ms-cluster-cls"
]
}
3.8 생성한 리소스 모두 삭제
c:\msur\env-sandbox> terraform destroy
:
Plan: 0 to add, 0 to change, 26 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
:
module.aws-eks.aws_iam_role.sk403-003-ms-cluster: Destruction complete after 1s
Destroy complete! Resources: 26 destroyed.
728x90
반응형
댓글