가시다님의 Kubernetes Advanced Networking Study에 참여하게 되어, 스터디 때 다룬 주제를 정리하려고 합니다.
1주차는 컨테이너 격리 & 네트워크 및 보안이 진행되었으며, 이번 글에서는 iptables 관련된 개념을 포함하고 있습니다.
들어가며
kubernetes의 주요 구성요소 중 하나인 kube-proxy는 클러스터 내부의 서비스간 통신을 가능하게 하기 위해서 iptables를 사용하고 있습니다(iptables 모드인 경우).
이번 글에서는 kubernetes 서비스의 통신 방식을 알아보기 전에 iptables의 개념과 동작 방식을 정리해보려 합니다.
iptables 개념
iptables는 방화벽으로 네트워크 필터링(허용/차단)과 제어를 수행합니다. 커널 모듈인 netfilter hook과 상호 작용하며, 여러개의 테이블(table), 체인(chain), 규칙(rule)으로 구성되어 있습니다.
Table
테이블은 특정한 네트워크 작업을 처리하기 위한 규칙들의 모음입니다. 역할이 다른 총 5개의 테이블이 있으며, 각 테이블에는 체인과 규칙이 포함됩니다.
- Filter 테이블 : 패킷 필터링(허용/차단), 가장 기본 테이블(iptables 명령어에
-t
옵션 미정의시 기본으로 사용) - NAT 테이블 : 패킷의 src/dst ip 및 포트 변경
- Mangle 테이블 : ip 헤더 변조(예시 - TTL값 조정, 네트워크 홉 수 조정 등)
- Raw 테이블 : 연결 추적(Connection Tracking) 시스템에 의해서 처리되지 않아야 하는 패킷에 마킹
- Security 테이블 : 패킷에 SELinux의 보안 context를 설정
Chain
체인은 패킷에 대해 언제 규칙을 평가할 지 결정합니다. 기본적인 체인이 있으며, 이는 netfilter hook을 대표합니다.
이 외에도 커스텀한 체인을 직접 추가할수도 있습니다.
- PREROUTING
- 패킷 라우팅 결정 전에 적용
NF_IP_PRE_ROUTING
hook- incoming 패킷이 network stack에 진입하자마자 트리거
- 라우팅 전에 처리
- INPUT:
- 시스템으로 들어오는 패킷에 대해 적용
NF_IP_LOCAL_IN
hook
- incoming 패킷의 목적지가 로컬일때 라우팅 이후 트리거
- FORWARD
- 시스템을 통과하여 다른 네트워크로 전달되는 패킷에 대해 적용
NF_IP_FORWARD
hook- incoming 패킷이 다른 호스트로 포워딩될 때 해당 호스트로 라우팅 이후 트리거
- OUTPUT
- 시스템에서 나가는 패킷에 대해 적용
NF_IP_LOCAL_OUT
hook- 로컬에서 생성된 Outbound 트래픽에 의해 트리거
- POSTROUTING
- 패킷이 라우팅 이후에 적용(Outbound, Forward에 대해)
NF_IP_POST_ROUTING
hook- 라우팅 이후 Outbound or 포워딩 트래픽에 의해 트리거
- 패킷이 최종적으로 전송되기 직전에 마지막으로 적용할 수 있는 규칙 정의
- 라우팅 이후 Outbound or 포워딩 트래픽에 의해 트리거
Rule
패킷을 검사하고, 조건에 맞는 패킷에 대해 action을 수행하도록 정의합니다.
- Matching
- 패킷이 조건에 맞는지 확인
- 설정 가능 항목
- 프로토콜 타입
- src/dst 주소/포트
- input/output 인터페이스
- ...
- Targets(Action)
- 패킷이 조건에 맞을 때 수행하는 것
- 종류
- Terminating targets : 체인 내에서의 평가를 종료하고, netfilter hook에 제어를 넘기면 패킷 드롭 또는 다음 단계를 진행
- Non-terminating targets : 액션 수행 후 체인 내에서의 평가를 계속 진행하며, 최종 결정을 내리기 전까지 여러 Non-termitating 타겟이 실행될 수 있음
- 사용 가능한 옵션
- ACCEPT : 패킷 허용
- DROP : 패킷 차단
- RETURN : 현재 체인에서의 평가를 끝내고, 이전에 호출한 체인의 다음 규칙으로 돌아가며, 만약 기본 체인의 끝에 도달했거나, RETURN 타겟을 가진 규칙이 일치하면, 체인 정책에 의해 패킷 처리 결정
- 그 외 사용 가능한 옵션(LOG, DNAT ...)
Table과 Chain
테이블은 아래와 같이 여러 개의 체인으로 구성되어 있습니다.
Table / Chains | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
(routing decision) | O | ||||
raw | O | O | |||
(connection tracking enabled) |
O | O | |||
mangle | O | O | O | O | O |
nat (DNAT) | O | O | |||
(routing decision) | O | O | |||
filter | O | O | O | ||
security | O | O | O | ||
nat (SNAT) | O | O |
각 테이블 내에서 체인 평가 순서는 왼쪽에서 오른쪽으로 진행됩니다.
ex) mangle 테이블 : PREROUTING -> INPUT -> FORWARD -> OUTPUT -> POSTROUTING
raw 테이블 : PREROUTING -> OUTPUT
또한, 체인은 테이블 별로 위에서 아래 방향으로 평가합니다.
ex) PREROUTING : raw -> mangle -> nat
아래 그림은 패킷 평가 순서 예시를 보여줍니다.
1) 외부에서 들어온 패킷
-> PREROUTING (raw -> mangle -> nat)
1) 목적지가 로컬
-> INPUT (mangle -> filter -> security)
2) 목적지가 다른 호스트
-> FORWARD(mangle -> filter -> security) -> POSTROUTING (mangle -> nat)
2) 내부에서 발생한 패킷
-> OUTPUT(raw -> mangle -> filter -> security) -> POSTROUTING
Connection Tracking(연결 추적)
Netfilter 프레임워크 위에 구축된 connection tracking 시스템은 iptables가 지속적인 연결의 맥락에서 패킷을 보고 결정을 내릴 수 있게 해줍니다(stateful). 패킷이 네트워크 스택에 진입한 직후 연결 추적이 실작됩니다. 그러나 raw 테이블의 체인에서 NOTRACK 으로 마킹된 패킷은 connection tracking 시스템을 우회합니다.
- 상태 종류
- NEW : 패킷이 기존 연결과 관련이 없지만, 첫 패킷으로서 유효한 경우 시스템에 새로운 연결이 추가(TCP, UDP 모두 해당)
- ESTABLISHED : 반대 방향에서 유효한 응답을 받은 경우 NEW -> ESTABLISHED로 변경되며, TCP의 경우 SYN/ACK를, UDP 및 ICMP의 경우 원래 패킷의 소스와 목적지가 바뀐 응답을 받은 것
- RELATED : 기존 연결과 관련이 있지만 직접적이지 않은 경우로, FTP 데이터 전송 및 다른 프로토콜의 연결 시도에 대한 ICMP 응답이 해당
- INVALID : 패킷이 기존 연결과 관련이 없고 새로운 연결을 여는 데 적절하지 않거나, 식별할 수 없거나, 라우팅할 수 없는 경우
- UNTRACKED : 패킷이 연결 추적을 우회하도록 raw 테이블 체인에서 타겟으로 지정된 경우
- SNAT : NAT 작업에 의해 소스 주소가 변경된 경우 설정되는 상태이며,응답 패킷에서 소스 주소를 다시 변경해야 함을 알기 위해 사용
- DNAT :NAT 작업에 의해 목적지 주소가 변경된 경우 설정되는 상태이며, 응답 패킷을 라우팅할 때 목적지 주소를 다시 변경해야 함을 알기 위해 사용
- 확인 방법
conntrack -L
명령어를 통해 현재 추적 중인 모든 연결을 확인할 수 있음
사용 예시
iptables 명령어를 사용해서 여러가지 설정을 추가해보겠습니다.
## 출발지 ip가 192.168.0.111인 패킷 차단
iptables -A INPUT -s 192.168.0.111 -j DROP
## tcp이며 목적지 port가 3000d인 패킷 차단
iptables -A INPUT --dport 3000 -p tcp -j DROP
## 목적지 ip가 11.11.11.0/24 대역인 경우 forward 허용
iptables -A FORWARD -d 11.11.11.0/24 -j ACCEPT
## ESTABLISH,RELATED 상태인 패킷 허용
iptables -A INPUT -m state --state ESTABLISH,RELATED -j ACCEPT
root@MyServer:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:3000
DROP all -- ip-192-168-0-111.ap-northeast-2.compute.internal anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere 11.11.11.0/24
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target prot opt source destination
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
iptables에 기본 체인 외에 DOCKER로 시작하는 체인들을 확인할 수 있습니다. 이는 docker를 설치하며 자동으로 추가된 체인입니다.
이러한 유저 정의 체인은 jump를 통해서만 평가될 수 있습니다.
Kubernetes 노드의 iptables 설정 이해하기
아래와 같은 Service가 있는 노드의 iptables 설정을 살펴보겠습니다.
## Service ip 확인
$ k get svc -A | grep 172.30.165.244
kube-system kube-dns-upstream ClusterIP 172.30.165.244 <none> 53/UDP,53/TCP 39d
$ k get svc -A | grep 172.30.0.10
kube-system kube-dns ClusterIP 172.30.0.10 <none> 53/UDP,53/TCP 39d
$ k get svc -A | grep 172.30.191.111
test svc-nginx ClusterIP 172.30.191.111 <none> 80/TCP 121d
## pod ip 확인 - svc-nginx에 연결
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-1-764d858646-c9v6j 1/1 Running 0 75m 10.56.135.64 ip-10-56-128-40.ap-northeast-2.compute.internal <none> <none>
nginx-deployment-1-764d858646-hzzh7 1/1 Running 0 75m 10.56.143.55 ip-10-56-128-40.ap-northeast-2.compute.internal <none> <none>
nginx-deployment-1-764d858646-s7wpt 1/1 Running 0 75m 10.56.115.164 ip-10-56-113-33.ap-northeast-2.compute.internal <none> <none>
nginx-deployment-1-764d858646-zzwtx 1/1 Running 0 75m 10.56.120.51 ip-10-56-113-33.ap-northeast-2.compute.internal <none> <none>
filter 테이블
[root@ip-10-56-128-40 /]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere ip-172-30-0-10.ap-northeast-2.compute.internal udp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT tcp -- anywhere ip-172-30-0-10.ap-northeast-2.compute.internal tcp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT udp -- anywhere ip-10-56-128-40.ap-northeast-2.compute.internal udp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT tcp -- anywhere ip-10-56-128-40.ap-northeast-2.compute.internal tcp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
KUBE-PROXY-FIREWALL all -- anywhere anywhere ctstate NEW /* kubernetes load balancer firewall */
KUBE-NODEPORTS all -- anywhere anywhere /* kubernetes health check service ports */
KUBE-EXTERNAL-SERVICES all -- anywhere anywhere ctstate NEW /* kubernetes externally-visible service portals */
KUBE-FIREWALL all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
KUBE-PROXY-FIREWALL all -- anywhere anywhere ctstate NEW /* kubernetes load balancer firewall */
KUBE-FORWARD all -- anywhere anywhere /* kubernetes forwarding rules */
KUBE-SERVICES all -- anywhere anywhere ctstate NEW /* kubernetes service portals */
KUBE-EXTERNAL-SERVICES all -- anywhere anywhere ctstate NEW /* kubernetes externally-visible service portals */
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- ip-172-30-0-10.ap-northeast-2.compute.internal anywhere udp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT tcp -- ip-172-30-0-10.ap-northeast-2.compute.internal anywhere tcp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT udp -- ip-10-56-128-40.ap-northeast-2.compute.internal anywhere udp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT tcp -- ip-10-56-128-40.ap-northeast-2.compute.internal anywhere tcp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
KUBE-PROXY-FIREWALL all -- anywhere anywhere ctstate NEW /* kubernetes load balancer firewall */
KUBE-SERVICES all -- anywhere anywhere ctstate NEW /* kubernetes service portals */
KUBE-FIREWALL all -- anywhere anywhere
Chain KUBE-EXTERNAL-SERVICES (2 references)
target prot opt source destination
Chain KUBE-FIREWALL (2 references)
target prot opt source destination
DROP all -- !ip-127-0-0-0.ap-northeast-2.compute.internal/8 ip-127-0-0-0.ap-northeast-2.compute.internal/8 /* block incoming localnet connections */ ! ctstate RELATED,ESTABLISHED,DNAT
Chain KUBE-FORWARD (1 references)
target prot opt source destination
DROP all -- anywhere anywhere ctstate INVALID
ACCEPT all -- anywhere anywhere /* kubernetes forwarding rules */ mark match 0x4000/0x4000
ACCEPT all -- anywhere anywhere /* kubernetes forwarding conntrack rule */ ctstate RELATED,ESTABLISHED
Chain KUBE-KUBELET-CANARY (0 references)
target prot opt source destination
Chain KUBE-NODEPORTS (1 references)
target prot opt source destination
Chain KUBE-PROXY-CANARY (0 references)
target prot opt source destination
Chain KUBE-PROXY-FIREWALL (3 references)
target prot opt source destination
Chain KUBE-SERVICES (2 references)
target prot opt source destination
...
INPUT
- 목적지 IP가 노드 IP 또는 CoreDNS 서비스 IP이고, 목적지 포트가 53(dpt:domain)인 TCP/UDP 패킷 허용
KUBE-FIREWALL
- 로컬 네트워크 범위가 아닌 모든 소스 IP로부터 127.0.0.0/8 네트워크로 들어오는 패킷을 차단하며, RELATED, ESTABLISHED, DNAT 상태가 아닌 패킷에 적용
KUBE-FORWARD
- INVALID 상태의 패킷 차단
nat 테이블
[root@ip-10-56-128-40 /]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- anywhere anywhere /* kubernetes service portals */
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- anywhere anywhere /* kubernetes service portals */
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
KUBE-POSTROUTING all -- anywhere anywhere /* kubernetes postrouting rules */
Chain AWS-CONNMARK-CHAIN-0 (0 references)
target prot opt source destination
Chain AWS-CONNMARK-CHAIN-1 (0 references)
target prot opt source destination
Chain AWS-SNAT-CHAIN-0 (0 references)
target prot opt source destination
Chain AWS-SNAT-CHAIN-1 (0 references)
target prot opt source destination
Chain KUBE-KUBELET-CANARY (0 references)
target prot opt source destination
Chain KUBE-MARK-MASQ (76 references)
target prot opt source destination
MARK all -- anywhere anywhere MARK or 0x4000
Chain KUBE-NODEPORTS (1 references)
target prot opt source destination
Chain KUBE-POSTROUTING (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere mark match ! 0x4000/0x4000
MARK all -- anywhere anywhere MARK xor 0x4000
MASQUERADE all -- anywhere anywhere /* kubernetes service traffic requiring SNAT */ random-fully
Chain KUBE-PROXY-CANARY (0 references)
target prot opt source destination
Chain KUBE-SEP-OUJNVWUPANHJ5D7L (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-110-113.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns:dns */
DNAT udp -- anywhere anywhere /* kube-system/kube-dns:dns */ udp to:10.56.110.113:53
Chain KUBE-SEP-4TRZVTDX7JGP665D (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-97-75.ap-northeast-2.compute.internal anywhere /* default/kubernetes:https */
DNAT tcp -- anywhere anywhere /* default/kubernetes:https */ tcp to:10.56.97.75:443
Chain KUBE-SEP-BDXXJQVH7SOZ6AOC (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-110-113.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns:dns-tcp */
DNAT tcp -- anywhere anywhere /* kube-system/kube-dns:dns-tcp */ tcp to:10.56.110.113:53
Chain KUBE-SEP-DSEZEV5X6SMTL566 (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-136-22.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns-upstream:dns */
DNAT udp -- anywhere anywhere /* kube-system/kube-dns-upstream:dns */ udp to:10.56.136.22:53
Chain KUBE-SEP-E3EVNX3IJVRRVQYB (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-110-113.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns-upstream:dns */
DNAT udp -- anywhere anywhere /* kube-system/kube-dns-upstream:dns */ udp to:10.56.110.113:53
Chain KUBE-SEP-FEAN3PXQ3RVOJ7A6 (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-115-164.ap-northeast-2.compute.internal anywhere /* test/svc-nginx */
DNAT tcp -- anywhere anywhere /* test/svc-nginx */ tcp to:10.56.115.164:80
Chain KUBE-SEP-H66XNUFOXCNKCG5F (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-110-113.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns-upstream:dns-tcp */
DNAT tcp -- anywhere anywhere /* kube-system/kube-dns-upstream:dns-tcp */ tcp to:10.56.110.113:53
Chain KUBE-SEP-JAHXFXMKFBHSMIBA (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-135-64.ap-northeast-2.compute.internal anywhere /* test/svc-nginx */
DNAT tcp -- anywhere anywhere /* test/svc-nginx */ tcp to:10.56.135.64:80
Chain KUBE-SEP-NWGFNYPQVHMB27ML (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-136-22.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns-upstream:dns-tcp */
DNAT tcp -- anywhere anywhere /* kube-system/kube-dns-upstream:dns-tcp */ tcp to:10.56.136.22:53
Chain KUBE-SEP-VSZSDJYX2QIYQA45 (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-143-55.ap-northeast-2.compute.internal anywhere /* test/svc-nginx */
DNAT tcp -- anywhere anywhere /* test/svc-nginx */ tcp to:10.56.143.55:80
Chain KUBE-SEP-VTEPO2XBDJA72UOF (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-129-252.ap-northeast-2.compute.internal anywhere /* default/kubernetes:https */
DNAT tcp -- anywhere anywhere /* default/kubernetes:https */ tcp to:10.56.129.252:443
Chain KUBE-SEP-WRP72UEH3UKKF7H5 (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-136-22.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns:dns */
DNAT udp -- anywhere anywhere /* kube-system/kube-dns:dns */ udp to:10.56.136.22:53
Chain KUBE-SEP-XX2VRC25EQBIFPHV (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-120-51.ap-northeast-2.compute.internal anywhere /* test/svc-nginx */
DNAT tcp -- anywhere anywhere /* test/svc-nginx */ tcp to:10.56.120.51:80
Chain KUBE-SEP-YWW7WJ6QBALFMODO (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- ip-10-56-136-22.ap-northeast-2.compute.internal anywhere /* kube-system/kube-dns:dns-tcp */
DNAT tcp -- anywhere anywhere /* kube-system/kube-dns:dns-tcp */ tcp to:10.56.136.22:53
Chain KUBE-SERVICES (2 references)
target prot opt source destination
KUBE-SVC-BRK3P4PPQWCLKOAN tcp -- anywhere ip-172-30-165-244.ap-northeast-2.compute.internal /* kube-system/kube-dns-upstream:dns-tcp cluster IP */ tcp dpt:domain
KUBE-SVC-ERIFXISQEP7F7OF4 tcp -- anywhere ip-172-30-0-10.ap-northeast-2.compute.internal /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
KUBE-SVC-MRW7XFPFSYA2VFWG tcp -- anywhere ip-172-30-191-111.ap-northeast-2.compute.internal /* test/svc-nginx cluster IP */ tcp dpt:http
...
KUBE-NODEPORTS all -- anywhere anywhere /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL
...
Chain KUBE-SVC-ERIFXISQEP7F7OF4 (1 references)
target prot opt source destination
KUBE-SEP-BDXXJQVH7SOZ6AOC all -- anywhere anywhere /* kube-system/kube-dns:dns-tcp -> 10.56.110.113:53 */ statistic mode random probability 0.50000000000
KUBE-SEP-YWW7WJ6QBALFMODO all -- anywhere anywhere /* kube-system/kube-dns:dns-tcp -> 10.56.136.22:53 */
Chain KUBE-SVC-MRW7XFPFSYA2VFWG (1 references)
target prot opt source destination
KUBE-SEP-FEAN3PXQ3RVOJ7A6 all -- anywhere anywhere /* test/svc-nginx -> 10.56.115.164:80 */ statistic mode random probability 0.25000000000
KUBE-SEP-XX2VRC25EQBIFPHV all -- anywhere anywhere /* test/svc-nginx -> 10.56.120.51:80 */ statistic mode random probability 0.33333333349
KUBE-SEP-JAHXFXMKFBHSMIBA all -- anywhere anywhere /* test/svc-nginx -> 10.56.135.64:80 */ statistic mode random probability 0.50000000000
KUBE-SEP-VSZSDJYX2QIYQA45 all -- anywhere anywhere /* test/svc-nginx -> 10.56.143.55:80 */
Chain KUBE-SVC-NPX46M4PTMTKRN6Y (1 references)
target prot opt source destination
KUBE-SEP-VTEPO2XBDJA72UOF all -- anywhere anywhere /* default/kubernetes:https -> 10.56.129.252:443 */ statistic mode random probability 0.50000000000
KUBE-SEP-4TRZVTDX7JGP665D all -- anywhere anywhere /* default/kubernetes:https -> 10.56.97.75:443 */
Chain KUBE-SVC-TCOU7JCQXEZGVUNU (1 references)
target prot opt source destination
KUBE-SEP-OUJNVWUPANHJ5D7L all -- anywhere anywhere /* kube-system/kube-dns:dns -> 10.56.110.113:53 */ statistic mode random probability 0.50000000000
KUBE-SEP-WRP72UEH3UKKF7H5 all -- anywhere anywhere /* kube-system/kube-dns:dns -> 10.56.136.22:53 */
KUBE-SERVICES
- 목적지 IP가 Kubernetes Service IP인 패킷에 대한 rule 정의
- ->
KUBE-SVC-MRW7XFPFSYA2VFWG
- 목적지 IP가 svc-nginx의 Service IP인 패킷에 대한 rule 정의
- Service에 연결된 여러 개의 파드(endpoint)에 대한 트래픽을 균등한 확률로 분산
- ->
KUBE-SEP-FEAN3PXQ3RVOJ7A6
- 목적지 IP를 파드 IP(10.56.115.164)로 변경(DNAT)
지금까지 iptables 개념을 알아보고 이를 기반으로 kubernetes 노드의 iptables에 설정된 내용을 확인해 봤습니다. iptables를 통해 Service ip를 기반으로 통신이 가능하며, 트래픽이 여러 파드로 분산되는 것을 확인할 수 있었습니다.
참고)
'Kubernetes > Network Study' 카테고리의 다른 글
Kubernetes Service 분석 - ClusterIP, NodePort (3) | 2024.09.28 |
---|---|
Calico 개념 및 실습 (3) | 2024.09.21 |
Flannel CNI 실습 (3) | 2024.09.07 |
Pause Container 이해하기 (11) | 2024.09.02 |
도커 없이 컨테이너 만들기 (1) | 2024.08.28 |