오늘은 k3s로 싱글 노드 클러스터 환경을 구축한 경험에 대해 공유드리고자 합니다.
왜 k3s?
본격적인 Kubernetes 환경을 구축하기에 앞서 k3s 를 채택한 이유에 대해서 언급하고 넘어가겠습니다. 필자는 이제 막 쿠버네티스에 입문한 초심자입니다. 불과 한달 전까지는 짧은 교육을 들으며, 덕분에 돈 걱정하지 않고 EKS 환경에서 마음껏 꿈을 펼쳤습니다. 수료 후 CKA 자격증을 취득하며 Udemy 강의에서 제공하는 실습 환경에서 부담갖지 않고 학습했습니다.(샤라웃 뭄샤드 형님👍)
하지만 이제는 스스로 학습하기 위한 환경을 구축해야 했습니다. 관리형 kubernetes 서비스는 너무 비싸고, 제 맥북에 가상머신 여러 개 띄워서 멀티 노드 클러스터를 구축하자니 공간이 넉넉치 않았습니다. 이에 따라 집에 남는 PC와 미니 PC를 구입하여 홈서버를 구축하겠다는 원대한 꿈을 품었지만 하루 이틀 걸릴 게 아니라고 판단. 이와 독립적으로 아주 가볍게 학습을 위한 환경을 구축하기 위해서 k3s를 선택했습니다.
서론이 길었지만 요약하자면 돈과 시간이 없어 입문, 학습용으로 가벼운 k3s를 선택했습니다!
k3s란?
k3s는 Rancher라는 회사에서 만든 경량화된 쿠버네티스 배포판입니다. k3s는 쿠버네티스와 완전히 호환되며 간편한 설치와 절반의 메모리, 모든 걸 100MB 미만의 바이너리로 제공합니다.
( 참고로 이름부터 10글자인 kubernetes(k8s)와 비교해 절반 크기의 메모리를 갖고 있다고 k3s(케이삼에스?)로 명명한 묘한 센스로 아이덴티티를 강조합니다. )
K3s는 다음과 같은 기능을 갖춘 배포판입니다:
- 단일 바이너리로 패키지화.
- 기본 스토리지 메커니즘으로 sqlite3를 기반으로 하는 경량 스토리지 백엔드. etcd3, MySQL, Postgres도 사용 가능.
- 복잡한 TLS 및 옵션을 처리하는 간단한 런처에 포함.
- 경량 환경을 위한 합리적인 기본값으로 기본적으로 보안을 유지함.
- 다음과 같이 간단하지만 강력한 'batteries-included' 기능 추가. 예를 들어:
- local storage provider
- service load balancer
- Helm controller
- Traefik ingress controller
- 모든 쿠버네티스 컨트롤 플레인 구성 요소의 작동은 단일 바이너리 및 프로세스로 캡슐화. 이를 통해 K3s는 인증서 배포와 같은 복잡한 클러스터 작업을 자동화하고 관리.
- 외부 종속성 최소화(최신 커널과 cgroup 마운트만 필요)
K3s는 다음과 같은 필수 종속성을 패키지로 제공합니다:
- Containerd
- Flannel (CNI)
- CoreDNS
- Traefik (인그레스)
- Klipper-lb (서비스 로드밸런서)
- 임베디드 네트워크 정책 컨트롤러
- 임베디드 로컬 경로 프로비저너
- 호스트 유틸리티(iptables, socat 등)
깃허브: https://github.com/k3s-io/k3s
GitHub - k3s-io/k3s: Lightweight Kubernetes
Lightweight Kubernetes. Contribute to k3s-io/k3s development by creating an account on GitHub.
github.com
K3s - Lightweight Kubernetes | K3s
Lightweight Kubernetes. Easy to install, half the memory, all in a binary of less than 100 MB.
docs.k3s.io
k3s 설치
대충 구성요소는 알아봤으니 k3s를 설치하고 뜯어보겠습니다.
1. EC2 생성
저는 극한의 가성비를 위해 k3s를 AWS EC2 t2.micro 프리티어 위에 설치했습니다.
2. EC2 접속 후 k3s 설치
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
3. 리소스 확인
Nodes, Cluster-Info 확인
# 노드, 클러스터 확인
kubectl get no
kubectl cluster-info
# 파드 확인
kubectl get pods -A
보시다시피 Node는 하나만 배포된 것을 볼 수 있습니다. 이제 위 썸네일처럼 k3s agent 즉, 워커 노드를 추가해서 연결할 수 있는데요. 전 하지 않겠습니다.
워커 노드 없이 마스터 노드에만 사용하면 가용성, 보안성 등등 여러 측면에서 의미가 손색되지 않나요? 네 저도 그렇게 생각합니다. 빠르게 멀티 노드 클러스터 환경을 구축해보겠습니다...🥹
모든 파드는 기본적으로 클러스터의 기본 시스템 구성 요소가 포함된 kube-system 네임스페이스에 속해 있습니다. 각 파드에 대해서 간단하게 기술해보겠습니다.
coredns-*
CoreDNS는 Kubernetes 클러스터의 DNS 서버 역할을 합니다. 서비스 디스커버리와 DNS 쿼리를 처리합니다. 클러스터 내부의 서비스 간 통신을 위한 네임 해석을 담당합니다.
helm-install-traefik-*
Helm을 통해 각각 Traefik의 CRD 리소스와 Traefik Ingress Controller를 설치하는 작업을 진행 후 완료된 상태입니다.
local-path-provisioner-*
local-path-provisioner는 K3s 클러스터에서 로컬 저장소를 동적으로 프로비저닝하는 데 사용됩니다. PersistentVolumeClaim(PVC)을 요청하면, 로컬 경로에 저장소를 할당합니다.
metrics-server-*
metrics-server는 Kubernetes 클러스터의 메트릭을 수집하는 서비스입니다.
svclb-traefik-*
svclb-traefik은 Traefik Ingress Controller에 로드밸런서를 제공하는 서비스입니다. K3s에서는 klipper-lb라는 로드밸런서를 통해 이 파드가 자동으로 생성됩니다. Traefik Ingress로 들어오는 트래픽을 각 노드에 분산합니다.
traefik-*
Traefik은 K3s에 기본적으로 포함된 Ingress Controller로, 외부 트래픽을 클러스터 내부의 서비스로 라우팅하는 역할을 합니다.
이처럼 Traefik이나 Metric Server 등 kubeadm으로 설치했을 때는 추가로 설치해주어야 하는 기본적인 오브젝트들 또한 배포해주네요.
좀 더 자세히 보기 위해선 다음 명령을 치면 되는데....
kubectl cluster-info dump
위와 같이 7379줄이네요. 트러블 슈팅할 때 와서 뒤적거리는 방향으로 가보겠습니다.
4. nginx 앱 배포
앱 배포를 위해 간단한 Docker 이미지를 빌드하고 Push하는 과정은 자세한 설명 없이 스크린샷으로 대체하겠습니다.
앱 배포를 위해서는 Deployment, Service, Ingress 리소스를 정의해주어야 합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: k3s-app
labels:
app: k3s-app
spec:
replicas: 1
selector:
matchLabels:
app: k3s-app
template:
metadata:
labels:
app: k3s-app
spec:
containers:
- name: k3s-app
image: tjdgns8439/k3s-app
imagePullPolicy: Always
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: k3s-app-service
name: k3s-app-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: k3s-app
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: k3s-app-ingress
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: k3s-app-service
port:
number: 80
필자는 기존 이미지를 잘못 명시한 상태에서 배포를 진행했던 터라 yaml파일 수정 후 replace로 재배포했습니다!
5. 통신 테스트
이로써 k3s로 구축한 싱글 노드 클러스터에 첫 앱을 배포해보았습니다! 빠른 시일 내에 멀티 노드 환경에서 kubernetes 환경을 구축하고 남기겠습니다! (그 전까지는 k3s나 EKS 최저 스펙으로 하루하루 살아가는 걸로..)
참고자료
K3s - Lightweight Kubernetes | K3s
경량의 쿠버네티스. 간편한 설치와 절반의 메모리, 모든걸 100MB 미만의 바이너리로 제공합니다.
docs.k3s.io
https://subbaramireddyk.medium.com/k3s-cluster-on-aws-ec2-206893ab968a
K3s Cluster on AWS EC2
EC2 is like your typical computer hosted on the cloud. The first thing is to choose which OS distribution you are good at working with…
subbaramireddyk.medium.com
Ubuntu에서 k3s로 경량 쿠버네티스 클러스터 구축하기
Ubuntu에서 k3s로 경량 쿠버네티스 클러스터 구축하기
medium.com
'Kubernetes' 카테고리의 다른 글
Kubernetes CLI 환경 최적화 (0) | 2024.12.14 |
---|---|
[k8s] Pod의 생명주기 (11) | 2024.10.09 |
[kubernetes] Traefik에 대해 알아보자! (0) | 2024.09.25 |
[k8s] Kubernetes에서 서비스에 외부 접근 제공하기: NodePort, LoadBalancer, Ingress (0) | 2024.09.18 |