Network Policy
Network Policy (네트워크 정책)
Kubernetes에서 Cilium을 실행하면 Kubernetes가 정책을 분배하는 것을 활용할 수 있어요. 이 문서는 Kubernetes 네이티브로 네트워크 정책을 구성할 수 있는 여러 형식(NetworkPolicy, ClusterNetworkPolicy, CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy)을 설명해요.
출처: Network Policy
본문
Kubernetes에서 Cilium을 실행하면 Kubernetes가 정책을 분배해 주는 이점을 얻을 수 있어요. 이 모드에서 Kubernetes가 모든 노드에 정책을 분배하고 Cilium이 정책을 자동으로 적용해요. Kubernetes 네이티브로 네트워크 정책을 구성할 수 있는 여러 형식이 있어요:
- 파드의 인그레스 또는 이그레스에서 L3·L4 정책을 지원하는 표준 NetworkPolicy 리소스.
- 클러스터 범위 정책을 지원하는 Kubernetes ClusterNetworkPolicy 형식(v1alpha2).
- L3~L7 인그레스·이그레스 모두에서 정책 지정을 지원하는 CustomResourceDefinition으로 제공되는 확장 CiliumNetworkPolicy 형식.
- Cilium이 집행할 클러스터 전체 정책을 지정하기 위한 클러스터 범위 CustomResourceDefinition인 CiliumClusterwideNetworkPolicy 형식. 명세는 CiliumNetworkPolicy와 같으며 네임스페이스가 지정되지 않아요.
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는 정책 평가의 최상위 그룹화로 티어를 사용해요. 정책 규칙은 다음 순서로 평가돼요:
- Admin 티어: 클러스터 관리자가 설정한 우선순위가 높은 보안 규칙.
- NetworkPolicy 티어: 표준 NetworkPolicy, CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy를 포함한 워크로드·클러스터 규칙.
- 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
}