쿠버네티스 클러스터 멀티테넌시 구축
- 멀티테넌시 환경 설정 방법
- 키워드: 쿠버네티스 멀티테넌시, Kubernetes 멀티테넌시 구축
서론
클라우드 네이티브 애플리케이션의 발전으로 인해 여러 조직이 동일한 쿠버네티스(Kubernetes) 클러스터를 공유하는 멀티테넌시 환경이 점점 더 중요해지고 있습니다. 멀티테넌시는 여러 사용자가 동일한 인프라를 공유하면서도 각자의 데이터를 안전하게 보호하고, 자원을 효율적으로 사용할 수 있게 하는 기술입니다. 이 포스팅에서는 쿠버네티스 클러스터에서 멀티테넌시를 설정하는 방법에 대해 초보자도 이해할 수 있도록 자세히 설명합니다.
본론
멀티테넌시란?
멀티테넌시(Multitenancy)는 하나의 소프트웨어 인스턴스가 여러 사용자(테넌트)를 동시에 서비스하는 아키텍처를 의미합니다. 각 테넌트는 독립적인 사용자 그룹으로 간주되며, 다른 테넌트의 데이터와 자원에 접근할 수 없습니다.
쿠버네티스에서 멀티테넌시는 여러 사용자나 팀이 동일한 클러스터를 공유하되, 각 사용자의 애플리케이션이 서로 간섭하지 않도록 격리하는 것을 목표로 합니다. 이를 통해 인프라 비용을 절감하고, 관리 효율성을 높일 수 있습니다.
멀티테넌시의 유형
- 소프트 멀티테넌시 (Soft Multitenancy): 네임스페이스(Namespace)를 이용하여 논리적으로 테넌트를 격리하는 방식입니다. 네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 분리하고 관리하기 위한 기본 단위입니다.
- 하드 멀티테넌시 (Hard Multitenancy): 물리적인 자원(예: 노드 또는 클러스터)을 분리하여 테넌트를 격리하는 방식입니다. 각 테넌트는 독립적인 클러스터나 노드를 사용하므로 보안과 자원 관리를 강화할 수 있습니다.
멀티테넌시 설정 방법
네임스페이스를 이용한 멀티테넌시
- 네임스페이스 생성
네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 분리하는 기본 단위입니다. 각 테넌트에 대해 별도의 네임스페이스를 생성합니다.
kubectl create namespace tenant1
kubectl create namespace tenant2
- RBAC(Role-Based Access Control) 설정
RBAC는 사용자와 애플리케이션의 액세스를 제어하는 중요한 보안 기능입니다. 각 테넌트에 대해 적절한 역할과 역할 바인딩을 설정하여 네임스페이스 내에서만 리소스에 접근할 수 있도록 합니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: tenant1-admin
namespace: tenant1
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: tenant1
name: tenant1-admin-role
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tenant1-admin-binding
namespace: tenant1
subjects:
- kind: ServiceAccount
name: tenant1-admin
namespace: tenant1
roleRef:
kind: Role
name: tenant1-admin-role
apiGroup: rbac.authorization.k8s.io
- 리소스 쿼터(Resource Quotas) 설정
리소스 쿼터는 각 네임스페이스가 사용할 수 있는 자원의 최대치를 제한하는 기능입니다. 이를 통해 각 테넌트가 클러스터 자원을 적절히 사용할 수 있도록 합니다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant1-quota
namespace: tenant1
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: "16Gi"
limits.cpu: "8"
limits.memory: "32Gi"
네트워크 폴리시를 이용한 멀티테넌시
네트워크 폴리시(Network Policy)는 네임스페이스 간의 네트워크 트래픽을 제어하여 보안을 강화하는 기능입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: tenant1
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress: []
egress: []
위의 예제는 tenant1
네임스페이스 내의 모든 인그레스와 이그레스 트래픽을 차단하는 네트워크 폴리시입니다. 이를 통해 네임스페이스 간의 불필요한 트래픽을 막을 수 있습니다.
하드 멀티테넌시 설정 방법
클러스터 API를 이용한 하드 멀티테넌시
하드 멀티테넌시는 각 테넌트가 독립적인 클러스터를 사용하는 방식으로, Cluster API를 사용하여 클러스터를 관리할 수 있습니다.
- Cluster API 설치
Cluster API는 쿠버네티스 클러스터를 선언적으로 관리하는 도구입니다. Cluster API를 설치합니다.
kubectl apply -f https://github.com/kubernetes-sigs/cluster-api/releases/download/v0.4.0/cluster-api-components.yaml
- 클러스터 생성
Cluster API를 사용하여 새로운 클러스터를 생성합니다.
apiVersion: cluster.x-k8s.io/v1alpha4
kind: Cluster
metadata:
name: tenant1-cluster
namespace: tenant1
spec:
clusterNetwork:
services:
cidrBlocks: ["10.96.0.0/12"]
pods:
cidrBlocks: ["192.168.0.0/16"]
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1alpha4
kind: KubeadmControlPlane
name: tenant1-control-plane
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4
kind: DockerCluster
name: tenant1-cluster
이와 같은 방식으로 각 테넌트마다 독립적인 클러스터를 생성하고 관리할 수 있습니다.
멀티테넌시 관리 도구
- Rancher
Rancher는 멀티테넌시 환경에서 여러 쿠버네티스 클러스터를 관리할 수 있는 도구입니다. 사용자 친화적인 인터페이스를 제공하여 클러스터 관리와 멀티테넌시 설정을 쉽게 할 수 있습니다.
- OpenShift
OpenShift는 엔터프라이즈급 쿠버네티스 플랫폼으로, 강력한 멀티테넌시 기능을 제공합니다. RBAC, 네트워크 폴리시, 리소스 쿼터 등을 통해 멀티테넌시를 효과적으로 관리할 수 있습니다.
- Kubesphere
Kubesphere는 쿠버네티스 기반의 멀티테넌시 관리 플랫폼으로, 다양한 멀티테넌시 기능을 제공합니다. 직관적인 대시보드를 통해 클러스터 관리와 멀티테넌시 설정을 쉽게 할 수 있습니다.
결론
쿠버네티스에서 멀티테넌시를 구현하면 여러 사용자가 동일한 클러스터를 공유하면서도 자원을 효율적으로 사용할 수 있습니다. 이번 포스팅에서는 네임스페이스를 이용한 소프트 멀티테넌시와 독립적인 클러스터를 사용하는 하드 멀티테넌시 설정 방법을 다루었습니다. 이를 통해 각 테넌트가 안전하고 효율적으로 쿠버네티스 클러스터를 사용할 수 있기를 바랍니다.