Knative와 Kubernetes 연동
1️⃣ Knative와 Kubernetes의 통합 (Kubernetes와 Knative의 관계 이해)
Knative는 Kubernetes 위에서 동작하는 서버리스 컴퓨팅 플랫폼입니다.
Kubernetes는 컨테이너 실행을 담당하고, Knative는 이를 확장하여 자동 스케일링, 이벤트 기반 실행, 빌드 자동화 등의 기능을 제공합니다.
💡 Knative와 Kubernetes의 관계
- Kubernetes는 Knative의 기반 플랫폼 역할을 수행.
- Knative는 추가적인 컨트롤러와 리소스(Custom Resource Definition, CRD) 를 제공하여 서버리스 기능을 확장.
- Kubernetes의 기존 Pod, Service, Deployment, Ingress 등의 개념을 그대로 활용.
✅ 아키텍처 개요
2️⃣ Kubernetes 리소스와의 상호작용
Knative는 Kubernetes의 기본 리소스를 활용하여 동작합니다.
1. Knative와 Kubernetes 리소스 비교
Knative 리소스 | Kubernetes 리소스 | 설명 |
---|---|---|
Service | Deployment + Service | 배포 및 트래픽 관리 |
Revision | ReplicaSet | 버전 관리 |
Route | Ingress | 트래픽 라우팅 |
Configuration | ConfigMap | 설정 관리 |
EventSource | CRD(Custom Resource) | 이벤트 처리 |
2. Knative에서 생성되는 Kubernetes 리소스 예제
Knative Service를 생성하면 내부적으로 Kubernetes의 Deployment, Service, Pod 등이 자동 생성됩니다.
kubectl get pods,svc,deploy -n knative-serving
3️⃣ Knative와 Helm (Helm을 이용한 Knative 배포)
Helm을 사용하면 Knative를 더욱 쉽게 설치 및 관리할 수 있습니다.
1. Helm을 이용한 Knative Serving 배포
helm repo add knative https://knative.dev/charts
helm install knative-serving knative/serving --namespace knative-serving --create-namespace
2. Helm을 이용한 Knative Eventing 배포
helm install knative-eventing knative/eventing --namespace knative-eventing --create-namespace
- Helm Chart를 사용하면 Knative의 버전 업그레이드 및 설정 변경이 용이함.
4️⃣ Pod, Service, Ingress 리소스와의 연동
Knative는 Kubernetes의 기본 네트워크 리소스와 통합됩니다.
1. Knative Service와 Kubernetes Service 연동
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: my-knative-service
spec:
template:
spec:
containers:
- image: gcr.io/my-project/my-app
- 위 서비스는 Kubernetes의
Service
및Pod
리소스를 자동 생성.
2. Knative Ingress 설정
Knative는 기본적으로 Kubernetes Ingress를 사용하여 외부 트래픽을 관리합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: knative-ingress
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-knative-service
port:
number: 80
- Ingress를 통해 Knative Service에 대한 외부 트래픽을 관리 가능.
5️⃣ 클러스터 네트워크 설정 (Knative의 네트워크 처리 방식)
Knative는 내부적으로 Istio, Contour, Kourier 등의 네트워크 레이어를 활용하여 요청을 처리합니다.
1. Knative 네트워크 옵션
네트워크 프로바이더 | 설명 |
---|---|
Istio | 강력한 트래픽 관리 및 서비스 메시 기능 제공 |
Contour | 경량 HTTP 프록시 기반의 네트워크 관리 |
Kourier | 간단한 Knative 전용 Ingress 컨트롤러 |
2. Istio를 활용한 Knative 네트워크 설정
kubectl get svc -n istio-system
- Knative가 Istio의 Gateway 및 VirtualService 를 활용하여 네트워크를 관리하는지 확인 가능.
6️⃣ Knative Ingress, Service, Route 설정
Knative에서 Ingress, Service, Route는 트래픽을 관리하는 핵심 요소입니다.
1. Knative Route 설정
apiVersion: serving.knative.dev/v1
kind: Route
metadata:
name: my-route
spec:
traffic:
- revisionName: my-app-v1
percent: 70
- revisionName: my-app-v2
percent: 30
- v1과 v2 리비전에 대해 트래픽을 70:30 비율로 분배.
2. Knative Service와 Route 연동
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: my-app
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/minScale: "1"
spec:
containers:
- image: gcr.io/my-project/my-app
Route
는Service
에 연결되어 트래픽을 배포하며, 새로운 Revision 이 생성될 때 자동으로 업데이트됨.
7️⃣ 네임스페이스 분리 및 리소스 할당
Knative는 네임스페이스를 활용하여 여러 팀이 독립적인 서버리스 애플리케이션을 운영할 수 있도록 지원합니다.
1. Knative 네임스페이스 분리
kubectl create namespace team-a
kubectl create namespace team-b
- 팀별로 개별 네임스페이스를 생성하여 서비스 격리 가능.
2. Knative 리소스 할당 (ResourceQuota 설정)
apiVersion: v1
kind: ResourceQuota
metadata:
name: knative-quota
namespace: team-a
spec:
hard:
pods: "10"
requests.cpu: "2"
requests.memory: "4Gi"
limits.cpu: "4"
limits.memory: "8Gi"
team-a
네임스페이스 내에서 Knative 서비스가 사용할 수 있는 리소스를 제한.
마지막 수정일자