티스토리 뷰

AWS

AWS - EKS

looeon 2024. 3. 21. 15:20

 

 

 

 

 

EKS

 

>> 관리형 Kubernetes 서비스

# 만들어두면 계속 비용이 지출된다

 

 

● 대규모로 애플리케이션 실행

- 컨테이너화된 애플리케이션을 대규모로 배포하고 관리하는데 사용할 수 있는 오픈 소스 소프트웨어

- EC2 인스턴스의 클러스트를 관리 / 배포 / 유지 관리 및 스케일링의 프로세스를 통해 인스턴스에서 컨테이너를 실행

 

● 애플리케이션을 원활하게 이전

- 컨테이너화된 애플리케이션을 로컬 개발 시스템에서 클라우드의 프로덕션으로 이전

 

● 어디서든 실행

- 가용성이 뛰어난 kubernetes 클러스트 실행

 

 

 

 

 

 

 

실습

 

● 역할 생성

 

 

 

 

 

● EKS 의 보안그룹 생성

 

 

 

 

 

 

 

● EKS cluster 생성

 

 

 

 

 

 

 

 

 

 

 

● 프로메테우스는 설정 없이 간다

# 이후 작업은 모드 기본값으로 지정

 

 

 

 

● EKS 클러스터 생성된 이후 관리형 노드 그룹 추가 ( 관리형 ) / Fargate 중 선택 가능

 

 

 

 

 

 

 

 

 

 

 

 

 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/pod-execution-role.html#create-pod-execution-role

 

Amazon EKS Pod 실행 IAM 역할 - Amazon EKS

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

● 역할 생성 후 신뢰 정책 편집

# 설명서 따라서 수정해준다

>> region-code / id / cluster 편집

 

 

 

 

 

 

 

Fargate 프로파일 구성

 

 

 

 

● 서브넷은 private 로 구성된다

 

 

 

 

 

 

 

● VM 하나를 onpremise 로 설정

# EC2 로 구성하는 것보다 비용 절감 가능

 

[vagrant@docker1 ~]$ PS1="onprem \w:$"

 

 

 

 

 

● 인스턴스 하나를 자격증명까지 실행한다

[ec2-user@ip-10-10-3-53 ~]$ aws sts get-caller-identity
{
    "UserId": "ABDAGFED7TFQHTIOJFKKFQC",
    "Account": "000011112222",
    "Arn": "arn:aws:iam::000011112222:user/ecsadmin"
}

 

 

○ 자격 증명이 없다면 생성하여 인증

[ec2-user@ip-10-10-3-53 ~]$ aws configure

 

 

 

 

 

● kubectl 설치 후 클러스터 구성 ( onpremise 장비에도 설치 )

 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html

 

kubectl 설치 또는 업데이트 - Amazon EKS

Amazon EKS 클러스터 제어 영역과 마이너 버전이 하나 다른 kubectl 버전을 사용해야 합니다. 예를 들어 1.28 kubectl 클라이언트는 Kubernetes 1.27, 1.28, 1.29 클러스터와 함께 작동합니다.

docs.aws.amazon.com

 

https://eksctl.io/usage/creating-and-managing-clusters/

 

Creating and managing clusters - eksctl

The official CLI for Amazon EKS

eksctl.io

 

 

 

cat cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: apps
  region: ap-northeast-2

vpc:
  id: "vpc-02906c8ffdf62bd59"
  cidr: "10.10.0.0/16"
  subnets:
    private:
      ap-northeast-2a:
        id: "subnet-0e9fea9b6a57c7152"
        cidr: "10.10.128.0/20"
      ap-northeast-2c:
        id: "subnet-0c4fa15e0c441e065"
        cidr: "10.10.144.0/20"

nodeGroups:
  - name: worker-nodes
    instanceType: t3.medium
    desiredCapacity: 2
    minSize: 1
    maxS

 

 

 

 

● onpremise 장비에 eks-cluster.yaml 생성

# t2 Type 은 2a / 2c만 되므로, 모두 가능하도록 t3으로 + kubernetes가 용량 많이 잡아먹으므로, medium 설정

# 컨테이너는 주로 private 네트워크에 생성하므로 true 설정

 

>> EC2 에서는 안해도 되지만, onpremise 장비는 다른 장비이므로, eksctl / awscli / kubectl 가 필요하다

---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: webapps
  region: ap-northeast-2

nodeGroups:
  - name: worker
    instanceType: t3.medium
    desiredCapacity: 2
    minSize: 1
    maxSize: 3
    ssh:
      allow: false
    privateNetworking: true

 

 

 

○ onpremise 장비에 aws cli 설치

 

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

 

최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface

이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이

docs.aws.amazon.com

onprem ~/aws:$ aws --version
aws-cli/2.15.31 Python/3.11.8 Linux/3.10.0-1127.el7.x86_64 exe/x86_64.centos.7 prompt/off

 

 

 

 

 

 

● eksctl 설치

 

https://docs.aws.amazon.com/ko_kr/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-eksctl.html

 

onprem ~/aws:$ eksctl version
0.174.0

 

 

 

 

 

● eks-cluster.yaml 실행 전에 자격증명

 

◇ IAM >> ecsadmin 계정 >> 액세스 키 2개까지 생성 가능하다

 

 

 

○ 삭제하고 새로 생성

>> 비밀번호가 설정되는데 파일 다운로드 하지 않는다면 보이지 않는다

 

 

 

 

● cluster 생성 

 

# 시간이 걸린다

eksctl create cluster -f eks-cluster.yaml

 

