EKS (Elastic Kubernetes Service)
EKS를 이용한 클러스터 구성
- Amazon EKS 클러스터 생성
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-cluster.html
- 관리형 노드 그룹 생성
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-managed-node-group.html
VPC 생성 - CloudFormation을 이용
1. 스택 생성
- CloudFormation 에서 스택 생성

- 템플릿 정보를 가지고 있는 S3 버킷 URL을 입력하여 템플릿을 가져오고 나머지 설정은 default 사용


- 스택 생성 후 VPC 확인


2. 클러스터 서비스 역할 생성
: 컨트롤플레인이 사용자를 대신해서 AWS 리소스를 관리하는데 사용하는 역할 부여
- IAM (Identity and Access Management) 에 접속하여 역할 생성


- 생성하는 역할 이름 설정하고 [역할 생성]

3. 클러스터 생성
- Amazon EKS 접속, 클러스터 생성

- 1단계 클러스터 구성에서는 클러스터 이름 / 역할 / 버전을 선택하고 나머지는 default로 설정.


- 2단계 네트워크 지정. 템플릿을 통해 생성된 VPC를 선택하면 자동으로 서브넷, 보안그룹 등이 설정된다.
클러스터 외부에서만 접근할 것이기 때문에 클러스터 엔드포인트 엑세스는 "퍼블릭"으로 설정.


- 3,4,5 단계는 모두 default 설정을 가져가고 6단계에서 최종 검토 후 클러스터를 생성



- 클러스터가 생성 중을 지나 활성화 됨을 확인


4. 생성된 클러스터와 로컬 PC의 kubectl이 통신하도록 설정
* 로컬 PC에서 kubectl 설치 확인
> kubectl version --client
* 로컬 PC에 kubectl 설치 (설치되지 않은 경우, 버전이 맞지 않은 경우)
윈도우 kubectl 설치 링크 : https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-windows/
> curl.exe -L0 "https://dl.k8s.io/release/v1.31.0/bin/windows/amd64/kubectl.exe"
> 설치 후 버전 확인. kubectl version --client
* 로컬 PC의 프롬프트 어느경로에서든 kubectl을 사용하기 위해서 환경변수로 추가한다.
검색 > 시스템 환경 변수 편집 > "환경 변수" > PATH 더블 클릭 > kubectl.exe 위치 경로 등록
* AWS CLI 설치 확인
> aws --version
> 설치 링크 : https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
- root 사용자의 엑세스 키를 발급 받아 등록


- 엑세스 키 발급 이후는 기존의 엑세스 키 등록방법과 동일
> aws configure
AWS Access Key ID [****************HGAT]: AKI**********42FL
AWS Secret Access Key [****************B+UN]: 0ZFXHbNq******************i9zyyIzu+p3
Default region name [ap-northeast-2]:
Default output format [json]:
- EKS 클러스터에 연결할 수 있도록 인증 및 설정 정보를 구성
> aws eks update-kubeconfig --region ap-northeast-2 --name MyEKSCluster
- 서비스와 노드 정보 확인
> kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 176m
> kubectl get node
No resources found
5. EKS 노드 역할을 생성
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-node-role.html
- 신규 역할 생성
1단계. work 노드를 생성할 것이기 때문에 EC2 인스턴스에 대한 엔터티 및 사용 사례를 선택


- 2단계. 권한 추가 (AmazonEKS_CNI_Policy / AmazonEKSWorkerNodePolicy / AmaonEC2ContainerRegistryReadOnly)



- 나머지 설정은 default를 취하고 EKS 노드의 역할을 생성한다.
6. EKS 노드 그룹 생성
- AWS EKS에서 생성한 MyEKSCluster의 노드 그룹을 생성

- 1단계. 노드 그룹의 이름과 역할 설정

- 2단계. 컴퓨팅 및 조정 구성 설정
아래와 같이 default 설정을 가져간다.


- 3단계. 네트워킹 지정 후 생성
Public Subnet을 제외하고 Private Subnet으로 지정한다. (외부에서 worker 노드에 접근할 필요는 없기 때문)

