Search

Calico

namespace에 적용하는 network policy는 아래처럼 NetworkPolicy 를 사용

apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: this-is-sample namespace: sample-namespace
YAML
복사

namespace에 제한되지 않고 모든 종류의 엔드포인트에 적용하는 규칙은 아래처럼 GlobalNetworkPolicy 를 사용

apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: this-is-sample
YAML
복사

sepc.order 필드로 순서를 적용하고 숫자가 낮은 것부터 적용

apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: this-is-sample spec: order: 20 #...deny policy rules here... --- apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: this-is-sample spec: order: 10 #...allow policy rules here...
YAML
복사

기본적으로 모든 통신 차단 (dns 제외)

apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: deny-all-except-dns spec: order: 0 namespaceSelector: has(projectcalico.org/name) && projectcalico.org/name not in {"kube-system", "calico-system", "tigera-system"} types: - Ingress - Egress egress: # allow all namespaces to communicate to DNS pods - action: Allow protocol: UDP destination: selector: 'k8s-app == "kube-dns"' ports: - 53 - action: Allow protocol: TCP destination: selector: 'k8s-app == "kube-dns"' ports: - 53
YAML
복사

Install Calico

helm repo add projectcalico https://docs.tigera.io/calico/charts helm repo update kubectl create namespace tigera-operator helm install calico projectcalico/tigera-operator --version v3.29.2 --namespace tigera-operator kubectl patch installation default --type='json' -p='[{"op": "replace", "path": "/spec/cni", "value": {"type":"Calico"} }]'
Shell
복사

Install Calicoctl

curl -L https://github.com/projectcalico/calico/releases/download/v3.29.2/calicoctl-linux-amd64 -o kubectl-calico chmod +x kubectl-calico sudo mv kubectl-calico /usr/local/bin/calicoctl
Shell
복사
apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-communication-for-a-pod spec: selector: app == 'a-pod' egress: - action: Allow ingress: - action: Allow source: selector: app == 'b-pod' - action: Deny source: selector: app == 'c-pod'
YAML
복사
kubectl apply -f networkpolicy.yaml
Shell
복사

a-pod.yaml

apiVersion: v1 kind: Pod metadata: name: a-pod labels: app: a-pod spec: containers: - name: a-container image: nginx:latest
YAML
복사

b-pod.yaml

apiVersion: v1 kind: Pod metadata: name: b-pod labels: app: b-pod spec: containers: - name: b-container image: nginx:latest
YAML
복사

c-pod.yaml

apiVersion: v1 kind: Pod metadata: name: c-pod labels: app: c-pod spec: containers: - name: c-container image: nginx:latest
YAML
복사
kubectl apply -f a-pod.yaml && kubectl apply -f b-pod.yaml && kubectl apply -f c-pod.yaml
Shell
복사

Response Test

kubectl exec -it a-pod -- curl <b-pod-ip> kubectl exec -it c-pod -- curl <c-pod-ip>
Shell
복사
a → b 로는 통신이 되는것을 확인 할 수 있고 c → a 에서의 통신은 안되는 것을 볼 수 있다.