본문 바로가기
INFRA/Operation

쿠버네티스 이론 STEP6 Service (3) Ingress - 2

by BTC_뚜벅이 2022. 8. 23.

ABTCEFG♪  안녕하세요, 여러분!

 

BTC_뚜벅이입니다.

 

지난 주에 Ingress와 Ingress controller에 대한 개념에 대해 알아보았는데요.

 

이번 주는 Ingress와 Ingress controller를 구동해서 직접 확인해보는 시간을 가지도록 할게요~

 

실습을 위해 EC2 위에 단일 클러스터를 구성해서 진행해볼게요.

 

로컬 가상머신 환경에서도 실습을 따라하실 수 있어요.

 

관련 보안그룹은 열어줘야 실습이 가능합니다!

 

오늘의 전체적인 순서는 아래와 같습니다.

 

1. helm chart를 이용해서 Ingress controller 설치

 

2. sslip 서비스 이용하여 DNS 얻기

 

3. 도메인 기반 라우팅 테스트하기

 

4. TLS 설정하기

 


 

1. helm chart를 이용해서 Ingress controller 설치

 

간편한 ingress controller 설치를 위해 helm chart를 활용하려고 해요.

설치하는 방법부터 진행해서 ingress controller를 내려받아 구동하는 단계입니다.

## helm 설치 ##

$ curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
$ sudo apt-get install apt-transport-https --yes
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
$ sudo apt-get update
$ sudo apt-get install helm
$ helm version --short
$ source <(helm completion bash)

## ingress controller 설치 ##

$ kubectl create ns nginx-ctrl
$ kubectl get ns |grep nginx-ctrl
$ helm repo add nginx-stable https://helm.nginx.com/stable
$ helm repo update
$ helm install nginx-ingress nginx-stable/nginx-ingress --version 1.40.3 -n nginx-ctrl
$ kubectl get svc,pod -n nginx-ctrl

# NAME                                           READY   STATUS    RESTARTS   AGE
# nginx-ingress-nginx-ingress-747c9cb6db-6xksb   1/1     Running   0          23s

# NAME                          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
# nginx-ingress-nginx-ingress   LoadBalancer   10.103.85.5   <pending>     80:32681/TCP,443:30233/TCP   93s

 

 

2. sslip 서비스 이용하여 DNS 얻기

 

sslip란 ip에 sslip.io에서 제공하는 DNS를 추가하여 도메인처럼 인식하게 하는 것입니다.

내부 Ingress의 IP 확인하고 sslip를 입력할게요.

그 다음 pod와 svc를 배포 후 yaml 파일로 ingress를 만들어 잘 접속 되는지 확인해보도록 할게요!

$ kubectl describe svc -n nginx-ctrl nginx-ingress-nginx-ingress |grep IP
# 10.103.85.5

$ nslookup 10.103.85.5.sslip.io
# Non-authoritative answer:
# Name: 10.103.85.5.sslip.io
# Address: 10.103.85.5

$ kubectl run nginx-1 --image nginx --expose --port 80

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: nginx-1
spec:
  rules:
  - host: 10.103.85.5.sslip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-1
            port:
              number: 80
              
$ kubectl apply -f ingress.yaml
$ curl 10.103.85.5.sslip.io

 

curl의 결과입니다!

pod와 ingress가 잘 연결된 것을 확인할 수 있습니다.

 

yaml 파일에서 간략하게 설명을 덧붙이자면 아래와 같습니다!

 

annotation : Ingress가 NGINX Ingress Controller에 의해 처리됨을 명시
rules.host : 특정 도메인으로 들어오는 트래픽에 대해 라우팅 정의 생략시 모든 호스트 트래픽을 처리
rules.http.paths.path : Ingress path 정의
rules.http.paths.backend.service : Ingress 트래픽을 받을 Service와 포트를 정의

 

 

3. 도메인 기반 라우팅 테스트하기

 

도메인 기반 라우팅 테스트를 위해 nginx와 apache pod,svc를 배포 후 yaml 파일에서 각각 다른 호스트로 지정을 합니다.

그 후 위처럼 curl 명령어로 접근해볼게요.

$ kubectl run apache-1 --image httpd --expose --port 80
$ kubectl run nginx-2 --image nginx --expose --port 80

# domain-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: apache-1
spec:
  rules:
  - host: apache.10.103.85.5.sslip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: apache-1
            port:
              number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: nginx-2
spec:
  rules:
  - host: nginx.10.103.85.5.sslip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-2
            port:
              number: 80
              
$ kubectl apply -f domain-ingress.yaml

$ curl apache.10.103.85.5.sslip.io
$ curl nginx.10.103.85.5.sslip.io

 

curl의 결과입니다!

이처럼 IP 주소는 동일해도 도메인 주소 기준으로 다른 서비스로 트래픽을 라우팅하는 것을 확인할 수 있습니다.

 

 

4. TLS 설정하기

 

마지막으로 ingress를 사용해서 인증서를 붙이는 작업을 해볼건데요.

ingress controller가 TLS를 사용하기 위해서 Ingress에 certificate와 private key를 연결시켜야해요.

키와 시크릿을 생성하고 yaml파일에서 이를 연동하는 작업을 해보고 결과를 보도록 할게요.

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=apache-tls.10.111.111.131.sslip.io"
ll
$ kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
$ kubectl run apache-2 --image httpd --expose --port 80

# apache-tls.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: apache-tls
spec:
  tls:
  - hosts:
      - apache-tls.10.103.85.5.sslip.io
    secretName: tls-secret
  rules:
  - host: apache-tls.10.103.85.5.sslip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: apache-2
            port:
              number: 80
              
$ kubectl apply -f apache-tls.yaml

 

최종적으로 아래와 같이 tls를 추가한 ingress 또한 잘 작동하고 있는 것을 확인할 수 있습니다.

 

 

오늘은 ingress에 대해 설치하고 활용하는 방법에 대해 간략하게 알아봤는데요.

이 외에도 Path 기반 라우팅, HTTP Authentication 기능도 있습니다.

Ingress를 공부하며 포스팅에 생략되었던 기능들도 구현해보시는건 어떨까요?

댓글