0부터 시작하는 Kubernetes 공부 - Service & Ingress 에 대해 알아보자

Jaehong Lee·2022년 9월 2일
2
post-thumbnail

1. Service

Service 의 종류

  • Cluster Ip : 두 개의 Pod 가 있는 경우, 각 Pod 별로 별도의 Ip 주소를 사용한다. 이들은 서로 간의 통신을 할 경우, 각 Pod 가 서로 다른 Node 에 있다고 가정한다면, 이들을 마치 하나의 네트워크에 연결하기 위한 환경이 필요한데, 이러한 클러스터상에서 서로 다른 노드에 있는 Pod 들간 통신이 가능하도록 하기 위하여 Cluster Ip 를 두게 된다

    • 외부와의 통신은 불가능하다
    • Cluster Ip 는 터널링, Overlay Network 를 제공해준다
    • 로드밸런서 기능을 제공
  • Node Port : 외부에서 Node 의 특정 Port ( 30000 ~ 32768 ) 에 접근하면, 포워딩을 통해 Node Port Service 의 특정 Port 와 연결하여, 해당 Service 의 특정 Port 와 연결된 Pod 의 Port 와 연결해준다

    • Node Port 는 Node 에 직접 접근해야 하므로, 부하 분산을 위해서는 앞에 Load Balancer 를 배치해야 한다

2. NodePort

Node Port 구현 요소

  • Service 구현시에도 Selector 가 있다

    1. ReplicaSet 의 Selector : Pod 의 label 을 확인하고, 지정된 개수를 유지하기 위한 것
    2. Service 의 Selector : 접속된 트래픽에 대하여 어떤 Pod 에게 전달할 하는지에 대한 것
    • 즉, Selector 는 관리할 label 을 지정하는 것이다
  • 구현시 Port 를 3 가지 지정해야 한다

    1. nodePort : 외부에서 Node 에 접속할 Port
    2. port : Node 로 접속된 트래픽이 전달될 node Port 서비스의 특정 포트
    3. targetPort : node Port 서비스의 특정 포트에 트래픽이 전달시 최종적으로 전달될 Pod 의 Port

Node Port 배포

  • 위와 같이 작성해주자
    • --- 를 사용하면, 작업을 구분하게 해준다
    • 여러 nodePort 를 정의 가능하다. 각 Port 별 name 을 지정해줄 수 있다

  • 잘 배포되었다

NodePort 는 중복이 안되므로 하나의 NodePort 는 하나의 Deployment 와 대응한다

접속해보기 - Node Ip 확인

  • Node 의 상세 정보를 yaml 파일 형태로 출력하자
  • ExternalIp 를 확인하자

접속해보기 - 방화벽 정책 생성

  • 30000 번 Port 에 대한 접근을 허용하는 방화벽 정책을 생성하자
  • 이제 접속이 가능하다

External Traffic Policy - Cluster & Scale 조정

  • 상세 정보를 확인해보자
    • External Traffic Policy 가 Cluster 라고 되어있다. 이는 트래픽을 전달해줄 범위이다

  • Scale 을 조정해주자

  • 하나의 Pod 만 동작중이다

  • 접속해보면, 해당 Node 의 Pod 는 중지되었지만, 자동으로 다른 Node 의 Pod 에 접속된다. 이는 범위가 Cluster 이기에, Cluster 환경에 있는 다른 Node 의 동작중인 Pod 에 자동으로 트래픽을 보내준다. 이때, Cluster Ip 는 동일하지만, Pod 기준으로 물리적으로 봤을 때, Hop 을 바꾸기 때문에 라우팅이 발생한다

  • 만약, local 로 되어있다면, 같은 Node 상에 있는 Pod 들에게만 전달되며, 만약 Node 에 동작중인 Pod 가 없으면, 다른 Node 로 전달해주지 못하므로 트래픽을 전달 못해준다

    • local 로 변경하면, 해당 노드에 있는 포드로만 접속하게 되고, 만약 포드가 없다면 서비스를 받을 수 없게 된다. 하지만 불필요한 라우팅은 없기 때문에 DataCenter 에 부담을 줄일 수 있게 된다

External Traffic Policy - Local

  • External Traffic Policy 을 추가하여 Local 로 작성해주자
  • 이제 Local 로 지정했으므로, Pod 가 없는 Node 에 접근하게 되면, 서비스를 못 받는다
  • 잘 배포되었는지 확인해보자. NodePort 는 트래픽이 Node 에 접근한 후 트래픽을 받으므로, External Ip 가 없다
  • Scale 을 조정해주자
  • Pod 가 존재하는 Node 에 접속하면 연결이 되지만, 다른 Pod 가 존재하지 않는 Node 에 접속하면 연결이 안된다
    • Local 로 지정했기에, Pod 가 없으면 해당 Node 의 다른 Pod 에게 전달해야 하는데, 다른 Pod 가 없으므로, Pod 가 없는 Node 에 접속하면 페이지에 연결이 되지 않는다

3. Ingress

p. 154

