쿠버네티스 클러스터 멀티테넌시 구축

쿠버네티스 클러스터 멀티테넌시 구축

- 멀티테넌시 환경 설정 방법
- 키워드: 쿠버네티스 멀티테넌시, Kubernetes 멀티테넌시 구축


서론


클라우드 네이티브 애플리케이션의 발전으로 인해 여러 조직이 동일한 쿠버네티스(Kubernetes) 클러스터를 공유하는 멀티테넌시 환경이 점점 더 중요해지고 있습니다. 멀티테넌시는 여러 사용자가 동일한 인프라를 공유하면서도 각자의 데이터를 안전하게 보호하고, 자원을 효율적으로 사용할 수 있게 하는 기술입니다. 이 포스팅에서는 쿠버네티스 클러스터에서 멀티테넌시를 설정하는 방법에 대해 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


멀티테넌시란?


멀티테넌시(Multitenancy)는 하나의 소프트웨어 인스턴스가 여러 사용자(테넌트)를 동시에 서비스하는 아키텍처를 의미합니다. 각 테넌트는 독립적인 사용자 그룹으로 간주되며, 다른 테넌트의 데이터와 자원에 접근할 수 없습니다.


쿠버네티스에서 멀티테넌시는 여러 사용자나 팀이 동일한 클러스터를 공유하되, 각 사용자의 애플리케이션이 서로 간섭하지 않도록 격리하는 것을 목표로 합니다. 이를 통해 인프라 비용을 절감하고, 관리 효율성을 높일 수 있습니다.


멀티테넌시의 유형


  1. 소프트 멀티테넌시 (Soft Multitenancy): 네임스페이스(Namespace)를 이용하여 논리적으로 테넌트를 격리하는 방식입니다. 네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 분리하고 관리하기 위한 기본 단위입니다.
  2. 하드 멀티테넌시 (Hard Multitenancy): 물리적인 자원(예: 노드 또는 클러스터)을 분리하여 테넌트를 격리하는 방식입니다. 각 테넌트는 독립적인 클러스터나 노드를 사용하므로 보안과 자원 관리를 강화할 수 있습니다.

멀티테넌시 설정 방법


네임스페이스를 이용한 멀티테넌시


  1. 네임스페이스 생성

네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 분리하는 기본 단위입니다. 각 테넌트에 대해 별도의 네임스페이스를 생성합니다.


kubectl create namespace tenant1
kubectl create namespace tenant2

  1. 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

  1. 리소스 쿼터(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를 사용하여 클러스터를 관리할 수 있습니다.


  1. 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

  1. 클러스터 생성

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

이와 같은 방식으로 각 테넌트마다 독립적인 클러스터를 생성하고 관리할 수 있습니다.


멀티테넌시 관리 도구


  1. Rancher

Rancher는 멀티테넌시 환경에서 여러 쿠버네티스 클러스터를 관리할 수 있는 도구입니다. 사용자 친화적인 인터페이스를 제공하여 클러스터 관리와 멀티테넌시 설정을 쉽게 할 수 있습니다.


  1. OpenShift

OpenShift는 엔터프라이즈급 쿠버네티스 플랫폼으로, 강력한 멀티테넌시 기능을 제공합니다. RBAC, 네트워크 폴리시, 리소스 쿼터 등을 통해 멀티테넌시를 효과적으로 관리할 수 있습니다.


  1. Kubesphere

Kubesphere는 쿠버네티스 기반의 멀티테넌시 관리 플랫폼으로, 다양한 멀티테넌시 기능을 제공합니다. 직관적인 대시보드를 통해 클러스터 관리와 멀티테넌시 설정을 쉽게 할 수 있습니다.


결론


쿠버네티스에서 멀티테넌시를 구현하면 여러 사용자가 동일한 클러스터를 공유하면서도 자원을 효율적으로 사용할 수 있습니다. 이번 포스팅에서는 네임스페이스를 이용한 소프트 멀티테넌시와 독립적인 클러스터를 사용하는 하드 멀티테넌시 설정 방법을 다루었습니다. 이를 통해 각 테넌트가 안전하고 효율적으로 쿠버네티스 클러스터를 사용할 수 있기를 바랍니다.

다음 이전