Home [K8S] iptables 설정이 80, 443 통신을 막는 이슈
Post
Cancel

[K8S] iptables 설정이 80, 443 통신을 막는 이슈

Description

  • Kubernetes 클러스터의 특정 worker node 에서 80 과 443 포트로의 통신이 누락되는 경우가 발생.
  • 해당 이슈를 해결하기 위해서 인프라분들과 팀원분들이 디버깅을 수행해주심

iptables

  • 시스템 관리자가 리눅스 커널 방화벽이 제공하는 테이블들과 그것을 저장하는 체인, 규칙들을 구성할 수 있게 해주는 사용자 공간 응용 프로그램

Cause

  • Storage 작업을 위한 컴포넌트들을 설치한 서버가 자동으로 특정 노드에 iptables 설정을 추가함.
  • 아래와 같이 iptables 을 명령어로 확인할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
test-a100:~$ sudo -i

root@test-a100:~# iptables -L -t nat -v
Chain PREROUTING (policy ACCEPT 233 packets, 75208 bytes)
 pkts bytes target     prot opt in     out     source               destination
 445K  146M KUBE-SERVICES  all  --  any    any     anywhere             anywhere             /* kubernetes service portals */
    0     0 REDIRECT   tcp  --  any    any     anywhere             anywhere             tcp dpt:http redir ports 47080
  234 14040 REDIRECT   tcp  --  any    any     anywhere             anywhere             tcp dpt:https redir ports 47443
 
Chain INPUT (policy ACCEPT 17 packets, 1020 bytes)
 pkts bytes target     prot opt in     out     source               destination
 
Chain OUTPUT (policy ACCEPT 23 packets, 1380 bytes)
 pkts bytes target     prot opt in     out     source               destination
81376 4933K KUBE-SERVICES  all  --  any    any     anywhere             anywhere             /* kubernetes service portals */
    0     0 REDIRECT   tcp  --  any    lo      anywhere             anywhere             tcp dpt:http redir ports 47080
  193 11580 REDIRECT   tcp  --  any    lo      anywhere             anywhere             tcp dpt:https redir ports 47443
...
...
  • 아래의 PREROUTING Chain 은 Kubernetes 의 Pod에서 Network 요청을 날리면 해당 rule 이 적용됨
  • 따라서 Pod에서 HTTP(80), HTTPS(443) 외부 통신을 하게 되면 각각 localhost:47080, localhost:47443 으로 redirecting 이 된다.
  • 이 때문에 pod 내의 외부통신이 불가능함
1
2
3
4
5
Chain PREROUTING (policy ACCEPT 233 packets, 75208 bytes)
pkts bytes target     prot opt in     out     source               destination
445K  146M KUBE-SERVICES  all  --  any    any     anywhere             anywhere             /* kubernetes service portals */
   0     0 REDIRECT   tcp  --  any    any     anywhere             anywhere             tcp dpt:http redir ports 47080
 234 14040 REDIRECT   tcp  --  any    any     anywhere             anywhere             tcp dpt:https redir ports 47443
  • Pod 의 Image pull 같은 경우는 Pod 내부 통신이 아니라 Host 통신이기 때문에 OUTPUT chain의 rule 에 적용됨.
  • OUTPUT 같은 경우는 out 이 lo 즉, localhost 로의 요청인 경우만 redirecting 되기 때문에 영향이 없었음
1
2
3
4
5
Chain OUTPUT (policy ACCEPT 23 packets, 1380 bytes)
 pkts bytes target     prot opt in     out     source               destination
81376 4933K KUBE-SERVICES  all  --  any    any     anywhere             anywhere             /* kubernetes service portals */
    0     0 REDIRECT   tcp  --  any    lo      anywhere             anywhere             tcp dpt:http redir ports 47080
  193 11580 REDIRECT   tcp  --  any    lo      anywhere             anywhere             tcp dpt:https redir ports 47443

Solution

  • Storage 쪽 관계자 분들께 요청드려서 해당 Rule 을 삭제하여 해결

What did I learned?

  • Kubernetes 내부적으로 kube-proxy가 iptable을 건드린다. 해당 부분에 대한 깊은 이해가 필요하다고 느낌.
  • 또한 네트워크 테스트 중 패킷이 유실되는 경우가 있을 때, 어떤 부분이 문제인지 차근 차근 스텝 별로 따져가면서 확인해야함. 이를 위해서 어떤 스텝으로 네트워킹이 이루어지는지 확실하게 알고 있을 필요가 있음.
This post is licensed under CC BY 4.0 by the author.