새소식

Recent Study/Kubernetes 학습과정

17. Ingress

  • -

1. Ingress 사용 목적

Ingress 사용 목적으로 대표적인 Service LoadBalancing, Canary Upgrade가 있습니다.

 

 

 Service LoadBalancing은 만약 쇼핑몰을 운영 중이라고 가정했을 때 쇼핑페이지와 고객센터, 주문 서비스를 Pod별로 각각 만듭니다. 이렇게 애플리케이션을 나누면 독립적이기 때문에 하나 장애가 생기더라도 다른 서비스는 영향이 없습니다. 또한 외부에서 연결할 수 있도록 각각 서비스를 달아주고, 사용자들로 하여금 쇼핑페이지에 접근하기 위해서는 www.mall.com  도메인 이름으로 고객센터에 접근하려면 /customer, 주문 서비스로 접근하려면 /order 붙여서 접근하도록 하고 싶을 때 일반적으로는 각각의 Path에 따라 각 서비스 IP를 이어줄 수 있는 L4, L7 스위치라는 장비가 있어야 합니다. 하지만 k8s에서는 Ingress라는 오브젝트가 그 역할을 대신 해줍니다.

 

 

 

2. Ingress 구조

 

 

 Ingress 오브젝트는 k8s가 설치되어 있으면 바로 만들 수 있습니다. Ingress에는 Host로 도메인 이름을 넣을 수 있고, 이 도메인으로 들어오는 트래픽은 Path에 따라 원하는 서비스로 연결을 하라는 내용이 주 설정 내용입니다. 이것을 실현할 구현체가 필요한데, 별도 플러그인을 설치해야 합니다. 이를 Ingress Controller라고 하고 대표적으로 Nginx, Kong이 있습니다.

 

 만약 Nginx를 설치하게 되면, Nginx에 대한 Namespace가 생기고, 이 위에 Deployment, ReplicaSet이 만들어지면서 실제 Ingress 구현체인 Nginx Pod가 만들어집니다. 그러면 생성된 Pod가 Ingress Rule이 있는지 보고 있다면 그 Rule대로 서비스에 연결을 해주는 역할을 해줍니다. 그래서 이 Rule에 따라 해당 서비스에 트래픽이 전달되려면, 외부에서 접근하는 사용자들의 트래픽은 Nginx Pod를 지나야 되기 때문에 외부에서 접근할 수 있는 서비스를 하나 만들어서 이 Pod에 연결해줘야 합니다.

 

 그래서 Ingress Rule에서 지정한 도메인으로 접근이 오면, 이 서비스를 통해 Nginx Pod로 트래픽이 들어와서 Rule에 따라 지정된 서비스와 Pod에 접근할 수 있게 됩니다. 그리고 Ingress2 처럼 더 추가할 수 있는데 다른 도메인을 주고 Path 없이 바로 서비스로 연결 할 수 있습니다.

 

 

 

3. Ingress 기능

 

 

1) Service Loadbalancing

: 각각의 업무별로 Pod, Service를 생성합니다. Nginx 컨트롤러가 설치되어 있고, 이 Pod의 외부에서 연결이 되도록 노드 포트 서비스도 연결이 되어 있기 떄문에 마스터의 Host IP인 192.168.0.30의 30431 포트로 접근하면 해당 Pod의 80번 포트로 트래픽이 전송됩니다. 이렇게 환경이 구성된 상태에서 Ingress를 만들고, Rule을 각 Path에 따라 의도하는 서비스로 매칭을 시켜주면, 준비는 끝났습니다. 

 

 

2) Canary Upgrade

: www.app.com  도메인 이름으로 사용자가 접근을 하면 svc-c1 이름의 서비스로 연결이 되는 구성이 되어 있습니다. 여기서 Canary Upgrade를 테스트할 Pod와 서비스를 띄우고, Ingress를 하나 더 만드는데 호스트 이름은 www.app.com으로 똑같고 서비스 네임을 v2로 주면 위와 같이 연결고리가 만들어집니다. 중요한 점은 새로 만든 Ingress에 weight 10%를 주게 되면 해당 도메인 이름으로 접근하는 트래픽의 10%는 v2 Pod로 흘러가서 테스팅을 하게 됩니다. 추가로 특정 나라별로 테스트를 하고 싶을 때 Header 옵션을 이용하면 이 ㅈ사이트에 접근하는 언어가 kr일 때 100% 트래픽으로 v2 Pod에 접근하게 할 수 있습니다.

 

 

3) Https

: 이는 Pod 자체에서 인증서 기능을 제공하기 힘들 때 이용하면 좋습니다. 위와 다른 부분은 Nginx Pod로 Https를 사용하려면 443 포트를 연결해야합니다. Ingress를 만들 때 호스트 도메인 이름과 서비스를 연결을 하고 TLS라는 옵션이 있습니다. secretName으로 실제 Secret 오브젝트를 연결하고, 이 Secret 안에는 데이터 값을 인증서를 남기고 있는데 이렇게 구성을 하면 사용자가 도메인 이름 앞에 https를 붙여야만 접근을 할 수 있게 됩니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.