kubernetes

자원 관리 / 식별 (Selector / Label)

쿠베너티스에서 컨테이너의 생성/삭제가 자유롭습니다. 이떄, 컨테이너의 생성과 삭제에 따른 IP값이 변하게 됩니다. IP값이 변경된다면 쿠버네티스에서는 컨테이너를 어떻게 관리하고 식별할 수 있을까요?? 우선은 쿠버네티스 이전에 관리방법에 대해 알아봅시다.

기존에는 여러개의 서버의 고정된 IP값을 활용해서 nginx를 통해 로드밸런싱을 구현하였습니다. 간단한 설정을 보면 아래와 같습니다.

nginx
http {
  upstream backend { // Nginx 요청 시 우회할 정보
    server 10.11.12.13:3000;
    server 10.11.12.14:3000;
    server 10.11.12.15:3000;
  }
 
  server {
    listen 80; // client 요청 포트
 
    //  / 로 시작하는 path에 접근하면 http://backend로 리턴하겠다.
    location / {
      proxy_set_header Connection ""; // upstream서버를 사용
      proxy_pass http://backend;
    }
  }
}

위의 예시는 80번 포트로 요청이 들어오면 3000포트로 로드밸런싱이 진행된다고 불 수 있습니다. nginx로 기존 서버를 설정할 수 있었던 이유는 물리 서버나 가상머신이 만들어진 이후에 고정된 IP에서 애플리케이션 개발을 진행/배포 했기 때문입니다. 하지만 쿠버네티스에서는 물리적 서버나 컨테이너가 지속적으로 변경되다보니 동적으로 IP값이 변경됩니다. 또한 컨테이너 생성 전에는 IP값을 미리 알수도 없기 때문에 설사전 설정이 불가능합니다. 이러한 특성은 쿠버네티스에서는 IP값으로 컨테이너를 식별하지 않음을 의미합니다.

Label

쿠버네티스에서는 label을 사용해서 컨테이너를 식별합니다. label은 어려운 개념을 아니고 key/value와 같이 자유롭게 설정할 수 있습니다. 예시를 확인해 봅시다.

labels
labels:
  app: my-app

위와 같이 labels로 식별을 위한 tag를 넣어줄 수 있습니다. 그리고 이 label을 식별하는 것이 selector라고 합니다. label과 selector를 db로 생각해 보면 label이 데이터값이라면, selector가 쿼리라고 생각입니다. 식별 방법은 다음과 같습니다.

selector
selector:
  app: my-app

selector에 값이 들어간 key/value가 둘다 같은 객체를 찾아서 식별합니다. 따라서 만약 원하는 객체 그룹핑도 다양하게 가능합니다.

selector
selector:
  app: my-app
  type: frontend
  available: true

위의 의미는 app이 my-app이고 type이 frontend인 것들 중에서 available이 true인 객체들을 찾는다는 의미입니다.


Word

  • Proxy Server : 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램으로 크게 Forward Proxy Server와 Reverse Proxy Server로 나뉜다.
  • Forward Proxy server : 클라이언트의 요청을 중간에서 Forward Proxy Server가 가로챈다. 즉 웹사이트에 직접적으로 접근할 수 없게 한다. 따라서 사용자 IP 주소 추적이 어렵다.
  • Reverse Proxy server : 여러개의 웹서버 앞에서 Load Balancing에 사용된다. 보안에 좋고, 본 서버의 IP를 노출 시킬 필요가 없다.
  • Forward Proxy / Reverse Proxy : 포워드 프록시 서버는 클라이언트 앞에 놓여져 있는 반면, 리버스 프록시 서버는 웹서버 앞에 놓여 있습니다. 포워드 프록시 서버를 사용하면 클라이언트와 직접 통신하는 웹서버가 없다는 것을 알 수 있습니다. 반면 리버스 프록시 서버를 사용하면 웹서버와 직접 통신하는 클라이언트가 없다는 것을 알 수 있습니다.