용바오의 연구실

JGI (Jaypyon General Intelligence)

Multi-tenant Kubernetes 구성 및 관리

Multi-tenant Kubernetes는 단일 Kubernetes 클러스터를 여러 개의 테넌트 또는 사용자 그룹으로 분할하여 사용하는 방식을 말합니다. 각 테넌트는 독립된 환경을 가지며, 자원 및 네트워크를 격리하여 다른 테넌트와의 충돌을 방지합니다. 이를 통해 여러 조직이나 프로젝트가 하나의 Kubernetes 클러스터를 공유하면서도 독립성을 유지할 수 있습니다.

Multi-tenant Kubernetes를 구성하고 관리하는 방법은 다음과 같습니다:

  1. 네임스페이스(Namespace) 사용: Kubernetes에서 네임스페이스는 클러스터 내의 가상 클러스터로 사용됩니다. 각 테넌트는 별도의 네임스페이스를 할당받아 자원을 관리하며, 네임스페이스 간에는 자원 격리가 이루어집니다.

    • 네임스페이스 생성:

      kubectl create namespace <namespace-name>
      
  2. 리소스 할당 및 제한: 각 테넌트에게 리소스 할당량을 설정하고 제한함으로써 테넌트 간의 공정한 자원 분배를 유지할 수 있습니다. 이를 통해 한 테넌트가 과도한 자원을 사용하여 다른 테넌트의 성능에 영향을 주는 것을 방지할 수 있습니다.

    • 리소스 할당 및 제한 설정 예시 (Pod):

      apiVersion: v1
      kind: Pod
      metadata:
        name: my-pod
        namespace: <namespace-name>
      spec:
        containers:
          - name: my-container
            image: nginx
            resources:
              limits:
                cpu: "1"
                memory: "1Gi"
              requests:
                cpu: "0.5"
                memory: "512Mi"
      
  3. 네트워크 정책(Network Policy) 사용: 네트워크 정책을 사용하여 테넌트 간의 네트워크 트래픽을 제어하고 격리할 수 있습니다. 각 테넌트는 자체적인 네트워크 정책을 설정하여 다른 테넌트와의 통신을 제한할 수 있습니다.

    • 네트워크 정책 설정 예시:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: my-network-policy
        namespace: <namespace-name>
      spec:
        podSelector:
          matchLabels:
            app: my-app
        policyTypes:
          - Ingress
          - Egress
        ingress:
          - from:
              - podSelector:
                  matchLabels:
                    app: other-app
      
  4. RBAC(Role-Based Access Control) 설정: Kubernetes의 RBAC을 사용하여 테넌트 간에 역할과 권한을 구분하여 접근을 제어할 수 있습니다. 각 테넌트에게 필요한 권한을 할당하여 테넌트 간의 데이터 및 자원의 보안을 유지할 수 있습니다.

    • RBAC 설정 예시 (ClusterRole, Role, RoleBinding, ClusterRoleBinding):

      # ClusterRole 생성
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: my-cluster-role
      rules:
        - apiGroups: [""]
          resources: ["pods"]
          verbs: ["get", "list", "create", "update", "delete"]
      
      ---
      
      # Role 생성
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: my-role
        namespace: <namespace-name>
      rules:
        - apiGroups: [""]
          resources: ["pods"]
          verbs: ["get", "list", "create", "update", "delete"]
      
      ---
      
      # RoleBinding 생성
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: my-role-binding
        namespace: <namespace-name>
      subjects:
        - kind: User
          name: <username>
          apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role
        name: my-role
        apiGroup: rbac.authorization.k8s.io
      
      ---
      
      # ClusterRoleBinding 생성
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: my-cluster-role-binding
      subjects:
        - kind: User
          name: <username>
          apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: ClusterRole
        name: my-cluster-role
        apiGroup: rbac.authorization.k8s.io
      

    위의 예시에서는 my-cluster-role이라는 ClusterRole과 my-role이라는 Role을 생성하고, 해당 역할에 필요한 권한을 설정합니다. 그리고 my-role-bindingmy-cluster-role-binding을 생성하여 사용자에게 역할을 할당합니다.

이렇게 Multi-tenant Kubernetes를 구성하고 관리함으로써 여러 테넌트가 하나의 Kubernetes 클러스터를 공유하면서도 자원 및 네트워크를 격리하여 독립성을 유지할 수 있습니다.