[쿠버네티스] 인그레스

황서희·2023년 2월 19일
0
post-thumbnail

인그레스

참조

인그레스 컨트롤러

인그레스 컨트롤러는 내부의 파드를 외부에 노출시키기 위해 사용하는 방법 중 하나이다. 인그레스 리소스가 작동하려면, 클러스터는 실행 중인 인그레스 컨트롤러가 반드시 필요하다. 인그레스 리소스를 생성하더라도 작동시키는 것은 인그레스 컨트롤러이다. 따라서, 인그레스를 작동시키기 위해선 인그레스 컨트롤러를 설치해야 한다. 인그레스는 서비스와는 다르게 주로 L7 로드 밸런서이다.

인그레스 컨트롤러의 종류는 많지만, 주로 Nginx의 것을 사용한다. (ingress-nginx)

인그레스

클러스터 내의 서비스에 대한 외부 접근을 관리하는 L7 프록시이다.

L4의 서비스의 타입은 기본적으로 NodePort이어야 한다. 인그레스는 Pod이고, 외부 클라이언트에서 해당되는 트래픽을 받아 실제 서비스로 보내준다. 인그레스는 L7 로드 밸런서 이므로 L4 로드 밸런서로 라우팅을 해줄 수 있다. 따라서 반드시 필요하다. (EKS를 기준으로 한다면 ALB)

인그레스의 타겟은 NodePort 혹은 LoadBalancer 타입의 서비스이다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: 
	name: minimal-ingress
    annotations:
    	nginx.ingress.kubernetes.io/rewrite-target: /
spec:
	ingressClassName: nginx-example
    rules: #중요!
    - http:
    	paths #경로
        - path: /testpath #경로가 testpath이면
        pathType: Prefix #패스 타입
        backend: # 인그레스 리소스가 바라보고 있는 백엔드 서비스
        	service:
            	name: test #서비스 이름
                port:
                	number: 80 #서비스 포트 주소
        

rules는 인그레스 리소스를 어떤 서비스로 연결해줄지에 대한 규칙이다. 리스트 형식이므로, 여러 개를 지정해 줄 수 있다.

  • 패스타입은 Prefix와 Exact가 있다. Exact는 완전히 똑같아야 하는 것이고, Prefix는 앞의 일부분만 동일하면 된다.
  • Prefix / 인 해당 코드는 모든 경로를 라우팅한단 뜻이다.
  • Exact /foo는 들어오는 경로가 무조건 /foo여야만 한다.
  • Prefix /foo는 foo로 시작하는 모든 경로를 라우팅한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-wildcard-host
spec:
  rules:
  - host: "foo.bar.com" #들어오는 도메인
    http:
      paths:
      - pathType: Prefix
        path: "/bar" #bar로 시작하는 어느 경로든
        backend:
          service:
            name: service1
            port:
              number: 80 #그러면 서비스1의 80포트로 연결
  - host: "*.foo.com" # *.foo.com의 어느 도메인이든 (foo.com은안됨)
    http:
      paths:
      - pathType: Prefix
        path: "/foo" #/foo로 시작하는 어느 경로든
        backend:
          service:
            name: service2 #service2의
            port:
              number: 80 # 80번 포트로 연결

정책을 설정할 때는 작은 범위의 정책을 위에, 큰 정책을 아래에 둬야 한다.

  1. 클라이언트가 인그레스 IP를 타고 들어온다.
  2. 뒤의 경로가 /foo이면 서비스 1의 4200, /bar이면 서비스 2의 8080 포트로 라우팅 한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  rules:
  - host: foo.bar.com #host는 같다.
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 4200
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 8080

  1. 클라이언트가 인그레스 IP를 타고 들어온다.
  2. 호스트가 foo.bar.com이면 서비스 1의 80, bar.foo.com이면 서비스 2의 80 포트로 라우팅 한다.

실습

레플리카셋, 노드포트 서비스, 인그레스 리소스를 생성한다.

cat myapp-ing.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
	name: myapp-ing
spec:
	defaultBackend: #아무런 rules에도 매칭되지 않을 경우 이쪽으로 라우팅
    	service:
        	name: myapp-svc-np
            port:
            	number:80
    rules:
    - host: myapp.example.com
   	  http:
      	paths:
        - path: /
          pathType: Prefix
          backend:
          	service:
            	name: myapp-svc-np
                port:
                	number: 80
  • kubectl get all 에는 인그레스가 잡히지 않는다. kubectl get ing를 해야 나온다.
  • 인그레스를 생성하고 조금 지나면 인그레스에 Node의 IP Address가 잡힌다.

  • host가 없는 상태에서는 IP로 접속해도 라우팅이 가능하지만, host가 생기면 host 주소로 접속해야 라우팅 해준다. IP로 접속하기 위해서는 /etc/hosts에 등록해 줘야 한다.
curl --resolve www.example.com:80:192.168.56.21 http:www.example.com #편법 접속
sudo vi /etc/hosts
192.168.56.21 www.example.com
curl http://www.example.com
profile
다 아는 건 아니어도 바라는 대로

0개의 댓글