Ingress 란

  • Ingress는 HTTP(S) 기반의 L7 로드밸런싱 기능을 제공하는 컴포넌트이다. 고유한 주소를 제공하며, 외부에서 해당 주소로 들어온 트래픽을 Ingress 의 규칙에 따라 클러스터 내부의 Service로 라우팅 시켜준다. 이를 통해 사용 목적에 따라 다른 응답을 제공해줄 수 있다

Ingress 는 트래픽에 대한 L4 / L7 로드밸런서의 기능을 제공하며, 보안 인증서를 처리하는 기능도 제공한다

  • 만약, Ingress 가 여러 도메인을 사용한다면, 각 도메인의 Ip 주소가 다르기에 L4 로드 밸런서의 기능을 사용하고, 한 가지 도메인을 사용하면, 뒤의 Data 를 확인하고 구분해야 하기에 L7 로드 밸런서의 기능을 사용한다
  • L7 은 백엔드에서 L4 의 기능도 수행해준다

Ingress 는 독립적으로 사용이 불가능하고, SVC 와 연결하여 사용해야 한다

Ingress 는 Ingress Controller 와 같이 사용된다. 즉, Ingress Controller 가 Ingress 의 규칙을 참조하여 트래픽을 보내주는 것이다

  • 이런 구조이다

Ingress 배포하기

  • hosts 파일에 External 주소에 도메인 주소를 지정하자

yaml 파일 작성

  • 위와 같이 yml 파일을 작성하자
    • serviceName 은 연결할 서비스 의 이름이다
    • servicePort 는 service 의 Port 이다
    • rewrite-target 은 접속할 디렉토리를 지정한다. / 로 되어있으면, 기본 디렉토리 이기에 http 서비스의 경우 /var/www/html 을 지정하는 것이다
    • rule 의 http 는 서비스하는 유형을 지정하는 것이다. 이는 httpd, nginx 가 아니라 http, https 와 같은 접속 방식을 말하는 것이다
    • host 는 관리할 주소를 지정한다

Ingress Controller 배포

  • nginx 를 이용한 Ingress Controller 를 배포하자
  • 잘 배포되었는지 확인하자
    • 이는 인터넷 상의 yaml 파일을 이용해 배포하는 방식이다

  • 잘 동작중이다

Pod & Service 배포

  • Pod 와 Service 를 배포하자
  • 둘 다 배포하였다

Port 확인

  • Node 의 Port 를 지정안했으므로, 랜덤 포트가 할당된다. 이 포트를 확인하자
  • 31085 Port 이다. 우리는 www.test.pri:31085 로 접속하면, 이는 NodePort 를 거쳐서 Pod 에 접속할 것이다

접속 디렉토리 & Controller 지정

  • 보여줄 디렉토리를 기본으로 설정했으므로 /var/www/html 이 보여진다. /$1 로 설정하면, 기본 디렉토리 뒤에 있는 경로 하나까지 확인해준다. $2 로 하면, 뒤에 경로 두 개까지 확인해준다
    • 이 rewrite target 을 사용하지 않으면, 서비스를 구분하는 경로도 같이 요청이 되므로 오류가 난다 ( ingress 요청 : abc/index.html -> 서비스로의 요청 : abc.index.html )
    • rewrite target 을 사용한다면, / 라고 설정시 ingress 요청이 abc/index.html 이라면, 서비스의 요청은 / 로 간다. 즉, 서비스 구분 경로는 그대로 두고, 하위 경로만 요청할 수 있다
    • $2 로 설정하면, / 뒤에 2 개까지의 경로를 확인하여 서비스에게 /로서 전달한다. 즉 /abc, /abc/dfc 도 모두 / 로 서비스에 요청하여 /index.html 과 같은 하위 경로만 요청해준다

배포 및 확인

  • Ingress 를 배포하자
  • 해당 포트에 대해 방화벽을 열어주자
  • curl 로 잘 가져와진다

우리는 실질적으로 Node 의 Port 에 접속하는 것이다. 즉, Node 의 Port 에 접근한 후, Ingress Controller - Ingress - NodePort Service - Pod 순으로 연결되는 것이다

만약, L4 LB 와 함께 사용한다면, 아래와 같은 구조가 된다

  • Ingress 에서 /$2 와 같은 방식으로 하위 주소까지 다 구분이 가능하기에 굳이 앞에 L7 LB 를 사용할 필요는 없다

하나의 NodePort 는 결국 Node 의 하나의 포트와 연결된다. 따라서, 해당 포트를 명시하여 접속해야 하기에, NodePort를 사용할 경우, Ingress는 사용할 필요가 없다. Ingress 뒤에는 주로 Cluster Ip 서비스를 사용한다!!!

4. 추후에 공부할 것

metallb

K8S 에서 LB 는 Public 과 Openstack 과 같은 클라우드 환경에서 사용이 가능하다. 만약 on-premise 에서 LB 를 사용하고 싶다면, K8S 와 연계가 가능한 별도의 Object 가 필요하다. 이를 metallb 를 통해 제공할 수 있다

HPA

HPA 는 Auto Scaling 을 해준다

  • 오토 스케일링을 위한 테스트 도구로 apache benchmark 와 gunplot 을 사용하면 좋다

http://192.168.1.97/ 에서 파일을 다운받아두자

profile
멋진 엔지니어가 될 때까지

0개의 댓글