리셋 되지 말자

[kubernetes] kube-proxy 본문

오케스트레이션

[kubernetes] kube-proxy

kyeongjun-dev 2021. 7. 14. 18:28

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 의 통신에 문제가 생긴다

'오케스트레이션' 카테고리의 다른 글

[k8s] Istio mTLS 완전정복  (0) 2022.07.22
[kubernetes] Pod 생성  (0) 2021.07.15
[kubernetes] kubelet  (0) 2021.07.14
[kubernetes] kubectl  (0) 2021.07.14
[docker swarm] swarm을 이용한 클러스터 환경 구성하기  (0) 2021.03.30
Comments