본문 바로가기

IT/Container&k8s

Calico 네트워크 모드 / 접근 통제 방법

안녕하세요. Kubernetes Advanced Networking Study(=KANS) 3기 모임에서 스터디한 내용을 정리했습니다. 해당 글에서는 Calico의 네트워크 모드와 네트워크 접근 통제 방법에 대해 자세히 알아보겠습니다. 

 

Calico다양한 네트워크 통신 방법(모드)를 제공합니다.

CalicoCilium 에서 파드 혹은 네임스페이스의 레벨에서 IN/OUT 트래픽에 대한 통제가 가능합니다.

 

네트워크 모드

1. IPIP 모드

파드 간 통신이 노드와 노드 구간에서는 IPIP 인캡슐레이션을 통해서 이루어 집니다

- 다른 노드 간의 파드 통신은 tunl0 인터페이스를 통해 IP 헤더에 감싸져서 상대측 노드로 도달 후 tunl0 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신

- 다른 노드의 파드 대역은 BGP로 전달 받아 호스트 라우팅 테이블에 업데이트됨

- Azure 네트워크에서는 IPIP 통신이 불가능하여 IPIP 모드 대신 VXLAN 모드 사용 [참고]

 

# 모드 정보 확인
calicoctl get ippool -o wide

# 노드(BGP) Peer 정보 확인
calicoctl node status
IPv4 BGP status
+----------------+-------------------+-------+----------+-------------+
|  PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+----------------+-------------------+-------+----------+-------------+
| 192.168.20.100 | node-to-node mesh | up    | 10:03:45 | Established |
| 192.168.10.101 | node-to-node mesh | up    | 10:05:26 | Established |
| 192.168.10.102 | node-to-node mesh | up    | 10:07:16 | Established |
+----------------+-------------------+-------+----------+-------------+

# BGP 로 전달 받은 파드 네트워크 대역이 호스트 라우팅 테이블에 적용되었는지 확인 
route -n | egrep '(Destination|tunl0)'
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.8.128    192.168.20.100  255.255.255.192 UG    0      0        0 tunl0
172.16.46.0     192.168.10.102  255.255.255.192 UG    0      0        0 tunl0
172.16.228.64   192.168.10.101  255.255.255.192 UG    0      0        0 tunl0

calicoctl ipam show --show-blocks
+----------+-----------------+-----------+------------+--------------+
| GROUPING |      CIDR       | IPS TOTAL | IPS IN USE |   IPS FREE   |
+----------+-----------------+-----------+------------+--------------+
| IP Pool  | 172.16.0.0/16   |     65536 | 6 (0%)     | 65530 (100%) |
| Block    | 172.16.116.0/24 |       256 | 4 (2%)     | 252 (98%)    |
| Block    | 172.16.158.0/24 |       256 | 1 (0%)     | 255 (100%)   |
| Block    | 172.16.34.0/24  |       256 | 1 (0%)     | 255 (100%)   |
+----------+-----------------+-----------+------------+--------------+

 

# 워커 노드마다 할당된 dedicated subnet (podCIDR) 확인
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'

kubectl get node k8s-m -o json | jq '.spec.podCIDR'
"172.16.0.0/24"
kubectl get node k8s-w1 -o json | jq '.spec.podCIDR'
"172.16.1.0/24"
...

# 기본제공 
cat /etc/cni/net.d/10-calico.conflist
...
"ipam": {
          "type": "calico-ipam"
      },
...

# IPAM 우선순위 - 링크 링크2
1. Kubernetes annotations
2. CNI configuration << Calico IPAM
3. IP pool node selectors << host-local IPAM

# IPIP 인캡슐레이션 동작을 수행하는 터널 인터페이스 확인
ip -c -d addr show tunl0

 

2. Direct 모드

파드 통신 패킷이 출발지 노드의 라우팅 정보를 보고 목적지 노드로 원본 패킷 그대로 전달합니다

 

3. VXLAN 모드 

