KubeSphere에서 Calico와 NetworkPolicy를 활용한 다중 테넌트 네트워크 격리 구현

다중 테넌트 환경에서 네트워크 격리의 중요성

기업용 Kubernetes 클러스터에서는 여러 팀 또는 프로젝트가 동일한 클러스터를 공유하는 경우가 많습니다. 이 경우, 네트워크 격리는 데이터 보안 강화, 서비스 간 간섭 방지, 컴플라이언스 요구사항 충족, 시스템 전반의 보안 수준 향상에 필수적입니다. KubeSphere는 Kubernetes의 기본 NetworkPolicy 기능을 확장하여, Calico와 함께 세밀한 네트워크 접근 제어를 가능하게 합니다.

KubeSphere 네트워크 격리 아키텍처 개요

KubeSphere는 Kubernetes의 기본 NetworkPolicy 외에 NamespaceNetworkPolicy라는 사용자 정의 리소스를 통해 네트워크 관리 기능을 확장합니다. 이 기능은 config/ks-core/crds/network.kubesphere.io_namespacenetworkpolicies.yaml 경로에서 정의되며, 더 유연한 선택자와 정책 설정을 지원합니다.

Calico 네트워크 플러그인 설치

KubeSphere에서 Calico를 사용하려면 다음 단계를 수행하십시오:

  1. KubeSphere 클러스터가 정상적으로 설치되어 있는지 확인합니다.
  2. KubeSphere 대시보드에서 "앱 스토어"를 열고 Calico 앱을 검색하여 설치합니다.
  3. 또는 CLI를 통해 설치할 수 있습니다:
    git clone https://github.com/kubesphere/kubesphere
    cd kubesphere
    # Calico 배포 문서를 참조하여 설치 진행

NetworkPolicy 기본 개념 및 설정

네임스페이스 수준의 네트워크 격리

NamespaceNetworkPolicy를 사용하면 특정 네임스페이스의 네트워크 트래픽을 제어할 수 있습니다. 예를 들어, 다음 정책은 라벨이 color: red인 Pod가 ICMP 트래픽만 수신하도록 허용합니다:

apiVersion: network.kubesphere.io/v1alpha1
kind: NamespaceNetworkPolicy
metadata:
  name: icmp-허용
  namespace: 운영
spec:
  selector: color == 'red'
  ingress:
  - action: Allow
    protocol: ICMP
    source:
      selector: "all()"

정책 유형 및 규칙

정책은 ingress (수신) 및 egress (송신) 규칙을 포함할 수 있으며, policyTypes 필드로 정책 유형을 지정합니다. 각 규칙은 다음 요소로 구성됩니다:

  • action: 허용(Allow) 또는 거부(Deny)
  • protocol: TCP, UDP, ICMP 등
  • source/destination: IP 블록, 네임스페이스, 서비스 등
  • ports: 특정 포트 또는 범위

라벨 선택자 적용

정책은 selector를 사용해 해당 정책을 적용할 Pod를 선택합니다. 예를 들어 selector: color == 'red'color: red 라벨이 있는 Pod에만 정책을 적용합니다. Pod에 라벨을 추가하는 예제는 다음과 같습니다:

spec:
  template:
    metadata:
      labels:
        name: nginx
        app: nginx
        color: red

실제 네트워크 격리 시나리오 예제

1. 테넌트 간 직접 통신 차단

team-ateam-b 네임스페이스 간 통신을 차단하려면 다음과 같은 정책을 작성합니다:

apiVersion: network.kubesphere.io/v1alpha1
kind: NamespaceNetworkPolicy
metadata:
  name: cross-tenant-차단
  namespace: team-a
spec:
  policyTypes:
  - Egress
  egress:
  - action: Deny
    destination:
      namespace:
        name: team-b

2. 특정 서비스만 데이터베이스 접근 허용

데이터베이스 서비스는 특정 백엔드 애플리케이션만 접근하도록 제한할 수 있습니다:

apiVersion: network.kubesphere.io/v1alpha1
kind: NamespaceNetworkPolicy
metadata:
  name: db-접근-제한
  namespace: 운영
spec:
  selector: app == 'database'
  ingress:
  - action: Allow
    protocol: TCP
    port: 5432
    source:
      selector: app == 'backend-service'

3. 특정 외부 IP만 접근 허용

Pod가 특정 외부 IP 주소만 접근하도록 제한하려면 다음과 같은 정책을 사용합니다:

apiVersion: network.kubesphere.io/v1alpha1
kind: NamespaceNetworkPolicy
metadata:
  name: egress-ip-제한
  namespace: 운영
spec:
  policyTypes:
  - Egress
  egress:
  - action: Allow
    destination:
      ipBlock:
        cidr: 192.168.1.0/24

KubeSphere 대시보드를 통한 정책 관리

KubeSphere는 사용자 친화적인 대시보드를 제공합니다. 네트워크 정책을 생성하려면:

  1. KubeSphere에 로그인한 후 해당 프로젝트(네임스페이스)로 이동합니다.
  2. 왼쪽 메뉴에서 "네트워크 정책"을 선택합니다.
  3. "생성"을 클릭하고 정책 이름, 선택자, 규칙 등을 설정합니다.
  4. 저장하면 정책이 자동으로 적용됩니다.

네트워크 정책 검증 및 모니터링

정책이 올바르게 적용되었는지 확인하려면 다음 방법을 사용할 수 있습니다:

  • kubectl exec로 Pod에 접속하여 접근 제어가 적용되었는지 테스트합니다.
  • KubeSphere의 모니터링 기능으로 네트워크 트래픽을 확인합니다.
  • Calico 또는 KubeSphere 로그를 확인하여 정책 설정 문제를 진단합니다.

자주 묻는 질문

Q: 정책이 적용되지 않습니다. 어떻게 해야 하나요?

A: 먼저 선택자가 Pod 라벨과 일치하는지 확인하고, Calico 플러그인이 정상적으로 동작하는지 검사한 후, 다른 정책과의 충돌 여부를 확인하십시오.

Q: 네임스페이스 간 네트워크 격리는 어떻게 하나요?

A: 소스 네임스페이스에서 egress 정책을 설정하거나, 대상 네임스페이스에서 ingress 정책을 통해 제어할 수 있습니다.

Q: 복잡한 네트워크 격리 요구사항도 지원되나요?

A: 네, NamespaceNetworkPolicy는 IP 블록, 서비스, 네임스페이스 등 다양한 선택자를 조합하여 복잡한 격리 시나리오를 지원합니다.

태그: kubesphere calico NetworkPolicy 네트워크격리 다중테넌트

9월 18일 16:32에 게시됨