[PKOS Study 1주차] AWS에 kops 로 쿠버네티스 클러스터 생성
- -
AWS 에서 쿠버네티스 스터디를 하는데 있어, EKS 가 아닌 kops 를 사용하였습니다.
EKS 는 생성 시간이 길고 비용이 많이 들기 때문에 교육 목적으로 비교적 빠르게 쿠버네티스 클러스터를 생성할 수 있는 kops 를 선택하였습니다.
1. KOPS??
KOPS 는 Kubernetes Operations 의 약자로 쿠버네티스 클러스터 생성, 제거, 업그레이드 등을 자동화시켜주는 프로비저닝 툴입니다.
kops 홈페이지
kops 를 사용하면 k8s 클러스터 구성에 6분 정도 소요되기 때문에, 쿠버네티스 교육 목적으로는 적합할 듯 합니다.
2. KOPS 클러스터 생성
kops 클러스터를 생성하기 위해서는 다음과 같은 리소스가 필요합니다.
- Route53 (Domain) - 쿠버네티스 API server 에 해당 Domain 을 연결
- S3 - kops cluster 배포 관련 정보가 저장될 공간
또한, kops 클러스터를 생성하려는 사용자는 다음과 같은 권한이 있어야 합니다.
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 활용, 네트워크, 스토리지는 다음주에 더 자세히 다뤄볼 예정이다.
'AWS > EKS' 카테고리의 다른 글
[PKOS Study 3주차] GitOps System - Harbor 설치 (0) | 2023.03.26 |
---|---|
[PKOS Study 2주차] Kubernetes Storage ( emptyDir, hostPath, PV/PVC ) (0) | 2023.03.19 |
[PKOS Study 2주차] 쿠버네티스 Service, Ingress (LoadBalancer controller) (0) | 2023.03.19 |
[PKOS Study 2주차] Kubernetes Network ( AWS VPC CNI ) (0) | 2023.03.18 |
[PKOS Study 1주차] Kubernetes External DNS (0) | 2023.03.14 |