* 앱 스케일링이 먼저, 인프라 스케일링은 나중에

---------------------------------NETWORKS-------------------------------------

1. variables.tf에 list(string) 으로
- cidr
- az
를 넣어둔다
-> 서브넷도, rt assoc도 count 순회하면서 자동 생성
------------------------
2.

이 서브넷을 public subnet으로 표시
(인터넷용 ELB/NLE 배치 가능)
k8s에서 type: LoadBalancer로 외부 노출용 서비스를 만들 때 AWS가 어느 서브넷에 LB를 만들까? 를 고를때 힌트로 쓰는 태그
1 값 자체는 플래그 느낌으로 통일해서 1로 넣음
*
내부용
"kubernetes.io/role/internal-elb" = "1"
*클러스터 태그도 같이 필요해진다.
kubernetes.io/cluster/<cluster_name> = "shared" / "owned"
이 태그가 없으면 컨트롤러가 서브넷을 디스커버리할때 "이 서브넷 우리 클러스터 거 맞아?" 판단 못해서 LB생성이 꼬일 수 있다.
shared = 여러 클러스터 / 리소스 공유 가능
owned = 이 클러스터 전용 (클러스터 삭제 시 정리 대상이 되기 쉬움)
-----------------EKS--------------------------------

1, terraform-aws-modules/eks/aws 모듈이 EKS Control Plane(클러스터) 생성
2. EKS Managed Node Group 생성
+ 보안그룹 / IRSA(옵션) / 애드온 등 부가 설정을 한번에 묶어줌
-> 이 Worker Nodes들이 kubelet / container runtime(containerd) + CNI plugin가 돌면서 Pod를 실행한다.
클러스터(컨트롤 플레인) 는 지시하고 조정
노드(Worker) 는 실제로 Pod를 돌린다.

data.aws_eks_cluster.this
만들어진 클러스터의 endpoint / CA 등 메타데이터 조회
data.aws_eks_cluster_auth.this
그 클러스터에 붙을 인증 토큰(짧은 수명) 발급
provider "kubernetes"
위 data에서 가져온
- endpoint(API 서버 주소)
- cluster_ca_certificate (TLS 검증용 CA)
- token (요청 인증)
으로 Terraform이 K8s API에 접속하게 만드는 구조
AWS Provider로 EKS를 만들고 -> K8s provider로 안에 리소스를 넣는다.
-----------------------------------EKS-ACCESS--------------------------------

미리 생성하면 오류가 생기므로, depends_on 설정
--------------------------------------K8S-APP-------------------------------------
- 네임스페이스
- 디플로이먼트
- 서비스
네임스페이스로 격리하고 -> Pod template / replica set -> Service로 해당 파드셋에 대해 엔드포인트 제공한다
*kubernetes_* 리소스들은 어느 클러스터에 만들지를 리소스에서 정하지 않고
provider "kubernetes" 가 가리키는 클러스터에 만든다
Terraform 입장에서는
- AWS provider : EKS를 만든다
- K8S provicer : endpoint / CA / token으로 그 클러스터에 접속해서 namespace / deploy / service를 만든다
------------------------------------------------------------------------------------
그래서 리소스가 k8s_namespace_v1 이런 식으로만 보여도, 실제 대상은 provider가 결정
*실무에서는 provider alias로 dev/prod 클러스터를 분리하기도 함

네임스페이스는 '바구니/구획' 이어서 name만으로 충분히 시작 가능
격리 포인트
- 리소스 이름 충돌 방지
- RBAC 권한 경계 (누가 어디까지 할 수 있나)
- ResourceQuota / LimiRange 등 '자원 제한' 도 네임스페이스 단위로 걸 수 있음

replicas : 몇 개 띄울지
selector.match_labels: 이 deployment가 관리할 Pod(ReplicaSet)의 라벨 기준
template.metadata.labels: 실제로 생성될 Pod에 붙는 라벨
img / container port : 컨테이너 스펙
***
selector.match_labels와 templage.metadata.labels는 반드시 일치해야 한다
지금 코드는 둘 다 {app = "nginx" } 라서 OK
이게 어긋나면 deployment가 만든 Pod를 자기가 못 찾는 이상한 상황이 생김
그리고 container_port는 "컨테이너 리슨 포트" 를 선언하는 값
네트워킹을 실제로 여는 건 Pod/Node의 iptables, service, CNI 등이지만
컨테이너 수준에서 "이 포트로 서비스한다" 는 의미로 흔히 적는다

Service는 Pod집합(라벨로 선택된) 에 대한 안정적인 가상 IP(cluster_ip)와 DNS 이름을 제공한다
selector :
{app = "nginx"} 라벨 가진 Pod들을 백엔드로 묶음
Port : service가 노출하는 퐅트
target_port = 선택된 Pod(정확히는 Pod의 Container_port로 가는) 포트
type = LoadBalancer
AWS에선 클라우드 로드밸런서를 자동 생성해 외부에서 접근 가능한 엔드포인트를 만들어준다
'[2] 250909~ 클라우드 > [b] 12월 : Terraform + Ansible' 카테고리의 다른 글
| [47] cluster_ca_certificate (0) | 2026.02.16 |
|---|---|
| [46] deployment 이미지 (0) | 2026.02.16 |
| [44] ENI vs CNI (0) | 2026.02.15 |
| [43] EKS 콘솔 (0) | 2026.02.15 |
| [42] EKS (0) | 2026.02.11 |