파드 간 통신이 노드와 노드 구간에서는 VXLAN 인캡슐레이션을 통해서 이루어 집니다(지난 글 참고 :

 

 

 

4. Pod 패킷 암호화 (네트워크 레벨)

Calico 의 다양한 네크워크 모드 환경 위에서 WireGuard 터널을 자동 생성 및 파드 트래픽을 암호화하여 노드간 전달합니다

 

- 간결한 코드 구조빠른 성능 (모든 것이 kernel에서 동작하고, 주요 암호 알고리즘에 대해서 병렬처리하므로써 빠른 속도를 자랑함)

- wireguard는 망 변경으로 peerip 주소가 변경되더라도 tunnel이 유지되는 특징이 있음. 이것이 가능한 이유는 index 기반으로 peer hash table이 운용되기 때문

 

WireGuard 설정

# 설치
apt install wireguard -y

# WireGuard 버전 확인
wg version

 

 

WireGuard 설정 및 확인

# 설정
calicoctl get felixconfiguration -o yaml
calicoctl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true}}'

# 확인
calicoctl get felixconfiguration default -o yaml | grep wireguardEnabled
root@k8s-m:~/yaml# calicoctl get felixconfiguration default -o yaml | grep wireguardEnabled
  wireguardEnabled: true

calicoctl get node -o yaml | grep wireguardPublicKey
calicoctl get node <노드 Name> -o yaml | grep wireguardPublicKey
root@k8s-m:~/yaml# calicoctl get node k8s-w1 -o yaml | grep wireguardPublicKey
  wireguardPublicKey: BToK9bLEhMaPUJsuKy3KdrxVOpklyo0qlGRdMN6lHWc=

# wireguard.cali 인터페이스 확인
ip -c -d addr show wireguard.cali
root@k8s-w1:~# ip -c -d addr show wireguard.cali
12: wireguard.cali: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none  promiscuity 0 minmtu 0 maxmtu 2147483552
    wireguard numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
    inet 172.16.228.74/32 scope global wireguard.cali
       valid_lft forever preferred_lft forever

ifconfig wireguard.cali
root@k8s-w1:~# ifconfig wireguard.cali
wireguard.cali: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1440
        inet 172.16.228.69  netmask 255.255.255.255  destination 172.16.228.69
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)

 

# wireguard.cali 설정 확인 : 통신 포트, Peer/Endpoint 정보, 패킷 암호화를 위한 공개키/사설키 정보
wg showconf wireguard.cali
root@k8s-w1:~# wg showconf wireguard.cali
[Interface]
ListenPort = 51820
FwMark = 0x100000
PrivateKey = AIgTihI2p4icwVMR4sIvuVaSqwKlkxMImQp4A/Gm+Gg=

[Peer]
PublicKey = BToK9bLEhMaPUJsuKy3KdrxVOpklyo0qlGRdMN6lHWc=
AllowedIPs = 172.16.228.64/26, 172.16.228.69/32, 172.16.228.67/32
Endpoint = 192.168.100.101:51820

[Peer]
PublicKey = 9TCD8hG6SLutZSOZSzQeqj6O0icJAxA3RPIipcBKBxs=
AllowedIPs = 172.16.197.0/26, 172.16.197.3/32, 172.16.197.5/32
Endpoint = 192.168.100.103:51820

[Peer]
PublicKey = Ercb/0pNZ+I1ELOkiXlWbZA9J0Fjt7XqsstDH4GhNmI=
AllowedIPs = 172.16.46.3/32, 172.16.46.0/26, 172.16.46.5/32
Endpoint = 192.168.100.102:51820

# Peer 의 정보(고유한 index)
wg show
interface: wireguard.cali
  public key: 8TNaYyzzc1N4SHfqE+Y5b4rMBKX/lqPe0tWO/h8sOB4=
  private key: (hidden)
  listening port: 51820
  fwmark: 0x100000

peer: 6WtZqEKSmoSKiFp20fhk/jyTcrTqf9qshyZI1HvE9Qk=
  endpoint: 192.168.10.102:51820
  allowed ips: 172.16.184.0/32, 172.16.184.0/24, 172.16.184.1/32

peer: +fOEOJgFxueIbrp709iB4F4gFRb2ny4lWKbxCNNfczM=
  endpoint: 192.168.20.100:51820
  allowed ips: 172.16.34.0/32, 172.16.34.0/24, 172.16.34.1/32

peer: d2LgXvRo4DwsyhiLXUn9TEt6D3l4pFIVlCD7KESR/m0=
  endpoint: 192.168.10.101:51820
  allowed ips: 172.16.158.0/32, 172.16.158.0/24, 172.16.158.1/32

# 키 정보 확인
wg show all public-key
wireguard.cali	8TNaYyzzc1N4SHfqE+Y5b4rMBKX/lqPe0tWO/h8sOB4=

wg show all private-key
wireguard.cali	kJbrfATGFP2v4sl+Wqg1Gv8zwFpIXshYFFD3udMDd3k=

wg show all preshared-keys
wireguard.cali	6WtZqEKSmoSKiFp20fhk/jyTcrTqf9qshyZI1HvE9Qk=	(none)
wireguard.cali	+fOEOJgFxueIbrp709iB4F4gFRb2ny4lWKbxCNNfczM=	(none)
wireguard.cali	d2LgXvRo4DwsyhiLXUn9TEt6D3l4pFIVlCD7KESR/m0=	(none)

# 그외 키타 정보
wg show all dump
wg show all endpoints
wg show all peers
wg show all transfer
wg show all persistent-keepalive

 

 

동작 확인

#파드 생성
curl -s -O https://raw.githubusercontent.com/gasida/NDKS/main/5/node3-pod3.yaml
kubectl apply -f node3-pod3.yaml

# 파드 Shell 접속(zsh)
kubectl exec -it pod1 -- zsh
## 파드 Shell 에서 아래 입력
ping <pod2 혹은 pod3 IP>

# 파드가 동작하는 노드의 eth0(예시)에서 패킷 덤프
ss -unlp
tcpdump -i <eth0> -nn udp port 51820
tcpdump -i ens5 -nn udp port 51820
혹은 아래 처럼 파일로 저장 후 해당 파일을 다운받아서 확인(wireshark 등 사용)
tcpdump -i <eth0> udp port 51820 -w /tmp/calico-wireguard.pcap
tcpdump -i ens5 udp port 51820 -w /tmp/calico-wireguard.pcap

# 현재 모든 워커 노드에 tcpdump 후 ping curl 테스트 시 모든 노드에서 트래픽이 발생한다 >> 이유는 VirtualBox 에 nic2 에 "무작위 모드 : 모두 허용" 상태여서, 모든 노드로 패킷이 전달됨
# VirtualBox 에 nic2 에 "무작위 모드 : 거부"로 설정 후 테스트 하게 되면 정확하게, 출발지와 목적지의 VM에서만 패킷이 확인된다!
모드워커노드) tcpdump -i ens5 -nn udp port 51820

 

패킷 덤프를 뜬 후 아래와 같이 Wireshark을 통해 WireGuard Protocol의 헤더 안쪽이 Encrypted Packet으로 나오는 것을 알 수 있습니다. 

 

파드 삭제 및 wireguardEnabled Off

# 파드 삭제
kubectl delete -f node3-pod3.yaml

# wireguardEnabled Off
calicoctl patch felixconfiguration default  --patch '{"spec":{"wireguardEnabled": false}}'

 

 

Calico 네트워크 접근 통제

네트워크 정책(Network Policy)은 쿠버네티스 클러스터 내부에서 파드 간에 통신할 경우 트래픽 룰을 규정하는 것입니다.

 

네트워크 정책 구성

네트워크 정책은 인그레스(Ingress 수신)이그레스(Egrss 송신)로 구성되어 있습니다.

설정 범위podSelector 로 지정합니다.

네트워크 정책은 네임스페이스별로 생성해야 합니다.

 

네트워크 정책 실습

실습을 위해서 Calico 설정 변경

# 현재 설정 확인
calicoctl get ippool -o wide

# calico nat true 설정
cat <<EOF | calicoctl replace -f -
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  blockSize: 24
  cidr: 172.16.0.0/16
  ipipMode: Never
  nodeSelector: all()
  vxlanMode: Always
  natOutgoing: true
EOF

# calico wireguard 끄기
calicoctl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":false}}'

# ipip mode 설정
kubectl apply -f https://raw.githubusercontent.com/gasida/NDKS/main/4/calico-ndks.yaml
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/vxlanMode: Always/vxlanMode: Never/" | calicoctl apply -f -
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/ipipMode: Never/ipipMode: Always/" | calicoctl apply -f -
calicoctl get ippool default-ipv4-ippool -o wide

# 변경 설정 적용을 위해서 calico 파드 삭제 후 재생성
kubectl delete pod -n kube-system -l k8s-app=calico-node

# 모든 노드에서 enp0s8 down 후 up (라우팅 테이블 갱신을 위함)
route -n && echo && ip link set enp0s8 down && sleep 1 && ip link set enp0s8 up && route -n

 

파드 생성 및 확인 : default ns 에 파드 2개 , nptest ns 에 파드 2개 - 각각 파드는 레이블을 지정

# 모니터링
watch -d 'calicoctl get wep -n default;echo;calicoctl get wep -n nptest'

# 생성
kubectl apply -f https://raw.githubusercontent.com/gasida/NDKS/main/5/networkpolicy-playground.yaml

# 확인
kubectl get ns
calicoctl get wep -owide
calicoctl get wep -owide -n nptest

# 네임스페이스에 레이블 지정
kubectl label ns default ns=default
kubectl label ns nptest ns=nptest

# 확인
kubectl get ns --show-labels
NAME              STATUS   AGE     LABELS
default           Active   66m     kubernetes.io/metadata.name=default,ns=default
nptest            Active   4m17s   kubernetes.io/metadata.name=nptest,ns=nptest
...

 

기본 통신 확인

# 파드 정보 확인
calicoctl get wep -owide
calicoctl get wep -owide -n nptest

# 파드 IP주소를 변수에 지정
DEFAULTPOD1=$(calicoctl get workloadEndpoint | grep np1 | awk '{print $3}' | cut -d "/" -f 1)
echo $DEFAULTPOD1
DEFAULTPOD2=$(calicoctl get workloadEndpoint | grep np2 | awk '{print $3}' | cut -d "/" -f 1)
echo $DEFAULTPOD2
NPTESTPOD3=$(calicoctl get workloadEndpoint -n nptest | grep np3 | awk '{print $4}' | cut -d "/" -f 1)
echo $NPTESTPOD3
NPTESTPOD4=$(calicoctl get workloadEndpoint -n nptest | grep np4 | awk '{print $4}' | cut -d "/" -f 1)
echo $NPTESTPOD4

# 기본 접속 확인 - 파드 간 통신
kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $DEFAULTPOD2

kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $NPTESTPOD3

kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $NPTESTPOD4

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $DEFAULTPOD2 | grep nginx!

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $NPTESTPOD3 | grep nginx!

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $NPTESTPOD4 | grep nginx!

# 기본 접속 확인 - 파드 >> 외부 통신
kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 www.google.com

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 ipinfo.io/city
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 ipinfo.io/org
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 ipinfo.io/loc
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 

# (옵션) k8s-rtr >> 파드 : 단, BGP 로 광고 전파 상태
ping -i 1 -W 1 -c 1 -I 10.1.1.254 <sample-pod-np1 의 IP>
root@k8s-rtr:~# ping -i 1 -W 1 -c 1 -I 10.1.1.254 172.16.34.2
PING 172.16.34.2 (172.16.34.2) 56(84) bytes of data.
64 bytes from 172.16.34.2: icmp_seq=1 ttl=63 time=0.606 ms

