Post

[AWS] EKS 설정하고 pod 관리하기

✅EKS(Elastic Kubernetes Service)?


Amazon Elastic Kubernetes Service는 k8s 제어 플레인을 설치하고 운영할 필요 없이 AWS에서 k8s를 손쉽게 실행하도록 하는 관리형 서비스입니다. k8s는 컨테이너화된 애플리케이션의 배포, 조정 및 관리 자동화를 위한 오픈 소스 시스템입니다.

Amazon EKS는 여러 가용 영역에서 k8s 제어 플레인 인스턴스를 실행하여 고가용성을 보장합니다. Amazon EKS는 비정상 제어 플레인 인스턴스를 자동으로 감지하고 교체하며, 자동화된 버전 업그레이드 및 패치를 제공합니다.

Untitled

✅EKS 설정


☑️IAM 역할 생성

Untitled

IAM - 역할 - 역할 생성을 합니다. 사용 사례는 EKS로 합니다.

Untitled

Untitled

역할 이름 지어주고 신뢰 정보를 json 형식처럼 입력합니다. 권한은 AmazonEKSClusterPolicy 입니다.

☑️클러스터 생성

Untitled

EKS 탭으로 가서 클러스터 추가를 합니다. 역할은 아까 생성한 역할로 합니다.

Untitled

나머지는 디폴트로 합니다.

Untitled

네트워크에는 퍼블릭 서브넷에서 a,c를 사용합니다. 보안 그룹에는 기존에 쓰던 web 보안그룹을 사용합니다.

Untitled

그다음은 디폴트로 설정하고 다음으로 갑니다.

Untitled

로깅 관련은 그냥 디폴트로 합니다.

Untitled

나머지도 디폴트 설정으로 하고 생성합니다.

Untitled

EKS 클러스터가 생성되었습니다.

☑️아키텍처 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#kebectl 다운로드
curl -o kubectl curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.25.6/2023-01-30/bin/linux/amd64/kubectl

#사용 권한 설정
chmod +x ./kubectl

#kubectl 전역으로 사용하기 위함
sudo mv ./kubectl /usr/local/bin/

#k8s 명령어 도움
source <(kubectl completion bash)

# ~/.bashrc에 등록
echo "source <(kubectl completion bash)" >> ~/.bashrc

cloud9 인스턴스에서 아래 입력 kubectl 다운로드합니다. 그리고 간단한 설정을 합니다.

☑️자격 증명 설정

Untitled

IAM - 사용자 - 생성한 사용자 선택 - 보안 자격 증명 - 액세스 키 만들기에 들어갑니다.

Untitled

액세스 키와 비밀 액세스 키 복사합니다.

1
2
3
4
5
6
7
export AWS_ACCESS_KEY_ID=[액세스 키]

export AWS_SECRET_ACCESS_KEY=[비밀 액세스 키]

aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER

kubectl get svc

eks 클러스터 자격 증명 관련을 설정합니다.

☑️노드 그룹 역할 생성

Untitled

IAM - 역할 생성 - ec2 권한을 생성합니다.

1
2
3
AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy

위의 3개 역할 선택해서 역할 생성합니다.

☑️노드 그룹 추가

Untitled

EKS - 클러스터 - 생성한 클러스터 - 노드 그룹에서 이름과 역할을 설정하고 나머진 디폴트로 설정합니다.

Untitled

인스턴스 유형은 t2.micro로 합니다.

Untitled

노드, 그룹 조정인데 나머지 디폴트로 합니다.

Untitled

네트워크는 제가 만든 vpc와 퍼블릭 a,c 서브넷을 설정합니다. 노드 원격 액세스 활성화 체크를 합니다.

☑️EKS 컨테이너 배포

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ mkdir test && cd $_
- Pod 라이프사이클 관리

$ vi pod.yaml # 파드 샘플 야믈 (menifest)
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod
spec:
  containers:
  - name: nginx-pod-container
    image: nginx

pod 정의를 해줍니다.

1
2
3
4
5
$ kubectl apply -f pod.yaml # pod 야믈 적용

#조회
$ kubectl get pod -o wide
$ kubectl describe pod nginx-pod

만든 yaml 파일 적용하고 관련 상태 조회합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vi nodeport-pod.yaml # 노드포트 야믈
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-pod
spec:
  type: NodePort
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080

노드포트 서비스 yaml파일 생성합니다.

1
2
3
$ kubectl apply -f nodeport-pod.yaml
$ kubectl get svc -o wide
$ kubectl describe svc nodeport-service-pod

똑같이 생성된 노드 포트 서비스 조회합니다.

Untitled

Untitled

아까 nginx 포드 인스턴스 들어가서 보안그룹에서 30080 인바운드를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-site-deployment
spec:
  replicas: 2
  
  selector:
    matchLabels:
      app: web-site-deployment
      
  template:
    metadata:
      name: web-site-deployment
      labels:
        app: web-site-deployment
    spec:
      containers:
      - name: web-site-deployment-container
        image: public.ecr.aws/[ECR 레포 ID]/web-site:v1.0

배포 yaml생성 및 정의를 합니다.

1
$ kubectl apply -f deployment.yaml

적용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vi loadbalancer-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  selector:
    app: web-site-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

로드 밸런서 배포 야믈 파일 생성합니다.

1
$ kubectl apply -f loadbalancer-deployment.yaml

적용합니다.

☑️EKS 로드밸런서 레코드 생성

Untitled

아까 야믈 파일로 만든 로드 밸런서는 CLB입니다. 따라서 이에 맞추어 Route 53에서 만듭니다.

☑️업데이트

1
$ kubectl edit deployments.apps web-site-deployment

여기에서 image 부분을 찾아서 v2.0으로 바꿔주면 바로 업데이트 되면서 배포가 바뀝니다!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.