새소식

AWS/EKS

[PKOS Study 1주차] AWS에 kops 로 쿠버네티스 클러스터 생성

  • -

AWS 에서 쿠버네티스 스터디를 하는데 있어, EKS 가 아닌 kops 를 사용하였습니다.
EKS 는 생성 시간이 길고 비용이 많이 들기 때문에 교육 목적으로 비교적 빠르게 쿠버네티스 클러스터를 생성할 수 있는 kops 를 선택하였습니다.

 

1. KOPS??

KOPS 는 Kubernetes Operations 의 약자로 쿠버네티스 클러스터 생성, 제거, 업그레이드 등을 자동화시켜주는 프로비저닝 툴입니다.

 

kops 홈페이지
 

Welcome - kOps - Kubernetes Operations

For a better viewing experience please check out our live documentation site at kops.sigs.k8s.io. kOps - Kubernetes Operations The easiest way to get a production grade Kubernetes cluster up and running. What is kOps? We like to think of it as kubectl for

kops.sigs.k8s.io

kops 를 사용하면 k8s 클러스터 구성에 6분 정도 소요되기 때문에, 쿠버네티스 교육 목적으로는 적합할 듯 합니다.



 

2. KOPS 클러스터 생성

 

kops 클러스터를 생성하기 위해서는 다음과 같은 리소스가 필요합니다.
  1. Route53 (Domain) - 쿠버네티스 API server 에 해당 Domain 을 연결
  2. S3 - kops cluster 배포 관련 정보가 저장될 공간

 

또한, kops 클러스터를 생성하려는 사용자는 다음과 같은 권한이 있어야 합니다.

 

GitHub - kubernetes/kops: Kubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and Management

Kubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and Management - GitHub - kubernetes/kops: Kubernetes Operations (kOps) - Production Grade k8s Installation, Upgrades and ...

github.com

AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess
AmazonSQSFullAccess
AmazonEventBridgeFullAccess

 

 

2.1. KOPS 클러스터 배포를 위한 AWS 환경 만들기

이번 스터디에서는 EC2 인스턴스를 배포한 후 kops 클러스터를 설치했는데,
스터디장님이 스터디원들의 동일한 환경 사용을 위해 CloudFormation 으로 해당 환경을 만들어 주셨습니다. :)

 

 

CloudFormation Template
https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/kops-new-ec2.yaml

해당 CloudFormation 템플릿을 통해 생성한 EC2 는
Userdata 를 통해 kops , kubectl , aws cli , helm 등의 tool 을 자동으로 설치하게 됩니다.

 

 

  • EC2 접속에 사용할 KeyPair 선택 , SSH 접속 CIDR 설정

이후 생성하면 스택을 진행하면 다음과 같은 리소스가 생성됩니다.

 

 

생성된 EC2 의 공인 IP 로 접속하여 작업을 진행합니다.

 

2.2. KOPS Cli 를 이용하여 클러스터 배포

우선 EC2 에 AWS Configure 을 이용하여 권한을 부여해줍니다.

aws configure

 

이후 내 Cluster Name 을 내 Domain 과 동일하게 설정해주고 , S3 Bucket 을 지정해줍니다.

export KOPS_CLUSTER_NAME={나의 Domain 입력}
export KOPS_STATE_STORE=s3://{S3 버킷 입력}

 

 

kops cli 를 통해 클러스터 구성

# 기본 배포
kops create cluster --zones=ap-northeast-2a,ap-northeast-2c \
    --name=$KOPS_CLUSTER_NAME

 

# 설정값 추가
kops create cluster \
    --zones=ap-northeast-2a,ap-northeast-2c \
    --networking amazonvpc \
    --cloud aws \
    --master-size t3.medium \
    --node-size t3.medium \
    --node-count=2 \
    --network-cidr 172.30.0.0/16 \
    --ssh-public-key ~/.ssh/id_rsa.pub \
    --name=$KOPS_CLUSTER_NAME \
    --kubernetes-version "1.24.10" -y

 

  • 생성 완료

 

클러스터 구성 후, Route53 호스팅 영역을 보면 kops 가 자동으로 서브도메인을 생성해놓은 것을 확인 할 수 있다.
해당 서브도메인이 생성된 Control Plane 의 IP 로 변경되기까지는 시간이 조금 걸린다.

 

성공적으로 배포가 되었다면, kubectl 을 통해 쿠버네티스에 명령어를 전달할 수 있게 된다.

[root@kops-ec2 ~]kubectl get pod -n kube-system -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase

NAME                                          IP              STATUS
aws-cloud-controller-manager-s5jww            172.30.51.65    Running
aws-node-7jxhp                                172.30.45.154   Running
aws-node-mk8hr                                172.30.64.112   Running
aws-node-q57fs                                172.30.51.65    Running
coredns-68cd66b8cc-df6xv                      172.30.56.84    Running
coredns-68cd66b8cc-lqcsc                      172.30.93.64    Running
coredns-autoscaler-66fbc7dd48-5ttpf           172.30.57.52    Running
dns-controller-58db5db6d6-gjscv               172.30.51.65    Running
ebs-csi-controller-7c6999cfcf-sxf9q           172.30.51.65    Running
ebs-csi-node-c7jsc                            172.30.67.170   Running
ebs-csi-node-vcf7h                            172.30.62.209   Running
ebs-csi-node-z8btf                            172.30.57.79    Running
etcd-manager-events-i-0d54fb1b8e5073100       172.30.51.65    Running
etcd-manager-main-i-0d54fb1b8e5073100         172.30.51.65    Running
kops-controller-9d54m                         172.30.51.65    Running
kube-apiserver-i-0d54fb1b8e5073100            172.30.51.65    Running
kube-controller-manager-i-0d54fb1b8e5073100   172.30.51.65    Running
kube-proxy-i-023a9cef8479ce61f                172.30.45.154   Running
kube-proxy-i-0912c23a5c8239001                172.30.64.112   Running
kube-proxy-i-0d54fb1b8e5073100                172.30.51.65    Running
kube-scheduler-i-0d54fb1b8e5073100            172.30.51.65    Running



3. KOPS 구성 파헤치기

3.1. Kops Container Runtime.

k8s 1.24 버전으로 설치했기 때문에, 기본은 containerd 로 설치되었다.

[root@kops-ec2 ~]kubectl get nodes -o wide

NAME                  STATUS   ROLES           AGE   VERSION    INTERNAL-IP     EXTERNAL-IP      OS-IMAGE             KERNEL-VERSION    CONTAINER-RUNTIME
i-023a9cef8479ce61f   Ready    node            33m   v1.24.10   172.30.45.154   3.35.135.179     Ubuntu 20.04.5 LTS   5.15.0-1031-aws   containerd://1.6.18
i-0912c23a5c8239001   Ready    node            33m   v1.24.10   172.30.64.112   15.164.215.129   Ubuntu 20.04.5 LTS   5.15.0-1031-aws   containerd://1.6.18
i-0d54fb1b8e5073100   Ready    control-plane   36m   v1.24.10   172.30.51.65    3.35.53.18       Ubuntu 20.04.5 LTS   5.15.0-1031-aws   containerd://1.6.18

 

3.2. kops storage class (sc).

AWS 에 설치했기 때문에 AWS 서비스와 연동할 수 있게 default sc 를 gp3 타입으로 사용한다.

[root@kops-ec2 ~]kubectl get sc
NAME                      PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
default                   kubernetes.io/aws-ebs   Delete          Immediate              false                  45m
gp2                       kubernetes.io/aws-ebs   Delete          Immediate              false                  45m
kops-csi-1-21 (default)   ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   45m
kops-ssd-1-17             kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   45m

[root@kops-ec2 ~]kubectl get sc kops-csi-1-21 -o jsonpath={.parameters} ;echo
{"encrypted":"true","type":"gp3"}

[root@kops-ec2 ~]kubectl get sc kops-ssd-1-17 -o jsonpath={.parameters} ;echo
{"encrypted":"true","type":"gp2"}



4. 데모 서비스 배포하기

  • 설치된 클러스터에 간단한 서비스를 배포해보기로 한다.
[root@kops-ec2 ~]curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/1/mario.yaml

[root@kops-ec2 ~]kubectl apply -f mario.yaml
deployment.apps/mario created
service/mario created

 

마리오 게임이 들어있는 pod 하나가 실행되는 yaml 파일이다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mario
  labels:
    app: mario
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mario
  template:
    metadata:
      labels:
        app: mario
    spec:
      containers:
      - name: mario
        image: pengbai/docker-supermario
---
apiVersion: v1
kind: Service
metadata:
   name: mario
spec:
  selector:
    app: mario
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  type: LoadBalancer

 

서비스 배포 완료 후 로드밸런서 도메인으로 확인

[root@kops-ec2 ~]kubectl get svc mario
NAME    TYPE           CLUSTER-IP     EXTERNAL-IP                                                                   PORT(S)        AGE
mario   LoadBalancer   100.68.24.94   a32dffb1656354e529895d50d4db96b0-663335615.ap-northeast-2.elb.amazonaws.com   80:31548/TCP   8m51s

 


kops 활용, 네트워크, 스토리지는 다음주에 더 자세히 다뤄볼 예정이다.

Contents

포스팅 주소를 복사했습니다