brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jun 18. 2021

EKS 1탄-3. 클러스터 만들기-3/7

2024-12월 업데이트

<1>  CLI로 EKS 클러스터 만들기 (선택)

<2>  Console로 EKS 클러스터 만들기  (선택)

<3> 자원 삭제  필요시 = EC2 > Autoscaling Group을 반드시 먼저 삭제 

<4>  AWS 배포법

<5> 다음 = 실습4. EKS, Container Insight





<1>  CLI로 EKS 클러스터 만들기 (선택)


AWS에서 EKS 클러스터 만들어 보자~

AWS EKS에서 Master는 AWS에서 관리한다.

우리는 WorkNode만 관리할 뿐이다.




1

디렉토리 이동

cd ~/environment

$ /home/ec2-user/environment 경로임


2

리전 변경 필요시

export AWS_REGION=ap-northeast-2

export AWS_REGION=us-east-1

export AWS_REGION=us-east-2

export AWS_REGION=us-west-1

export AWS_REGION=us-west-2


ap-northeast-2  = 서울

US East (N. Virginia) us-east-1

US East (Ohio) us-east-2

US West (N. California) us-west-1

US West (Oregon) us-west-2


echo ${AWS_REGION}


임의 IP블럭으로 만드는 예제이다.

// VPC 192.168.0.0/16

Subnet이 /19로 2개 또는 3개로 만들어진다.



#  최신 버전으로 설치하자.  1.31 로 변경!!! , 워커노드는 2개로 



cat << EOF > eks-demo-cluster.yaml

---

apiVersion: eksctl.io/v1alpha5

kind: ClusterConfig


metadata:

  name: eks-demo # 생성할 EKS 클러스터명

  region: ${AWS_REGION} # 클러스터를 생성할 리젼

  version: "1.31"


vpc:

  cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR


managedNodeGroups:

  - name: node-group # 클러스터의 노드 그룹명

    instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입

    desiredCapacity: 2 # 클러스터 워커 노드의 갯수

    volumeSize: 20  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)

    iam:

      withAddonPolicies:

        imageBuilder: true # AWS ECR에 대한 권한 추가

        albIngress: true  # albIngress에 대한 권한 추가

        cloudWatch: true # cloudWatch에 대한 권한 추가

        autoScaler: true # auto scaling에 대한 권한 추가


cloudWatch:

  clusterLogging:

    enableTypes: ["*"]

EOF



3

AWS EKS는 비용이 발생 된다.

테스트후 반드시 삭제하도록 하자.



4

트라블 슈팅


# 서울리전 생성 실패

Resource handler returned message: "Volume of size 10GB is smaller than snapshot 'snap-0211153b22f46e9ca', expect size>= 20GB (Service: Eks, Status Code: 400, Request ID: c607159f-704f-46b2-9f0c-09d61f31caca)" (RequestToken: 14322f82-f6a8-a155-0ded-ccee0933e909, HandlerErrorCode: InvalidRequest)


- 설정 파일에서 20GB 으로 용량을 늘리자.




# us-east-1으로 할경우 아래와 같이 에러가 나온다.


"targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f (Service: AmazonEKS; Status Code: 400"


=> cloud9 disk 용량을 늘려야 한다.

wget https://gist.githubusercontent.com/joozero/b48ee68e2174a4f1ead93aaf2b582090/raw/2dda79390a10328df66e5f6162846017c682bef5/resize.sh


sh resize.sh





5

Amazon EKS 설치


eksctl create cluster -f eks-demo-cluster.yaml


(30분 소요 됨)


021-06-18 00:08:38 [✔]  EKS cluster "eks-demo" in "us-west-1" region is ready



// 생성실패도 다시 생성해야 할때 ?  

// vi eks-demo-cluster.yaml  해서 Cluster name을  eks-demo1으로 수정하면 계속 만들수 있음.


https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1




5

실패시 다른 리전에 설치법 ?


리전 수동으로 변경하도록 하자.

vi eks-demo-cluster.yaml

AWS_REGION=us-east-2



6

eks-demo 클러스터가 있는경우 수정하자.

eks-demo -> eks-demo1 으로 변경


eksctl create cluster -f eks-demo-cluster.yaml



vi eks-demo-cluster.yaml 

  version: "1.21"  을     version: "1.31"  로 변경


// 1.21은 더  이상 지원하지 않음.




[root@ip-172-31-40-122 ~]# more eks-demo-cluster.yaml 

---

apiVersion: eksctl.io/v1alpha5

kind: ClusterConfig

metadata:

  name: eks-demo # 생성할 EKS 클러스터명

  region: ap-northeast-2 # 클러스터를 생성할 리젼

  version: "1.31"

vpc:

  cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR

managedNodeGroups:

  - name: node-group # 클러스터의 노드 그룹명

    instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입

    desiredCapacity: 3 # 클러스터 워커 노드의 갯수

    volumeSize: 20  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)

    iam:

      withAddonPolicies:

        imageBuilder: true # AWS ECR에 대한 권한 추가

        albIngress: true  # albIngress에 대한 권한 추가

        cloudWatch: true # cloudWatch에 대한 권한 추가

        autoScaler: true # auto scaling에 대한 권한 추가

cloudWatch:

  clusterLogging:

    enableTypes: ["*"]




1.31 버전으로 변경하자.




(30분 소요)

EKS cluster "eks-demo" in "ap-northeast-2" region is ready