- 노드 그룹 생성 확인 (각 속성의 화면에서도 확인할 수 있다.)

- 명령 프롬프트에서 노드 실행 확인
> kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-192-168-131-151.ap-northeast-2.compute.internal Ready <none> 3m6s v1.30.4-eks-a737599 192.168.131.151 <none> Amazon Linux 2 5.10.225-213.878.amzn2.x86_64 containerd://1.7.11
ip-192-168-205-186.ap-northeast-2.compute.internal Ready <none> 3m3s v1.30.4-eks-a737599 192.168.205.186 <none> Amazon Linux 2 5.10.225-213.878.amzn2.x86_64 containerd://1.7.11
- 클러스터 구성요소 설치 확인

> kubectl get namespace
NAME STATUS AGE
default Active 3h16m
kube-node-lease Active 3h16m
kube-public Active 3h16m
kube-system Active 3h16m
> kubectl get all -n kube-system
NAME READY STATUS RESTARTS AGE
pod/aws-node-dps28 2/2 Running 0 5m30s
pod/aws-node-r2s6r 2/2 Running 0 5m32s
pod/coredns-5b9dfbf96-ht656 1/1 Running 0 3h5m
pod/coredns-5b9dfbf96-lm897 1/1 Running 0 3h5m
pod/eks-pod-identity-agent-mmhlw 1/1 Running 0 5m32s
pod/eks-pod-identity-agent-v5kdd 1/1 Running 0 5m30s
pod/kube-proxy-cbbq5 1/1 Running 0 5m32s
pod/kube-proxy-jlzp4 1/1 Running 0 5m30s
7. 클러스터에 디플로이먼트와 서비스 생성
- Yaml 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostname-deployment
spec:
replicas: 3
selector:
matchLabels:
app: webserver
template:
metadata:
name: my-webserver
labels:
app: webserver
spec:
containers:
- name: my-webserver
image: alicek106/rr-test:echo-hostname
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: hostname-loadbalancer
spec:
type: LoadBalancer
selector:
app: webserver
ports:
- name: web-port
port: 80
targetPort: 80
- 배포
> kubectl apply -f eks-sample.yaml
> kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hostname-deployment-7b57c676b9-7l664 1/1 Running 0 2m20s
pod/hostname-deployment-7b57c676b9-fvg4l 1/1 Running 0 2m20s
pod/hostname-deployment-7b57c676b9-zjvqx 1/1 Running 0 2m20s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hostname-loadbalancer LoadBalancer 10.100.126.144 a02056dfb06f840f69f974b57 80:32697/TCP 2m20s
b4bf3d7-1963070520.ap-
northeast-2.elb.amazonaws.com
service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 3h23m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hostname-deployment 3/3 3 3 2m20s
NAME DESIRED CURRENT READY AGE
replicaset.apps/hostname-deployment-7b57c676b9 3 3 3 2m20s
8. 브라우저를 통해 확인
파드 3개가 서비스 됨을 확인할 수 있다.
또한 EXTERNAL IP가 80포트로 서비스되고 있기 때문에 도메인의 시작은 http:// 이어야 한다.



9. 리소스 정리
- EKS 노드 그룹 삭제
=> 노드(EC2 인스턴스) 또한 함께 삭제된다.

- EKS 클러스터 삭제
=> 노드 그룹 삭제 이후 삭제 가능해진다.

- CloudFormation 삭제

- ELB (Elastic LoadBalancer) 삭제

- root 계정의 엑세스 키 삭제

- 생성한 역할 삭제

- EC2 인스턴스 및 VPC 삭제 확인


'Study > seSAC 금천 4기' 카테고리의 다른 글
| 이노그리드 특강_CI/CD_241023 (0) | 2024.10.31 |
|---|---|
| 클라우드_6일차_241011 (1) | 2024.10.31 |
| AWS 특강_241028 (0) | 2024.10.28 |
| DevOps/Scrum 특강_241024~241025 (1) | 2024.10.25 |
| 이노그리드 CI/CD 특강_241022 (0) | 2024.10.23 |