curl -s --connect-timeout 2 --interface 10.1.1.254 <sample-pod-np1 의 IP> | grep nginx!
root@k8s-rtr:~# curl -s --connect-timeout 2 --interface 10.1.1.254 172.16.34.2 | grep nginx!
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>

 

클라우드에 적합한 인바운드는 모두 차단하고, 아웃바운드는 모두 허용하는 정책을 모든 네임스페이스에 적용

cat <<EOF> cloud-networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: cloud-networkpolicy
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Ingress
  - Egress
EOF

 

# (워커노드) 필터링 테이블의 정책을 파일로 저장 및 갯수 확인
iptables -t filter -S |grep cali- > calico-policy1.txt

iptables -t filter -S |grep cali- | wc -l
89

# 정책 생성
kubectl apply -f cloud-networkpolicy.yaml
kubectl apply -n nptest -f cloud-networkpolicy.yaml

# (워커노드) 필터링 테이블의 정책을 파일로 저장 및 변경 정보 확인
iptables -t filter -S |grep cali- > calico-policy2.txt

diff calico-policy1.txt calico-policy2.txt

iptables -t filter -S |grep cali- | wc -l
109

# 정책 확인
kubectl get netpol

kubectl describe netpol cloud-networkpolicy
Name:         cloud-networkpolicy
Namespace:    default
Created on:   2021-11-08 15:58:16 +0000 UTC
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
  Allowing ingress traffic:
    <none> (Selected pods are isolated for ingress connectivity)
  Allowing egress traffic:
    To Port: <any> (traffic allowed to all ports)
    To: <any> (traffic not restricted by destination)
  Policy Types: Ingress, Egress

# 기본 접속 확인 - 파드 간 통신
kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $DEFAULTPOD2

kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $NPTESTPOD3

kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $NPTESTPOD4

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $DEFAULTPOD2 | grep nginx!

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $NPTESTPOD3 | grep nginx!

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $NPTESTPOD4 | grep nginx!

# 기본 접속 확인 - 파드 >> 외부 통신
kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 www.google.com

kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 ipinfo.io/city
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 ipinfo.io/org
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 ipinfo.io/loc
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 ipinfo.io

# (옵션) k8s-rtr >> 파드 : 단, BGP 로 광고 전파 상태
ping -i 1 -W 1 -c 1 -I 10.1.1.254 <sample-pod-np1 의 IP>
curl -s --connect-timeout 2 --interface 10.1.1.254 <sample-pod-np1 의 IP> | grep nginx!

 

Calico 자체 제공 추가 기능 : GlobalNetworkPolicy (GNP) → 개별 네임스페이스 마다 설정할 필요 없이 모든 네임스페이스에 정책 적용 (옵션: 중요 네임스페이스는 예외 처리)

 

정책 예)

1) 특정 레이블을 가진 파드에서 들어오는 통신을 허가

cat <<EOF> sample-podselector-ingress-networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: sample-podselector-ingress-networkpolicy
spec:
  podSelector:
    matchLabels:
      app: np2
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: np1
    ports:
    - protocol: TCP
      port: 80
EOF

 

# 정책 생성
kubectl apply -f sample-podselector-ingress-networkpolicy.yaml

# 정책 확인
kubectl get netpol
NAME                                       POD-SELECTOR   AGE
cloud-networkpolicy                        <none>         48m
sample-podselector-ingress-networkpolicy   app=np2        13s

kubectl describe netpol cloud-networkpolicy
Name:         sample-podselector-ingress-networkpolicy
Namespace:    default
Created on:   2021-11-08 16:46:51 +0000 UTC
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     app=np2
  Allowing ingress traffic:
    To Port: 80/TCP
    From:
      PodSelector: app=np1
  Not affecting egress traffic
  Policy Types: Ingress

# 기본 접속 확인 - 파드 간 통신 : sample-pod-np1 >> sample-pod-np2 로 TCP 80 만 허용!
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $DEFAULTPOD2 | grep nginx!
kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $DEFAULTPOD2

 

