概要
- TerraformとAnsibleを用いて、AWS EKSでK8Sクラスタをプロビジョニングしてみた
Fargate
- 正体はPod単位にプロビジョニングされるマイクロVM
- EFSのアタッチは可能だが、EBSのアタッチは不可
- そのため、永続性IOはネットワーク越しになる
- ノード自体の管理が不要
- 高い可用性のコントロールプレーンに向いている
Managed Node Group
- 同じAMI、SG、インスタンスタイプの管理型EC2ノードであり
- DaemonSetのPodデプロイ、AWS EBS CSIドライバによるEBSアタッチが可能
- STSでデプロイされるPostgresql・Redis・Kafka等の永続性IOをデプロイする
Terraform EKS Module
module "eks" { # TerraformのEKSモジュールを転用する
source = "terraform-aws-modules/eks/aws"
version = "~> 20.31"
cluster_name = local.cluster_name
cluster_version = var.cluster_version
cluster_endpoint_public_access = true # 学習用であるため、EKSのパブリックアクセスを許可する
enable_cluster_creator_admin_permissions = true
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
cluster_addons = {
coredns = {
most_recent = true
configuration_values = jsonencode({
computeType = "Fargate" # corednsはデフォルトでinstance・MNGにデプロイされるが、コントロールプレーンをFargateに乗せるためにcomputeTypeを変更する
resources = {
limits = { cpu = "0.25", memory = "256M" }
requests = { cpu = "0.25", memory = "256M" }
}
})
}
kube-proxy = {
most_recent = true
}
vpc-cni = {
most_recent = true
}
aws-ebs-csi-driver = { # AWS EBS CSI ドライバーをアドオンとして設置する
most_recent = true
service_account_role_arn = module.ebs_csi_irsa.iam_role_arn # EBS操作のためのIRSAを指定
}
}
fargate_profiles = { # Fargateをプロビジョニングして動作するPodを指定する
for ns in var.fargate_namespaces : ns => { # 今回はネームスペースが「kube-system」と「argocd」のPodをFargateでプロビジョニングする
name = "fp-${ns}"
selectors = [
{ namespace = ns }
]
subnet_ids = module.vpc.private_subnets
}
}
eks_managed_node_groups = {
workloads = {
ami_type = "AL2_x86_64"
instance_types = var.nodegroup_instance_types
capacity_type = "ON_DEMAND"
min_size = var.nodegroup_min_size
max_size = var.nodegroup_max_size
desired_size = var.nodegroup_desired_size
labels = {
role = "workloads"
}
}
}
}
IRSA
- PodにAWSリソースにアクセスする権限を与えるための認証・認可仕組み
- OIDCプロバイダーをクラスタに設置し、IAMロールとサービスアカウントを結びつけることで
- 最小権限原則を守りつつ、PodにAWSリソースアクセス権限を持たせる
