[kubernetes] kube-proxy
kube-proxy
kubelet이 pod의 상태를 관리한다면, kube-proxy는 pod의 통신을 담당.
kube-proxy 에 문제가 생겼을 때의 시나리오
쿠버네티스 클러스터 구성할 때, br_netfilter 커널 모듈을 적재하고 iptables를 거쳐 통신하도록 설정한 상태임
- master 노드에서 kubectl을 통해, nginx pod를 배포 (nginx-pod.yaml 내용 - 링크)
[vagrant@m-k8s ~]$ sudo kubectl create -f nginx-pod.yaml
pod/nginx-pod created
[vagrant@m-k8s ~]$ sudo kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 0/1 ContainerCreating 0 13s <none> w2-k8s <none> <none>
[vagrant@m-k8s ~]$ sudo kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Running 0 78s 172.16.103.130 w2-k8s <none> <none>
w2-k8s 노드에 배포된 것을 확인
- master 노드에서 curl 테스트
[vagrant@m-k8s ~]$ curl 172.16.103.130
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
(생략)
정상 동작 확인
- nginx pod가 배포된 worker 노드에 접속해 br_netfilter 모듈을 제거
[vagrant@w2-k8s ~]$ sudo modprobe -r br_netfilter
[vagrant@w2-k8s ~]$ sudo systemctl restart network
modprobe -r br_netfilter 명령으로 br_netfilter 모듈을 제거.
(-r 옵션은 remove를 의미)
- master 노드에서 다시 한번 curl로 nginx pod의 정보를 가져오기
[vagrant@m-k8s ~]$ sudo kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Running 0 12m 172.16.103.130 w2-k8s <none> <none>
[vagrant@m-k8s ~]$ curl 172.16.103.130
^C
[vagrant@m-k8s ~]$ curl 172.16.103.130
curl: (7) Failed connect to 172.16.103.130:80; 연결 시간 초과
오래 걸리고, 오래 기다려봐도 실패 확인.
kube_proxy가 이용하는 br_netfilter에 문제가 있어서 worker 노드의 pod의 nginx 웹 서버와의 통신이 되지 않음.
- worker 노드에서 br_netfilter를 다시 커널에 적재하고 worker 노드를 재시작(reboot)
[vagrant@w2-k8s ~]$ sudo modprobe br_netfilter
[vagrant@w2-k8s ~]$ sudo reboot
br_netfilter 적재 후, network를 재시작해도 curl이 동작하지 않았음.
- 재시작 후, nginx pod 확인
[vagrant@m-k8s ~]$ sudo kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Running 1 17m 172.16.103.131 w2-k8s <none> <none>
RESTARTS가 1회 증가하고, IP 주소가 변경된 것을 확인할 수 있음
- curl 동작 확인
[vagrant@m-k8s ~]$ curl 172.16.103.131
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
(생략)
- 배포한 nginx pod를 삭제
[vagrant@m-k8s ~]$ sudo kubectl delete -f nginx-pod.yaml
pod "nginx-pod" deleted
정리 : kube_proxy에 문제가 생기면, pod 의 통신에 문제가 생긴다