7

클러스터 완료후 확인


k get nodes


[root@demo1 ~]# k get nodes

NAME                                                STATUS   ROLES    AGE     VERSION

ip-192-168-18-37.ap-northeast-2.compute.internal    Ready    <none>   2m56s   v1.31.3-eks-375

ip-192-168-37-234.ap-northeast-2.compute.internal   Ready    <none>   2m55s   v1.31.3-eks-375

ip-192-168-81-70.ap-northeast-2.compute.internal    Ready    <none>   2m56s   v1.31.3-eks-375



kubectl get nodes






8

AWS console에서 확인


서브넷 생성 확인

pulic subnet 3개

private subnet 3개





9

EKS 클러스터 확인 - eks-demo

EC2 확인- m5.large 서버 3대 생성됨. node용.


name: 

eks-demo # 생성할 EKS 클러스터명


name: 

node-group # 클러스터의 노드 그룹명








10

# 권한 확인


kubectl describe configmap -n kube-system aws-auth


[root@ip-172-31-16-102 ~]# kubectl describe configmap -n kube-system aws-auth

Name:         aws-auth

Namespace:    kube-system

Labels:       <none>

Annotations:  <none>


Data

====

mapRoles:

----

- groups:

  - system:bootstrappers

  - system:nodes

  rolearn: arn:aws:iam::79xxxxxxxxx:role/eksctl-eks-demo1-nodegroup-node-g-NodeInstanceRole-OPMZXZF5T841

  username: system:node:{{EC2PrivateDNSName}}


Events:  <none>

[root@ip-172-31-16-102 ~]# 




11

# 권한 확인


kubectl get configmap -n kube-system aws-auth


NAME       DATA   AGE

aws-auth   1      28m




12

# 권한 확인


cd .kube/



more config


[root@ip-172-31-95-110 .kube]# more config

apiVersion: v1

clusters:

- cluster:

    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJR3dpblY3aE9RJbX

    server: https://031B4588D370EDB131E1B624B67BBB41.yl4.ap-northeast-2.eks.amazonaws.com

  name: eks-demo1.ap-northeast-2.eksctl.io

contexts:

- context:

    cluster: eks-demo1.ap-northeast-2.eksctl.io

    user: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io

  name: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io

current-context: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io

kind: Config

preferences: {}

users:

- name: i-0d78c3e9078749123@eks-demo1.ap-northeast-2.eksctl.io

  user:

    exec:

      apiVersion: client.authentication.k8s.io/v1beta1

      args:

      - eks

      - get-token

      - --output

      - json

      - --cluster-name

      - eks-demo1

      - --region

      - ap-northeast-2

      command: aws

      env:

      - name: AWS_STS_REGIONAL_ENDPOINTS

        value: regional

      provideClusterInfo: false

[root@ip-172-31-95-110 .kube]#






<2>  Console로 EKS 클러스터 만들기  (선택)


AWS는 3~4개 버전을 지원한다.

콘솔로 생성시 보안그룹등 허용이 필요하다. 비권장한다.


1

EKS

왼편 Amazon EKS > Clusters

1.31



2

role  필요





<3> 자원 삭제  필요시 = EC2 > Autoscaling Group을 반드시 먼저 삭제 


1

자원 삭제시 Autoscaling Group을 반드시 삭제하지.

오토 스케일링로 삭제하지 않고, EC2에서 서버 삭제하면 서버가 다시 생성되기 때문이다.


2

EC2도 없는지 확인 필수


3

EC2를 삭제 해도 Autoscaling 으로 다시 EC2가 생성되어 비용이 발생 할수도 있다.

반드시 EC2가 없는지 확인.







<4>  AWS 배포법


1

# 모니터링 하기 = 별도 터미널 하나 더 띠우기


watch -d kubectl get deploy,rs,svc,pods


watch -d kubectl get deploy,svc,pods




배포하기


kubens  eks-sample-app 



kubectl create namespace eks-sample-app



cat <<EOT > eks-sample-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: eks-sample-linux-deployment

  namespace: eks-sample-app

  labels:

    app: eks-sample-linux-app

spec:

  replicas: 3

  selector:

    matchLabels:

      app: eks-sample-linux-app

  template:

    metadata:

      labels:

        app: eks-sample-linux-app

    spec:

      affinity:

        nodeAffinity:

          requiredDuringSchedulingIgnoredDuringExecution:

            nodeSelectorTerms:

            - matchExpressions:

              - key: kubernetes.io/arch

                operator: In

                values:

                - amd64

                - arm64

      containers:

      - name: nginx

        image: public.ecr.aws/nginx/nginx:1.23

        ports:

        - name: http

          containerPort: 80

        imagePullPolicy: IfNotPresent

      nodeSelector:

        kubernetes.io/os: linux

EOT


kubectl apply -f eks-sample-deployment.yaml






cat <<EOT > eks-sample-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: eks-sample-linux-service

  namespace: eks-sample-app

  labels:

    app: eks-sample-linux-app

spec:

  selector:

    app: eks-sample-linux-app

  ports:

    - protocol: TCP

      port: 80

      targetPort: 80

EOT


kubectl apply -f eks-sample-service.yaml


kubectl get pods




https://aws.amazon.com/ko/getting-started/hands-on/deploy-kubernetes-app-amazon-eks/






<5> 다음 


실습4. EKS, Container Insight


https://brunch.co.kr/@topasvga/1653


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari