[aws] EKS 구성하기

sue·2022년 9월 21일
0

클라우드

목록 보기
3/4
  • 본 가이드는 OS는 ubuntu에서 진행했습니다.
  • OS에 따라 설치 방법이 다를 수 있는 점 참고해 주세요.
  • IAM 권한이 root 권한이므로 EKS를 위해 권한 설정하는 과정은 넣지 않았습니다.
  • aws에서 제공하는 가이드를 기준으로 진행했습니다.

1. aws-cli 설치

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ $ aws --version
aws-cli/2.7.33 Python/3.9.11 Linux/5.15.0-1019-aws exe/x86_64.ubuntu.20 prompt/off

2. AWS CLI Configure 구성

  • aws cli를 사용하기 위한 설정이 필요하다.
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-2
Default output format [None]: json

3. kubectl 설치

  • kubectl이 설치되어 있는지 확인한다.
$ kubectl version | grep Client | cut -d : -f 5
  • kubernetes 1.23 버전으로 설치한다.
$ curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.23.7/2022-06-29/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
$ kubectl version --short --client
Client Version: v1.23.7-eks-4721010

4. EKS 클러스터용 VPC 및 서브넷 생성

  • region에는 클러스터를 구성하고 싶은 리전을 입력한다.
  • stack-name
    • CloudFormation 및 vpc 이름을 설정한다.
  • template-url
    • aws에서 EKS 구성에 필요한 VPC 설정을 CloudFormation Stack으로 제공하고 있다.
    • VPC, 서브넷, 보안그룹 등을 제공한다.
$ aws cloudformation create-stack \
  --region ap-northeast-2 \
  --stack-name paasta-ta-vpc \
  --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml

5. 클러스터 IAM 역할 생성 및 연결

  • 클러스터의 IAM 역할을 생성하기 위해 json 파일을 작성한다.
$ vi eks-cluster-role-trust-policy.json
---

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • IAM 역할을 생성한다.
    • role-name
      • IAM 역할 이름을 지정한다.
    • assume-role-policy-document file
      • 역할 정책 json 파일 경로를 입력한다.
$ aws iam create-role \
  --role-name EKSClusterRole \
  --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
  • 필요한 Amazon EKS 관리형 IAM 정책과 생성한 역할을 연결한다.
$ aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy \
  --role-name EKSClusterRole
  • 생성 후 aws IAM 콘솔에서 역할과 정책이 생성됐는지 확인한다.

6. 클러스터 생성

  • aws EKS 콘솔로 이동한다.
  • 클러스터 추가 > 생성
  • 생성할 클러스터 이름 입력 > kubernetes 버전 선택 > 클러스터 서비스 역할에서 이전에 만든 IAM 역할 선택 (EKSClusterRole) > 다음 선택

  • 4번 과정에서 생성한 VPC를 선택한다.
    • paasta-ta-vpc
  • 4번 과정에서 생성한 모든 서브넷을 추가한다.
  • 4번 과정에서 생성한 보안그룹을 추가한다.
  • 나머지는 기본 설정으로 한다.

  • 로깅 구성(Configure logging) 페이지에서 다음(Next)을 선택한다.
  • 검토 및 생성(Review and create) 페이지에서 생성(Create)을 선택한다.
  • 상태가 활성(Active)이 될 때까지 기다린다.

7. 클러스터와 통신 연결

  • 생성된 클러스터와 통신하기 위한 설정이 필요하다.
  • 클러스터에 대한 kubeconfig 파일을 생성한다.
  • region
    • 클러스터를 생성할 aws 리전으로 입력한다.
  • name
    • 생성한 클러스터 이름을 입력한다.
$ aws eks update-kubeconfig --region ap-northeast-2 --name paasta-ta-cluster
Updated context arn:aws:eks:ap-northeast-2:192199172625:cluster/paasta-ta-cluster in /home/ubuntu/.kube/config
$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   19m

8. 관리형 노드 IAM 생성 및 연결

  • 노드 IAM 역할을 생성하기 위한 json 파일을 생성한다.