2) 특정 네임스페이스에서 들어오는 통신을 허가

cat <<EOF> sample-namespaceselector-ingress-networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: sample-namespaceselector-ingress-networkpolicy
  namespace: nptest
spec:
  podSelector:
    matchLabels:
      app: np3
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          ns: default
    ports:
    - protocol: TCP
      port: 80
EOF
# 정책 생성
kubectl apply -f sample-namespaceselector-ingress-networkpolicy.yaml

# 정책 확인
kubectl get netpol -n nptest
NAME                                             POD-SELECTOR   AGE
cloud-networkpolicy                              <none>         46m
sample-namespaceselector-ingress-networkpolicy   app=np3        2m2s

kubectl describe netpol -n nptest sample-namespaceselector-ingress-networkpolicy
Name:         sample-namespaceselector-ingress-networkpolicy
Namespace:    nptest
Created on:   2021-11-08 16:52:19 +0000 UTC
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     app=np3
  Allowing ingress traffic:
    To Port: 80/TCP
    From:
      NamespaceSelector: ns=default
  Not affecting egress traffic
  Policy Types: Ingress

# 기본 접속 확인 - 파드 간 통신 : sample-pod-np1 >> sample-pod-np3 로 TCP 80 만 허용!
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $NPTESTPOD3 | grep nginx!
kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $NPTESTPOD3

 

3) 특정 IP 블록에서 들어오는 통신을 허가

cat <<EOF> sample-ipblock-ingress-networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: sample-ipblock-ingress-networkpolicy
  namespace: nptest
spec:
  podSelector:
    matchLabels:
      app: np4
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: $DEFAULTPOD1/32
    ports:
    - protocol: TCP
      port: 80
EOF
# 정책 생성
kubectl apply -f sample-ipblock-ingress-networkpolicy.yaml

# 정책 확인
kubectl get netpol -n nptest
NAME                                             POD-SELECTOR   AGE
cloud-networkpolicy                              <none>         50m
sample-ipblock-ingress-networkpolicy             app=np4        1s
sample-namespaceselector-ingress-networkpolicy   app=np3        6m52s

kubectl describe netpol -n nptest sample-ipblock-ingress-networkpolicy
Name:         sample-ipblock-ingress-networkpolicy
Namespace:    nptest
Created on:   2021-11-08 16:59:10 +0000 UTC
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     app=np4
  Allowing ingress traffic:
    To Port: 80/TCP
    From:
      IPBlock:
        CIDR: 172.16.34.2/32
        Except:
  Not affecting egress traffic
  Policy Types: Ingress

# 기본 접속 확인 - 파드 간 통신 : sample-pod-np1($DEFAULTPOD1, 172.16.34.2/32) >> sample-pod-np4 로 TCP 80 만 허용!
kubectl exec -it sample-pod-np1 -- curl -s --connect-timeout 2 $NPTESTPOD4 | grep nginx!
kubectl exec -it sample-pod-np1 -- ping -i 1 -W 1 -c 1 $NPTESTPOD4

 

실습 환경 삭제

# CloudFormation 스택 삭제
aws cloudformation delete-stack --stack-name mylab

# [모니터링] CloudFormation 스택 상태 : 삭제 확인
while true; do 
  date
  AWS_PAGER="" aws cloudformation list-stacks \
    --stack-status-filter CREATE_IN_PROGRESS CREATE_COMPLETE CREATE_FAILED DELETE_IN_PROGRESS DELETE_FAILED \
    --query "StackSummaries[*].{StackName:StackName, StackStatus:StackStatus}" \
    --output table
  sleep 1
done

 

 

참고 

WG VPN 해부 - 링크 & 개발 계획서 - 링크 & 데브시스터즈 WG 로 VPN 서버 구축하기 - 링크1 링크2 & WG 대시보드 - 링크 & Kilo MultiCloud K8S Network -링크

 

Calico Policy - Stars policy demo - 링크 링크2