본문 바로가기
카테고리 없음

마이크로서비스 인프라 구축 2

by ^..^v 2022. 3. 17.
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
반응형

댓글