본문 바로가기
CICD

[Kubernetes] Ingress(Controller)

by 장중앙 2022. 2. 8.

Ingress란

  • 서비스 앞에 있는 로드벨런스로 클러스터로 유입된 외부의 트래픽을 적절한 마이크로서비스로 라우팅
  • 사용자가 지정한 특정 규칙에 따라 트래픽을 다양한 서비스로 전달하는 Controller
  • 대표적으로 2가지의 사용목적이 존재
    1. Service LoadBalancing
    2. Canary Upgrade
    3. 이외에도 https 인증서 관리에도 사용 가능

 

Ingress의 구성

Ingress Controller

  • 클러스터의 인그레스 리소스를 관리 -> Ingress를 실현할 구현체
  • 일반적으로 인그레스의 작동은 인그레스 컨트롤러가 인식할 수 있는 특정 어노테이션을 추가하여 정의
    • Cloud 환경에서는 각각 제공되는 컨트롤러가 있지만, 자체 운영 중인 클러스터에서는 NGINX을 주로 사용
    • 이외에도 Kong ontour, Taefik 등이 존재

 

Ingress Controller의 구조

 

 

Service LoadBalancing

외부에서 쿠버네티스 클러스터 내부에 들어오는 네트워크 요청을 어떻게 처리할 지 정의

별도의 IP LoadBalancing 장비 필요없이 Ingress만 사용

 


Ingress Controller로 구성한 Service LoadBalancing


Canary Upgrade

  • 버전 업데이트 전의 테스트에 사용
  • V1, V2를 각각 Service에 연결하고 Ingress를 사용하면 원하는 트래픽 배분에 맞게 분산 가능

Ingress Controller로 구성한 Canary Upgrade


Ingress Controller을 이용한 https 인증서 관리

 



실습


Ingress Controller 설치

Nginx Controller 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml

 

생성된 Ingress Controller 확인

ingress-nginx 네임스페이스가 생성됨

해당 네임스페이스에 진입하면

Nginx Ingress에 대한 디플로이먼트, 파드, 서비스가 생성됨

실습 진행을 위해 Service의 http와 SSL Nodeport 확인


1. Service Loadbalancing

3개의 Pod/Service 생성

각각의 Pod는 MSA에 기초한 서비스 페이지라고 가정

apiVersion: v1
kind: Pod
metadata:
  name: pod-shopping
  labels:
    category: shopping
spec:
  containers:
  - name: container
    image: kubetm/shopping
---
apiVersion: v1
kind: Service
metadata:
  name: svc-shopping
spec:
  selector:
    category: shopping
  ports:
  - port: 8080
apiVersion: v1
kind: Pod
metadata:
  name: pod-customer
  labels:
    category: customer
spec:
  containers:
  - name: container
    image: kubetm/customer
---
apiVersion: v1
kind: Service
metadata:
  name: svc-customer
spec:
  selector:
    category: customer
  ports:
  - port: 8080
apiVersion: v1
kind: Pod
metadata:
  name: pod-order
  labels:
    category: order
spec:
  containers:
  - name: container
    image: kubetm/order
---
apiVersion: v1
kind: Service
metadata:
  name: svc-order
spec:
  selector:
    category: order
  ports:
  - port: 8080

 

생성된 Pod 확인

 

Ingress 생성

생성한 3개의 Pod를 매칭하여 설정

rule

Path Service Name
/ svc-shopping
/customer svc-customer
/order svc-order
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: service-loadbalancing
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-shopping
            port:
              number: 8080
      - path: /customer
        pathType: Prefix
        backend:
          service:
            name: svc-customer
            port:
              number: 8080
      - path: /order
        pathType: Prefix
        backend:
          service:
            name: svc-order
            port:
              number: 8080

생성된 Ingress 확인

 

Master Node의 IP와 NodePort(30431)로 각 Pod에 접근 확인

해당 IP로 접근하는 트래픽의 요청(Path)에 따라 각기 다른 Service(Pod)에 접근하는 것을 확인 할 수 있다.


2. Canary Upgrade

기존 서비스(V1) Pod/Service 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-v1
  labels:
    app: v1
spec:
  containers:
  - name: container
    image: kubetm/app:v1
---
apiVersion: v1
kind: Service
metadata:
  name: svc-v1
spec:
  selector:
    app: v1
  ports:
  - port: 8080

 

테스트할 새로운 서비스(V2) Pod/Service 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-v2
  labels:
    app: v2
spec:
  containers:
  - name: container
    image: kubetm/app:v2
---
apiVersion: v1
kind: Service
metadata:
  name: svc-v2
spec:
  selector:
    app: v2
  ports:
  - port: 8080

 

생성된 2개의 Pod/Service 확인

 

기본 Ingress 생성

Host name으로 접근하는 것 또한 확인 하기 위해 

host : "www.app.com"으로 설정 

해당 도메인으로 접근하면 svc-v1으로 접근하도록 설정

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app
spec:
  ingressClassName: nginx
  rules:
  - host: www.app.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-v1
            port:
              number: 8080

 

해당 도메인을 VM의 DNS에 저장

cat << EOF >> /etc/hosts
192.168.56.30 www.app.com
EOF

 

이 후 도메인을 이용한 접근 확인

 

Canary test를 위해 svc-v2와 연결할 Ingress 생성

옵션으로 weight : 10을 설정 -> 해당 host로 접근하는 트래픽의 10%를 v2 Pod로 접근되게끔 설정

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: canary-v2
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
  ingressClassName: nginx
  rules:
  - host: www.app.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-v2
            port:
              number: 8080

 

 

트래픽 확인

1초마다 www.app.com에  트래픽을 전송

while true; do curl www.app.com:30431/version; sleep 1; done

정확한 비율은 확인안되지만 간간히 v2가 출력되는 것을 확인


 

댓글