ํ ๋ผํผ์ Code ๋ก ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ๋์์ฃผ๋ IaC Tool ์ ๋๋ค.
ํนํ AWS ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ๋ ์ฐธ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ฃ .
module ์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ง ์๊ฒ VPC, EKS, ELB ๋ฅผ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ํ ๋ผํผ์ ์ด์ฉํด EKS ๋ฅผ ๊ตฌ์ถํ๋ ๊ณผ์ ์์ ๊ฒช์ ๋ฌธ์ ์ ๊ณผ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณผ๊น ํฉ๋๋ค.
์ฐ์ Apply!!
terraform-aws-eks ์ ๊ฐ๋ณด๋ฉด ์์ฃผ ์น์ ํ๊ฒ ํ ๋ผํผ์ ์ด์ฉํด EKS ๋ฅผ ๊ตฌ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ ค์ค๋๋ค.
๋ฌด์์ eks ๋ชจ๋์ import ํ๊ณ example ๊ณผ EKS Best Practices Guides ์ฐธ๊ณ ํ์ฌ ํ ๋ผํผ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.
provider "kubernetes" {
host = module.eks-main.cluster_endpoint
cluster_ca_certificate = base64decode(module.eks-main.cluster_certificate_authority_data)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
command = "aws"
args = ["eks", "get-token", "--cluster-name", module.eks-main.cluster_id, "--profile", "dev"]
}
}
module "eks-main" {
source = "registry.terraform.io/terraform-aws-modules/eks/aws"
cluster_name = local.name
cluster_version = local.cluster_version
cluster_endpoint_public_access = false
cluster_endpoint_private_access = true
manage_aws_auth_configmap = true
aws_auth_users = [...]
...
}
์ธํฐ๋ท์ผ๋ก ๋๊ฐ ํ์๊ฐ ์์ด private_access ๋ง true ๋ก ๋์์ต๋๋ค.
...
cluster_endpoint_public_access = false
cluster_endpoint_private_access = true
...
์คํํด๋ณด์ฃ ! ๐
(ํ๋ฒ์ ๊ฐ์!)
$ terraform plan
$ terraform apply
์์ฃผ ์๋ง๋ค์ด ์ง๊ณ ์์ต๋๋ค ๐
๋ชจ๋ ๊ฒ์ด ์ํํ๊ฒ ๋ง๋ค์ด์ง๊ณ ์๋ค๊ฐ ๊ฐ์๊ธฐ...
Error: The configmap "aws-auth" does not exist
๋ผ๋ ๋ฌธ๊ตฌ ๋จ๋๋ failed ๋์์ต๋๋ค.
์ฝ์ด๋ณด๋ "aws_auth" ๋ผ๋ configmap ์ ์ฐพ์ ์ ์๋ค๊ณ ํ๋ค์..
"aws_auth" ๋ EKS ๋ด์์ ์ฌ์ฉํ AWS IAM ์ ๋ฑ๋กํ ์ ์๋ configmap ์ ๋๋ค. ๋๊ตฐ์ ์๋ก์ด ์ ์ ์ ์ ๊ทผ์ ํ์ฉํ๋ ค๋ฉด ์ฌ๊ธฐ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋์ฃ !
๋ณดํต EKS ๋ฅผ ์์ฑํ๋ฉด ์๋์ผ๋ก ์์ฑ์์ผ์ฃผ๋ ๋ฐ ์ ์ฐพ์ง ๋ชปํ๋ ๊ฑธ๊น์..?? ๐คจ
๋ ํ๋ฒ์ ๋๋ฉด ์ด์ํ์ง..๐ง
์ค๋ ์ ์์ด์ง๊ณ .. ๋ฐ๋ก ๊ตฌ๊ธ๋ง์ ์๋ํด ๋ณด์์ต๋๋ค!!
๋คํํ Issues ์ ์ ์ ๊ฐ์ ๋ฌธ์ ๋ ๊ฒช๋ ์ฌ๋๋ค์ด ๋ง์ต๋๋ค ๐ค
์ ๋ ์์ ํ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ์ฌ์ง์ด ์ฝ๋ฉํธ๋ 69๊ฐ๊ฐ ๋๋ ๊ฑธ ๋ณด๋ ์ํํ๊ฒ ํด๊ฒฐํ ์ ์์๊ฑฐ ๊ฐ์์ ๐
์ฒซ๋ฒ์งธ ์๋ 1๏ธโฃ
์~ create_aws_auth_configmap = true ๋ฅผ ์ถ๊ฐํด์ผ ํ๋๊ตฐ์?
๐ ์ด 4๊ฐ์ธ๊ฑธ ๋ณด๋ ๋ฏฟ์์ด ๊ฐ๋๋ค! ๋ฐ๋ก ์ถ๊ฐํด๋ณด์ฃ !
module "eks-main" {
source = "registry.terraform.io/terraform-aws-modules/eks/aws"
cluster_name = local.name
cluster_version = local.cluster_version
cluster_endpoint_public_access = false
cluster_endpoint_private_access = true
create_aws_auth_configmap = true //์ถ๊ฐ
manage_aws_auth_configmap = true
aws_auth_users = [...]
...
}
๋ฐ๋ก ์คํจํด๋ฒ๋ฆฝ๋๋ค..
๊ทผ๋ฐ ์๋ฌ ๋ฌธ๊ตฌ๊ฐ ์ข ๋ฐ๋์์ต๋๋ค.
์ด๋ฏธ ์กด์ฌํ๋๊ตฐ์...
๋ชจ๋์ ์ฝ๋๋ฅผ ์ง์ ํ์ธํด๋ณด์ฃ !
resource "kubernetes_config_map" "aws_auth" {
count = var.create && var.create_aws_auth_configmap ? 1 : 0
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = local.aws_auth_configmap_data
lifecycle {
# We are ignoring the data here since we will manage it with the resource below
# This is only intended to be used in scenarios where the configmap does not exist
ignore_changes = [data]
}
}
create_aws_auth_configmap ์ true ๋ก ์ฃผ๋ฉด kube-system ์ด๋ผ๋ ๋ค์์คํ์ด์ค์ aws-auth ๋ผ๋ ConfigMap ์ ์์ฑ์์ผ์ค๋ค๊ณ ์ถ์ธกํ ์ ์๊ฒ ๊ตฐ์.
๊ทผ๋ฐ ์ด๋ฏธ EKS Cluster ๋ฅผ ์์ฑํ๋ฉด์ ๋ด๋ถ์ aws-auth ๋ผ๋ configmap ์ด ์กด์ฌํฉ๋๋ค.
resource "kubernetes_config_map_v1_data" "aws_auth" {
count = var.create && var.manage_aws_auth_configmap ? 1 : 0
force = true
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = local.aws_auth_configmap_data
depends_on = [
# Required for instances where the configmap does not exist yet to avoid race condition
kubernetes_config_map.aws_auth,
]
}
manage_aws_auth_configmap ์ true ๋ก ์ฃผ๋ฉด ๋ฆฌ์์ค์ ์ ์๋ ์ฝ๋๊ฐ ์คํ๋๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
force ๋ผ๋ ์ต์ ๋๋ฌธ์ ๊ธฐ์กด์ ์๋ aws-auth ๋ ์ฌ์ ์ ๋๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ฒซ๋ฒ์งธ ์๋ ๊ฒฐ๊ณผ ๐
์ด๋ฏธ EKS Cluster ๊ฐ ์์ฑ๋ ๋ aws-auth ๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ ๊ฑธ ํ์ธํ ์ ์๊ณ ,
create_aws_auth_configmap ์ต์ ์ ๋ค์ ํ๋ฒ aws-auth ์์ฌํจ์ผ๋ก์จ ์ค๋ณต ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๊นํ์ ๋ฌ๋ฆฐ ์ด ์ฝ๋ฉํธ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ ๋ถ์กฑํ๊ตฐ์..
๋๋ฒ์งธ ์๋ 2๏ธโฃ
์๋๋ก ๋ด๋ฆฌ๋ค๋ณด๋ฉด ์๋์ ๊ฐ์ ์ฝ๋ฉํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
Make sure you are on VPN or in the network you want to access cluster from
๋จธ๋ฆฟ์์ ๋ฌด์ธ๊ฐ๊ฐ ์ค์ณ๊ฐ๋๋ค๐ก
์ฌ๋นจ๋ฆฌ ๊ณต์ ๋ฌธ์๋ฅผ ํ์ธํด๋ณด์ฃ !!
์ค๋ง๋ฆฌ๊ฐ ๋ณด์ ๋๋ค. ์ ๋ ์์์ Endpoint ๋ฅผ private ๋ง ์ฃผ์์ต๋๋ค.
์๋ํ๋ฉด DEV ํ๊ฒฝ์ ์ธํฐ๋ท์ ํตํด ์ ๊ทผํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ ์ ๋ ์๋ก์ด VPC ์ EKS ๋ฅผ ๋ฐฐํฌํ๊ณ ์๊ณ ์ !!
๊ฐ์ด ์ค์๋์?๐ค
์ง๊ธ EKS ๊ฐ ์๋ VPC ๋ ์ด๋ VPC ์๋ Peer or Share ๋๊ณ ์์ง ์์ต๋๋ค. ์ด ๋ง์ ์์ ํ ๊ฒฉ๋ฆฌ๋ VPC ๋ผ๋ ๊ฑฐ์ฃ . ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์ด๋ ์ต๋๋ค.
์ ๋ ์ง๊ธ ์ํฉ์ผ๋ก๋ ์ ๊ฒฉ๋ฆฌ๋ VPC ๋ด์ ์กด์ฌํ๋ EKS ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ด๊ฒ ์ ๋ง์ธ์ง ๊ฒ์ฆํด๋ณด๊ธฐ ์ํด ์์ฑํ EKS API ์๋ฒ์ curl ๋ช ๋ น์ด๋ฅผ ์คํํ์ต๋๋ค.
$ TOKEN=${aws eks get-token --cluster-name <cluster-name>}
$ curl --header "Authorization: Bearer ${TOKEN}" -k -X GET ${APISERVER}/api/v1/namespaces/kube-system/configmaps
์ ๊ฐ์ด ๋ง๋ค๋ฉด ์๋ต์ ์ค์ง ์์ ๊ฒ์ ๋๋ค.
curl: (28) Failed to connect to <API Server> 443 after 214968 ms: Connection timed out
์์ํ๋ ๋๋ก์ ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํด์ผ ์ VPC ๋ด์ ์๋ EKS Api Server ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊น์?๐ง
ํด๊ฒฐ?! ๐ค
๋ค์ํ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ์ ๊ฒฉ๋ฆฌ๋ VPC ์ ์ ๊ทผํ๊ธฐ ์ํด ์ ๋ ๋ค์ 2๊ฐ์ง๋ฅผ ๊ณ ๋ คํด๋ดค์ต๋๋ค.
- Bastion Host(Public) ์ด์ฉํด์ ์ ๊ทผ
- TGW ๋ฅผ ์ด์ฉํ ์ ๊ทผ
์ฌ๊ธฐ์ 1๋ฒ ๋ฐฉ๋ฒ์ ํตํด ์งํํด๋ณด๊ฒ ์ต๋๋ค ๐
(์ค์ ๋ก๋ 2๋ฒ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค)
์งํ ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํฉ๋๋ค. EKS ๊ฐ ๋ฐฐํฌ๋ VPC ์์ EC2 ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ํตํด ์ ๊ทผํฉ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ๋๊ฒ ์ฃ .
Bastion Host ๋ ํผ๋ธ๋ฆญ์ ์กด์ฌํ๋ ์ฌ๊ธฐ๋ก ssh ํ ํ Host ์์์ ํธ์ถํ๋ ๊ฒ๋๋ค.
๊ทธ๋ผ Bastion Host ์ ์ ์ํ์ฌ ๋ค์ ํ๋ฒ ๋ช ๋ น์ด๋ฅผ ๋ ๋ ค๋ณด์ฃ ๐ฅ๐ฅ
$ curl --header "Authorization: Bearer ${TOKEN}" -k -X GET ${APISERVER}/api/v1/namespaces/kube-system/configmaps
์ด.. ๊ทผ๋ฐ ์ด์ํฉ๋๋ค...
curl: (28) Failed to connect to <API Server> 443 after 214968 ms: Connection timed out
์์๊ณผ ๋ค๋ฅด๊ฒ time out ์ด ๋ฐ์ํฉ๋๋ค.. ๐ณ๐ณ๐ณ๐ณ๐ณ
VPC ๋ด๋ถ์ ์ ๊ทผํด์ curl ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฌ๋ฉด ๋ชปํด๋ 4xx ์ฝ๋๋ ์ฌ ์ค ์์์ต๋๋ค..
๋ค์ ํ๋ฒ ๋ฏธ๊ถ์ ๋น ์ง๋๋ค ๐ค
์ธ๋ฒ์งธ ์๋ 3๏ธโฃ
EKS ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋ ๊ฑธ๊น์? VPC ๋ด๋ถ์ ์๋ค๊ณ ์ฐฉ๊ฐํ๋ ๊ฑธ๊น์?
๋ง์ ์๋ฌธ์ด ๋ค์์ต๋๋ค.. ๊ทธ๋ฌ๋ ์ค !!
์ด๊ฑธ ์ถ๊ฐํ๋ผ๋ ์ฝ๋ฉํธ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
์~ ์ด์ ์ง์ง ์์์ต๋๋ค. ํด๋ต์ Security Group ์ ์์์ต๋๋ค. ๐๐
ํด๊ฒฐ!! ๐
๊ทธ๋ผ ๋ฐ๋ก security_group_resource ๋ฅผ ์ถ๊ฐํด๋ณด์ฃ .
cluster_security_group_additional_rules = {
ingress = {
description = "EKS Cluster allows 443 port to get API call"
type = "ingress"
from_port = 443
to_port = 443
protocol = "TCP"
cidr_blocks = ["0.0.0.0/0"]
source_node_security_group = false
}
}
๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์ฃ . ๊ฐ์ฅ๋๋ ์๊ฐ์ ๋๋ค .. ๐พ ๐พ
$ terraform plan
$ terraform apply
๋์ฌ๊ฒ ๋์๊ตฐ์ ๐๐๐
curl ๋ช ๋ น์ด๋ก ๋ค์ ๋ ๋ ค๋ณด์ฃ !
$ curl --header "Authorization: Bearer ${TOKEN}" -k -X GET ${APISERVER}/api/v1/namespaces/kube-system/configmaps
์ด๋ฒ์ time out ๋์ง ์๊ณ ์๋ต๊ฐ์ด ์์ต๋๋ค !
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "Unauthorized",
"reason": "Unauthorized",
"code": 401
}
401 ์๋ต ์ฝ๋์ง๋ง EKS Api Server ์ ์ฑ๊ณต์ ์ผ๋ก ์ ๊ทผํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค ๐
๊ทธ๋ผ ๋ค์ ๊ฐ์ฅ ์ฒ์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ํ์ธํด๋ณผ๊น์??
Error: The configmap "aws-auth" does not exist
์ด์ ๋ ์ ์ ์์ต๋๋ค.
๋ค์๋ Error: The configmap "aws-auth" does not exist ๋ฅผ ๋ณด์ง ์์ผ๋ฆฌ...!!
์๋ฌดํผ ์ด๋ฒ ์๋ฌ๋ ๋ฌด์ฌํ ํด๊ฒฐํ๋ค ๐