# 지울 때에는 cloudformation 에서 삭제 + eksctl 로 설치했다면, 확실하게 지워줘야 한다

eksctl delete cluster -f eks-cluster.yaml

 

 

 

 

 

 

# docker 는 원래 있던 인스턴스

 

 

 

 

 

 

 

 

● master node 는 aws 가 관리해주므로 접속 불가하다

 

 

○ onpremise 장비는 접속이 불가능하다 ( cluster에 묶여 있지 않다 )

 

○ kubectl 자동완성 넣기

kubectl completion bash

 

>> source 에 넣어서 지금 자동완성 가능

source <(kubectl completion bash)

 

>> .bashrc 에 등록

onprem ~/aws:$ tail -n 1 ~/.bashrc
source <(kubectl completion bash)

 

 

 

 

● 테스트용 yaml 파일

 

>> apache.yaml >> 파드올리기

apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
  labels:
    app: myweb
spec:
  containers:
  - name: myweb-container
    image: httpd:2.4
    ports:
    - containerPort: 80

 

 

>> 실행

kubectl apply -f apache.yaml
kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP               NODE                                                 NOMINATED NODE   READINESS GATES
apache-pod   1/1     Running   0          6s      192.168.138.85   ip-192-168-138-115.ap-northeast-2.compute.internal   <none>           <none>

 

 

 

>> myweb-service.yaml 생성

apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
  labels:
    app: myweb
spec:
  containers:
  - name: myweb-container
    image: httpd:2.4
    ports:
    - containerPort: 80

onprem ~/aws:$ cat myweb-service.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: myweb-service
spec:
  ports:
  - port: 8001
    targetPort: 80
  selector:
    app: myweb

 

 

 

○ 실행 전, svc 라벨과 pod 라벨 확인

kubectl get pods --show-labels
NAME         READY   STATUS    RESTARTS   AGE     LABELS
apache-pod   1/1     Running   0          33s     app=myweb

 

 

○ 서비스 제대로 올라갔다

kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes      ClusterIP   10.100.0.1      <none>        443/TCP    62m
myweb-service   ClusterIP   10.100.64.221   <none>        8001/TCP   12s

 

 

>> 엔드포인트까지 잘 찾았으나, 클러스터 IP 로 접속이 불가능하므로,

>>> 지금 onpremise 장비로 접속 불가

kubectl describe svc myweb-service
Name:              myweb-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=myweb
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.100.64.221
IPs:               10.100.64.221
Port:              <unset>  8001/TCP
TargetPort:        80/TCP
Endpoints:         192.168.138.85:80
Session Affinity:  None
Events:            <none>

 

 

 

 

 

○ 외부 접속을 위해서 svc 타입을 NodePort로 변경한다

---
apiVersion: v1
kind: Service
metadata:
  name: myweb-service
spec:
  ports:
  - port: 8001
    targetPort: 80
  selector:
    app: myweb
  type: NodePort

 

○ port 변경되었다

onprem ~/aws:$ kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.100.0.1      <none>        443/TCP          65m
myweb-service   NodePort    10.100.64.221   <none>        8001:30286/TCP   3m48s

 

 

 

 

◎ 하지만, eks 는 private 에 node 를 올리므로, port 가 변경되었지만 접속이 불가능하다

>>> 로드 밸런스로 접속을 해야한다

 

 

 

 

 

 

 

 

○ svc 의 타입을 LoadBalancer 로 변경

더보기

---
apiVersion: v1
kind: Service
metadata:
  name: myweb-service
spec:
  ports:
  - port: 8001
    targetPort: 80
  selector:
    app: myweb
  type: LoadBalancer

 

>> 도메인 주소를 찾았다

# NodePort 에서 변경하였지만 여전히 Port가 존재한다

onprem ~/aws:$ kubectl get svc
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)          AGE
kubernetes      ClusterIP      10.100.0.1      <none>                                                                         443/TCP          70m
myweb-service   LoadBalancer   10.100.64.221   a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com   8001:30286/TCP   8m22s

 

 

# nslookup 명령어를 위해 설치

onprem ~/aws:$ sudo yum install -y bind-utils

 

 

 

● IP 를 찾을 수 있다

onprem ~/aws:$ nslookup a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com
Server:         10.0.2.3
Address:        10.0.2.3#53

Non-authoritative answer:
Name:   a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com
Address: 15.164.18.5
Name:   a9d3a36f04f474cf0afd22c6aabafca9-1663484911.ap-northeast-2.elb.amazonaws.com
Address: 3.34.114.240

 

 

 

 

● NodePort 에서 변경하였지만, 그냥 포트로 접속한다

 

 

○ NodePort 입력하면 접속 안된다

 

 

 

 

# aws 자동완성 기능이 onpremise 장비에 없어서 불편할 때

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-completion.html

 

명령 완성 - AWS Command Line Interface

명령 완성 AWS Command Line Interface(AWS CLI)에는 Tab 키를 사용하여 부분적으로 입력된 명령을 완성할 수 있는 bash 호환 명령 완성 기능이 포함되어 있습니다. 이 기능은 대부분의 시스템에서 수동으로

docs.aws.amazon.com

 

'AWS' 카테고리의 다른 글

AWS - VPC 피어링  (0) 2024.03.26
AWS - VPC 엔드포인트  (0) 2024.03.25
AWS - ECS  (0) 2024.03.21
AWS - 컨테이너 [ ECR ]  (0) 2024.03.21
AWS - CloudFormation  (0) 2024.03.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함