본문 바로가기
카테고리 없음

Ingress란? - 2

by BTC_룰루랄라 2022. 7. 13.

반갑습니다!

💙베하💙 누구든 탑승할 수 있는 유임승차 팀의 BTC 룰루랄라 입니다!!💨😉

 

저번 포스팅은 쿠버네티스 기능 중 하나인 Ingress에 대해서 설명 드렸는데요~

이번 포스팅에서는 Kubernetes의 Ingress에 대해서 좀 더 심층적으로 살펴보겠습니다.

 

그럼 시작해 보겠습니다!

룰루랄라~♬

 

 

echo 웹 애플리케이션 배포

Nginx Ingress Controller 설치가 완료되면 echo 웹 애플리케이션을 배포합니다. v1, v2 2가지를 배포합니다.

Ingress Spec중에 rules.host부분을 minikube ip로 변경해야 합니다.

Docker

Docker driver를 사용중이라면 rules.host부분에 127.0.0.1을 사용합니다. v1.echo.127.0.0.1.sslip.io

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echo-v1
spec:
  rules:
    - host: v1.echo.192.168.64.5.sslip.io
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: echo-v1
                port:
                  number: 3000

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-v1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo
      tier: app
      version: v1
  template:
    metadata:
      labels:
        app: echo
        tier: app
        version: v1
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
          livenessProbe:
            httpGet:
              path: /
              port: 3000

---
apiVersion: v1
kind: Service
metadata:
  name: echo-v1
spec:
  ports:
    - port: 3000
      protocol: TCP
  selector:
    app: echo
    tier: app
    version: v1
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echo-v2
spec:
  rules:
    - host: v2.echo.192.168.64.5.sslip.io
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: echo-v2
                port:
                  number: 3000

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-v2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo
      tier: app
      version: v2
  template:
    metadata:
      labels:
        app: echo
        tier: app
        version: v2
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v2
          livenessProbe:
            httpGet:
              path: /
              port: 3000

---
apiVersion: v1
kind: Service
metadata:
  name: echo-v2
spec:
  ports:
    - port: 3000
      protocol: TCP
  selector:
    app: echo
    tier: app
    version: v2

 

v1.18 이하 버전

쿠버네티스 v1.19부터 Ingress Spec 중 rules.http.paths.backend가 변경되었습니다. v1.18 이하라면 pathType을 제거하고 backend를 다음과 같이 변경해주세요.

backend:
  serviceName: echo-v1
  servicePort: 3000

Deployment, Service, Ingress를 생성합니다.

kubectl apply -f echo-v1.yml,echo-v2.yml

# Ingress 상태 확인
kubectl get ingress
kubectl get ing

실행 결과

NAME      CLASS    HOSTS                           ADDRESS        PORTS   AGE
echo-v1   <none>   v1.echo.192.168.64.5.sslip.io   192.168.64.5   80      48s
echo-v2   <none>   v2.echo.192.168.64.5.sslip.io   192.168.64.5   80      48s

v1.echo.192.168.64.5.sslip.io과 v2.echo.192.168.64.5.sslip.io로 접속 테스트합니다.

Docker

Docker driver를 사용중이라면 v1.echo.127.0.0.1.sslip.io:PORT로 테스트합니다. PORT는 ingress-nginx-controller 서비스의 첫번째 항목입니다.

#Ingress 생성 흐름

Ingress가 어떻게 동작하는지 알아봅니다.

API ServerIngressControllerNginx,HAProxy,...ingress.ymlIngress 감시1Nginx 설정 변경2loop설정 변경시자동 적용
  1. Ingress Controller는 Ingress 변화를 체크
  2. Ingress Controller는 변경된 내용을 Nginx에 설정하고 프로세스 재시작

동작방식을 보면 YAML로 만든 Ingress 설정을 단순히 nginx 설정으로 바꾸는 걸 알 수 있습니다. 이러한 과정을 수동으로 하지 않고 Ingress Controller가 하는 것 뿐입니다.

Ingress는 도메인, 경로만 연동하는 것이 아니라 요청 timeout, 요청 max size 등 다양한 프록시 서버 설정을 할 수 있습니다. 상세 설정은 추후 고급편에서 다시 다루겠습니다.

#마무리

Ingress를 사용하면 YAML 설정만으로 도메인, 경로 설정을 손쉽게 할 수 있습니다. 기존에 도메인을 연결하려면 담당자에게 요청하고 설정 파일을 변경한 다음 프로세스 재시작까지 수동으로 작업했는데, 더 이상 그런 과정을 거치지 않아도 됩니다.

 

댓글