본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 19: Kube Proxy

by 공부하는 무니 2023. 1. 3.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests  강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이번 레슨에서는 kube-proxy에 대해 알아보도록 하겠습니다.

Kube Proxy

Kubernetes 클러스터 내에서 모든 파드는 다른 파드와 소통할 수 있습니다. 이는 클러스터에 대한 파드 네트워킹 솔루션 배포를 통해 수행됩니다. 파드 네트워크는 클러스터의 모든 노드에 걸쳐져 있고, 모든 파드에 연결되어 있는 internal virtual network 입니다. 이 네트워크를 통해, 파드들은 서로 소통할 수 있습니다. 이런 네트워크를 배포하기 위한 많은 솔루션들이 있습니다.

예를 들어, 첫 번째 노드에 웹 어플리케이션이 하나 있다고 합시다. 두 번째 노드에는 데이터베이스 애플리케이션이 있습니다. 웹 앱은 파드의 IP을 사용하여 간단하게 데이터베이스에 접근할 수 있습니다. 그러나 데이터베이스 파드 IP가 항상 동일하다는 보장은 되지 않습니다.

웹 애플리케이션이 데이터베이스에 접근하는 더 나은 방법은 서비스를 사용하는 것입니다. 따라서 클러스터 전체에 데이터베이스 애플리케이션을 노출하는 서비스를 만듭니다. 이제 웹 애플리케이션은 서비스 이름인 DB를 사용하여 데이터베이스에 접근할 수 있습니다. 서비스는 IP주소도 할당받기 때문에, 파드가 서비스 IP나 서비스 이름을 사용하여 서비스에 접근할때마다, 서비스는 트래픽을 백엔드 파드(데이터베이스)로 전달합니다. 자, 이러한 서비스는 무엇이고 어떻게 IP를 받아올까요? 서비스가 동일한 파드 네트워크에 조인될까요? 서비스는 실물이 아니기 때문에 파드 네트워크에 조인할 수 없습니다. 서비스는 파드와 같은 컨테이가 아니어서 어떠한 인터페이스도, listening(대기하는) 프로세스도 없습니다. 쿠버네티스 메모리에서 그저 살아있는 가상 컴포넌트입니다. 그러나 우리는 방금 클러스터의 모든 노드에서 서비스에 접근할 수 있어야 한다고 말했습니다. 이것이 어떻게 가능할까요? 여기서 kube-proxy가 등장합니다. kube-proxy는 쿠버네티스 클러스터의 각 노드에서 실행되는 프로세스입니다. kube-proxy의 임무는 새로운 서비스를 찾고, 새로운 서비스가 생성될 때마다 각 노드에 해당 서비스에 대한 트래픽을 백엔드 파드로 전달하기 위한 적절한 규칙을 생성하는 것입니다. 이 규칙을 생성하는 한 가지 방법은 iptables 규칙을 사용하는 것입니다. 지금과 같은 케이스에서 kube-proxy는 클러스터의 각 노드에서 서비스 IP(10.96.0.12)로 향하는 트래픽을 전달하기 위해 iptables 규칙을 생성합니다. iptables 규칙은 실제 파드의 IP인 10.32.0.15를 서비스 IP 10.96.0.12로 변경합니다. 이것이 kube-proxy가 서비스를 구성하는 방식입니다. 우리는 네트워킹과 서비스, kube-proxy 및 파드 네트워킹에 대해 이 섹션의 뒷 부분에서 더 살펴볼 것입니다. 네트워킹을 위한 섹션이 따로 있습니다. 지금은 대략적인 개요만 보고 넘어가겠습니다.

Install kube-proxy - Manual

이제 kube-proxy를 설치하는 방법을 살펴보겠습니다. 아래 코드와 같이 쿠버네티스 릴리즈 페이지에서 kube-proxy 바이너를 다운로드받고 압축을 풀고, 서비스로 실행합니다.

$ wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-proxy

View kube-proxy options - kubeadm

kubeadm 툴은 kube-proxy를 각 노드의 파드로 배포합니다. 실제로는 DaemonSet이라는 이름으로 배포되며 항상 클러스터의 각 노드에서 단일 파드로 배포됩니다. 아래 커맨드로 확인할 수 있습니다.

$ kubectl get pods -n kube-system

DaemonSet에 대해서도 후에 자세히 다룰 예정입니다.

반응형

댓글