Network Policy

Network Policy (네트워크 정책)

Kubernetes에서 Cilium을 실행하면 Kubernetes가 정책을 분배하는 것을 활용할 수 있어요. 이 문서는 Kubernetes 네이티브로 네트워크 정책을 구성할 수 있는 여러 형식(NetworkPolicy, ClusterNetworkPolicy, CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy)을 설명해요.

출처: Network Policy

본문

Kubernetes에서 Cilium을 실행하면 Kubernetes가 정책을 분배해 주는 이점을 얻을 수 있어요. 이 모드에서 Kubernetes가 모든 노드에 정책을 분배하고 Cilium이 정책을 자동으로 적용해요. Kubernetes 네이티브로 네트워크 정책을 구성할 수 있는 여러 형식이 있어요:

Cilium은 이러한 정책 유형 여러 개를 동시에 실행하는 것을 지원해요. 다만 여러 정책 유형을 동시에 사용하면 여러 정책 유형에 걸친 허용 트래픽 전체 집합을 이해하기 어려울 수 있으므로 주의해야 해요. 주의를 기울이지 않으면 의도하지 않은 정책 허용 동작이 발생할 수 있어요.

NetworkPolicy

자세한 내용은 공식 NetworkPolicy 문서를 참고하세요.

Note 기본적으로 NetworkPolicy의 ipBlock 규칙은 클러스터 내부 IP(예: Pod 또는 Node IP)와 매칭하지 않아요. –policy-cidr-match-mode 옵션(또는 동등한 Helm 값 policyCIDRMatchMode)을 pods 또는 nodes로 설정하면 ipBlock 규칙이 클러스터 내부 IP와 매칭되도록 허용해요.

Kubernetes ClusterNetworkPolicy

Kubernetes ClusterNetworkPolicy(KCNP) 지원은 Cilium 1.20부터 사용할 수 있어요. 자세한 내용은 공식 ClusterNetworkPolicy 문서를 참고하세요.

KCNP 활성화 (Enabling KCNP)

--enable-k8s-cluster-network-policy 플래그를 true로 설정(또는 동등한 Helm 값 k8sClusterNetworkPolicy.enabled=true)해야 지원이 활성화돼요. 또한 sigs.k8s.io/network-policy-api에서 Custom Resource Definition(CRD)을 설치해야 해요:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/network-policy-api/release-0.2/config/crd/standard/policy.networking.k8s.io_clusternetworkpolicies.yaml

KCNP API는 CIDR 규칙이 파드·노드 IP와도 매칭해야 한다고 지정해요. 완전한 conformance를 위해 –policy-cidr-match-mode 플래그를 pods,nodes로 설정하세요.

티어 (Tiers)

KCNP API는 정책 평가의 최상위 그룹화로 티어를 사용해요. 정책 규칙은 다음 순서로 평가돼요:

  1. Admin 티어: 클러스터 관리자가 설정한 우선순위가 높은 보안 규칙.
  2. NetworkPolicy 티어: 표준 NetworkPolicy, CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy를 포함한 워크로드·클러스터 규칙.
  3. Baseline 티어: 클러스터 관리자가 설정한 기본 가드레일.

Kubernetes ClusterNetworkPolicy는 Admin 또는 Baseline 티어에 할당할 수 있어요. Admin 티어의 규칙은 CiliumClusterwideNetworkPolicy, CiliumNetworkPolicy, 표준 NetworkPolicy 리소스를 포함한 NetworkPolicy 티어 수준의 모든 정책보다 우선하며, 이들에 의해 재정의될 수 없어요. CiliumClusterwideNetworkPolicy에서 Kubernetes ClusterNetworkPolicy로 마이그레이션할 때 이 점을 유의하세요.

CiliumNetworkPolicy

CiliumNetworkPolicy는 표준 NetworkPolicy와 매우 유사해요. 목적은 NetworkPolicy에서 아직 지원하지 않는 기능을 제공하는 것이에요. 이상적으로는 모든 기능이 표준 리소스 형식에 통합되고 이 CRD가 더 이상 필요 없게 되는 것이에요.

리소스의 Go로 된 원시 명세는 다음과 같아요:

type CiliumNetworkPolicy struct {
        // +deepequal-gen=false
        metav1.TypeMeta `json:",inline"`
        // +deepequal-gen=false
        metav1.ObjectMeta `json:"metadata"`

        // Spec is the desired Cilium specific rule specification.
        Spec *api.Rule `json:"spec,omitempty"`

        // Specs is a list of desired Cilium specific rule specification.
        Specs api.Rules `json:"specs,omitempty"`

        // Status is the status of the Cilium policy rule
        //
        // +deepequal-gen=false
        // +kubebuilder:validation:Optional
        Status CiliumNetworkPolicyStatus `json:"status"`
}

Metadata

정책을 설명해요. 여기에는 다음이 포함돼요:

  • 네임스페이스 내에서 고유한 정책 이름
  • 정책이 주입된 네임스페이스
  • Kubernetes에서 리소스를 식별하는 라벨 집합

Spec

Rule Basics을 포함하는 필드예요.

Specs

Rule Basics 목록을 포함하는 필드예요. 이 필드는 여러 규칙을 자동으로 제거하거나 추가해야 할 때 유용해요.

Status

정책이 성공적으로 적용되었는지에 대한 가시성을 제공해요.

예제 (Examples)

자세한 예제 정책 목록은 Layer 3 Policies, Layer 4 Policies, Layer 7 Policies를 참고하세요.

CiliumClusterwideNetworkPolicy

리소스의 Go로 된 원시 명세는 다음과 같아요:

type CiliumClusterwideNetworkPolicy struct {
        // Spec is the desired Cilium specific rule specification.
        Spec *api.Rule

        // Specs is a list of desired Cilium specific rule specification.
        Specs api.Rules

        // Status is the status of the Cilium policy rule.
        //
        // The reason this field exists in this structure is due a bug in the k8s
        // code-generator that doesn't create a `UpdateStatus` method because the
        // field does not exist in the structure.
        //
        // +kubebuilder:validation:Optional
        Status CiliumNetworkPolicyStatus
}

더 알아보기 (Learn more)