$ vi node-role-trust-policy.json
---
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • 노드 IAM 역할을 생성한다.
$ aws iam create-role \
  --role-name EKSNodeRole \
  --assume-role-policy-document file://"node-role-trust-policy.json"
  • IAM 역할과 정책을 연결한다.
$ aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \
  --role-name EKSNodeRole
$ aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \
  --role-name EKSNodeRole
$ aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
  --role-name EKSNodeRole

9. 노드 생성

  • 클러스터 선택 > 컴퓨팅 > 노드 그룹 추가 선택
  • 이름을 입력한다.
    • paasta-ta-nodegroup
  • 노드 IAM 역할
    • 이전 단계에서 생성한 노드 역할을 선택한다.
    • EKSNodeRole
  • 나머지는 기본 설정 > 다음 선택
  • 컴퓨팅 및 크기 조정 구성 설정(Set compute and scaling configuration)은 기본 설정으로 두고 다음을 선택한다.
  • 네트워킹 지정은 기본 설정으로 두고 다음으로 선택한다.
  • 노드를 생성한다.

  • 노드 생성 확인
$ kubectl get nodes
NAME                                                STATUS   ROLES    AGE     VERSION
ip-192-168-240-95.ap-northeast-2.compute.internal   Ready    <none>   2m42s   v1.23.9-eks-ba74326
ip-192-168-3-28.ap-northeast-2.compute.internal     Ready    <none>   2m55s   v1.23.9-eks-ba74326

10. 샘플앱 생성

  • 정상적으로 클러스터 및 노드가 구성됐는지 확인차 샘플앱을 생성한다.
$ vi spring-music-sample.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-music
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-music
  replicas: 1
  template:
    metadata:
      labels:
        app: spring-music
    spec:
      containers:
      - name: spring-music
        image: paastaccc/spring-music-sample:0.1
        imagePullPolicy: Always
        resources:
          requests:
            cpu: 500m
            memory: 200Mi
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: spring-music-service
spec:
  ports:
  ports:
    - port: 8083
      protocol: TCP
      targetPort: 8080
  selector:
    app: spring-music
  type: NodePort
  • 생성 확인
$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
spring-music-78cb987c9f-mg4l7   1/1     Running   0          21s

$ kubectl get svc
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes             ClusterIP   10.100.0.1      <none>        443/TCP          85m
spring-music-service   NodePort    10.100.164.35   <none>        8083:30223/TCP   40s
  • 외부 접속을 위해 보안그룹에서 인바운드를 추가해준다.
    • 유형 :: 모든 트래픽
    • Anywhere IPv4

  • 외부 접속을 위한 정보를 확인한다.
  • EXTERNAL-IP 확인 및 spring-music-service의 port를 확인한다.
$ kubectl get nodes -o wide
NAME                                                STATUS   ROLES    AGE     VERSION               INTERNAL-IP      EXTERNAL-IP      OS-IMAGE         KERNEL-VERSION                 CONTAINER-RUNTIME
ip-192-168-240-95.ap-northeast-2.compute.internal   Ready    <none>   9m49s   v1.23.9-eks-ba74326   192.168.240.95   <none>           Amazon Linux 2   5.4.209-116.367.amzn2.x86_64   docker://20.10.17
ip-192-168-3-28.ap-northeast-2.compute.internal     Ready    <none>   10m     v1.23.9-eks-ba74326   192.168.3.28     13.125.223.101   Amazon Linux 2   5.4.209-116.367.amzn2.x86_64   docker://20.10.17

$ kubectl get svc
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes             ClusterIP   10.100.0.1      <none>        443/TCP          85m
spring-music-service   NodePort    10.100.164.35   <none>        8083:30223/TCP   40s

참고

profile
All is well ! 🔥

2개의 댓글

comment-user-thumbnail
2024년 3월 12일

access key랑 secret key를 인터넷에 함부로 게시하면 위험해요. 누군가가 그 계정으로 sue님의 aws 계정에서 마음대로 할 수 있게 되거든요. key는 지우시는게 좋겠어요.

1개의 답글