인그레스(Ingress)

10137 단어 k8sk8s

인그레스는 주로 클러스터 외부에서 안에 있는 파드에 접근할 때 사용하는 방법이다.

📚 막간 용어 정리
🧩 클러스터(Cluster): 쿠버네티스에서 관리되는 컨테이너화 된 앱을 실행하는 노드 집합
🧩 노드(Node): 클러스터의 일부로, 쿠버네티스에 속한 워커 머신
🧩 서비스(Service): 레이블 셀렉터를 사용해서 파드 집합을 식별하는 쿠버네티스 서비스 (달리 언급하지 않으면 서비스는 클러스터 내에서만 라우팅 가능한 가상 IP를 가지는 것을 가정)

인그레스 개념

출처: kubernetes.io/ko/docs/concepts/services-networking/ingress


인그레스는 클러스터 외부에서 안으로 접근하는 요청들을 어떻게 처리할지 정의해둔 규칙 모음이다.

클러스터 외부에서 접근해야 할 URL을 사용할 수 있도록 하고, 트래픽 로드밸런싱, SSL 인증서 처리, 도메인 기반 가상 호스팅도 제공한다. 인그레스 자체는 이런 규칙들을 정의해둔 자원이고, 실제로 동작시키는 것은 인그레스 컨트롤러이다.

클라우드 서비스를 사용하면 별다른 설정없이 로드밸런서 서비스와 연동해서 인그레스를 사용할 수 있다. 클라우드 서비스를 사용하지 않고 직접 쿠버네티스 클러스터를 구축해서 사용한다면 인그레스 컨트롤러를 직접 인그레스와 연동해야 한다. 이때 가장 많이 사용하는 도구는 쿠버네티스에서 제공하는 ingress-nginx이다. ingress-nginx 컨트롤러는 인그레스에서 설정한 내용을 nginx 환경 설정으로 변경해서 nginx에 적용한다.

인그레스 리소스 설정

인그레스 설정 방식은 다음과 같다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
  	http:
      paths:
      - path: /foos1
        pathType: Prefix
        backend:
          service:
            name: s1
            port:
              number: 80
      - path: /bars2
        pathType: Prefix
        backend:
          service:
            name: s2
            port:
              number: 80
  - host: bar.foo.com
    http:
       paths:
       - backend:
          serviceName: s2
          servicePort: 80

인그레스에는 apiVersion, kind, metadata 필드가 필요하다.

🎀 .metadata.annotations
.metadata.annotations의 하위 필드 설정은 인그레스 컨트롤러마다 다르다. 위 코드는 ingress-nginx 컨트롤러를 사용하기에 nginx.ingress.kubernetes.io/rewrite-target을 키로 하고 /을 값으로 하는 필드 값을 설정했다. / 경로로 리다이렉트 하라는 뜻이다.

🎀 spec.rules
.spec.rules[]의 하위 필드에는 어떤 규칙들을 사용할지 지정할 수 있다. 예를 들어 첫 번째 .spec.rules[].host의 필드 값인 foo.bar.com의 주소로 요청이 들어오면 다음에 설정하는 규칙에 따라 처리한다.

🎀 spec.rules[].http.paths

경로(path) : HTTP 요청이 어떤 경로에서 들어오는 지를 뜻한다.
백엔드(backend) : 서비스와 포트 이름의 조합이다.
경로 유형(pathType): 경로의 유형을 결정한다.

  • Prefix : 경로의 접두사를 / 기준으로 분리한 값과 일치시킨다.
  • Exact : URL 경로의 대소문자를 엄격하게 일치시킨다.

경로 유형 예제 :

종류경로요청 경로일치여부
Prefix/(모든 경로)Y
Exact/foo/fooY
Exact/foo/barN
Exact/foo/foo/N
Exact/foo//fooN
Prefix/foo/foo, /foo/Y
Prefix/foo//foo, /foo/Y
Prefix/aaa/bb/aaa/bbbN
Prefix/aaa/bbb/aaa/bbb/cccY

위의 인그레스 리소스를 해석하면 다음과 같다.

  • foo.bar.com/foos1 으로 오는 요청을 s1이라는 서비스의 80포트로 보내라.
  • foo.bar.com/bars2으로 오는 요청은 s2 서비스의 80포트로 보내라.
  • bar.foo.com 으로 오는 요청은 s2 서비스의 80포트로 보내라.

즉, foo.bar.com으로 요청이 오더라도 뒷부분의 경로에 따라서 /foo1이면 서비스 s1으로 연결되고 bars2면 서비스 s2로 연결되도록 설정된다. 또다른 호스트네임인 bar.foo.com도 서비스 s2로 연결된다.

출처: kubernetes.io/ko/docs/concepts/services-networking/ingress

SSL 설정

TLS 개인 키와 인증서가 포함된 시크릿(Secret)을 지정해서 인그레스를 보호할 수 있다. 시크릿은 쿠버네티스 내부에서 보안이 필요한 설정들을 다룰 때 사용한다.

보통 CA(Certificate Authority) 역할을 하는 공인인증기관에서 사용하려는 도메인의 SSL 인증서를 발급받아서 사용한다.

신뢰받는 인증기관인 CA에 인증서 발급을 요청하면 CA 측에서 관리하는 키와 인증서로 서명한 인증서를 발급한다. 발급받은 인증서를 서버에 설정하면 웹 브라우저에서 통신할 때 서버에 있는 인증서가 유효한 인증서인지 확인한 후 SSL 통신을 한다.

시크릿을 인그레스에 적용시키는 설정 예를 살펴보면 다음과 같다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-ssl
spec:
  tls:
  - hosts:
      - https-example.foo.com
    secretName: testsecret-tls
  rules:
  - host: https-example.foo.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: s1
            port:
              number: 80

.spec의 하위 필드로 .tls[] 필드가 명시되어 있고 .spec.tls[].hosts[] 필드값을 https-example.foo.com이라는 호스트네임을 설정이 되었다. .spec.tls[].secretName 필드에는 시크릿을 사용하기 위해 시크릿 이름인 testsecret-tls이 설정된다.


참고 :
쿠버네티스 문서 - 인그레스(Ingress)
[Book] 쿠버네티스 입문 - 8. 인그레스

좋은 웹페이지 즐겨찾기