[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 클러스터를 생성하기 위해서는 다음과 같은 리소스가 필요합니다.
- Route53 (Domain) - 쿠버네티스 API server 에 해당 Domain 을 연결
- 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 활용, 네트워크, 스토리지는 다음주에 더 자세히 다뤄볼 예정이다.
'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 |