Kubernetes

Kubernetes Ingress 설정

아르비스 2022. 6. 21. 15:50

Kubernetes Service & Ingress

 

1. Service

pod은 Controller에 의해 관리되기 때문에 한군데에 고정되어있지 않습니다.

서비스를 사용하게 되면 pod가 클러스터 내 어디에 있던지 상관없이 고정된 주소를 사용해서 접근이 가능하게 됩니다.

ClusterIP

  • 가장 기본 타입
  • 클러스터 내부의 노드에서 접근가능
  • 클러스터 외부에서는 접근불가

NodePort

  • 각 노드의 지정된 포트를 할당하는 방식
  • 노드의 포트를 사용하기 때문에 클러스터 외부나 내부 모두 접근가능
  • 특이점 : pod이 1번노드에 떠있다고 하더라도 2번노드의 ip로 접근가능

LoadBalancer

  • 클라우드 서비스를 사용할 때 사용가능한 옵션
  • pod을 클라우드에서 제공하는 로드밸런서와 연결해 해당 로드밸런서의 ip를 이용 외부에서 접근할 수 있게 해줌
  • EXTERNAL-IP에 IP가 표시됨

ExternalName

  • 클러스터 내부에서 외부로 접근할 때 주로 사용
  • 이 서비스로 접근하면 설정해둔 CNAME값으로 연결되어 클러스터 외부로 접근할 수 있음

kube-proxy란?
쿠버네티스 클러스터의 각 노드마다 실행되고 있으면서
클러스터 내부 IP로 연결되기 바라는 요청을 적절한 곳으로 전달해주는 역할을 합니다.

2. Ingress

클러스터 외부에서 내부로 접근하는 요청을 어떻게 처리할지 정리해둔 규칙들의 모음입니다.

  • 외부에서 접근가능한 URL
  • 트래픽 로드밸런싱
  • SSL/TLS termination
  • ip가아닌 이름기반 주소처리

등이 가능합니다.
이러한 설정들을 ingress라고 하고, 실제 행위자는 ingress controller입니다.

쿠버네티스에서 공식적으로 제공하는 ingress controller는 두개입니다.

  1. ingress-gce
  2. ingress-nginx

gce같은경우는 구글클라우드를 사용하면 자동으로 사용할 수 있고 직접 클러스터에 설치해서 사용할 수 있는것은 ingress-nginx입니다.

그럼 실습으로 좀 더 자세하게 알아보겠습니다.

실습

ingress 규칙 정의

$ vim ingress-controller.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  #- host: foo.bar.com     # host를 명시하지 않으면 ip로 연결
  - http:
      paths:               # 각 path는 백엔드와 연결됨
      - path: /testpath
        backend:           # 연결될 서비스이름과 port
          serviceName: test
          servicePort: 80

Tip) Host를 지정해야 할 경우

spec:
 rules:
 - host: foo.bar.com
   http:
     paths:
     - path: /testpath
       backend: 

위와 같이 host를 지정하였으면 밑의 http는 “-“을 빼주어야 합니다.
http도 “-“를 붙이게 되면 위의 host와는 별도의 블럭으로 취급되어 적용이 안됩니다.

ingress배포

$ kubectl apply -f ingress-controller.yaml
$ kubectl get ingress

상세 내용 확인

$ kubectl describe ingress test-ingress


/testpath로 접속하면 test서비스의 80포트로 연결된다는 규칙을 확인할 수 있습니다.

ingress controller(ingress-nginx) 생성

Nginx Ingress Controller/Deployment Guide

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

$ kubectl get deployment -A

 

ingress contoller에 접근하기 위한 서비스 생성

$ kubectl expose deploy nginx-ingress-controller --type=NodePort -n ingress-nginx

ip:port로 접근


아무 path를 설정하지 않았을 경우 default 페이지가 뜨게됩니다.
위에서 default로 설정을 하지 않았기 때문에 404에러가 뜹니다.

위의 ingress규칙대로 /testpath로 이동해봅시다.


설정은 있지만, 서비스가 뜨지 않았으므로 503에러가 발생합니다.

서비스 생성

/testpath와 이어질 서비스를 올려줍니다.

 

$ kubectl apply -f deployments-nginx.yaml
$ kubectl expose deploy nginx-deployment --name test
$ kubectl get svc

새로고침

ingress를 사용하지 않았다면 서비스타입이 ClusterIP니까 외부에서 접근이 안되어야 하는게 정상입니다.

하지만 다시 페이지로 돌아가서 새로고침을 하면 :


ingress controller에서 서비스로 연결을 시켜주는 것을 확인할 수 있습니다.

 

==================================================

$ kubectl get svc -n ingress-nginx

kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.99.184.25     <none>        80:30572/TCP,443:31912/TCP   15d
ingress-nginx-controller-admission   ClusterIP   10.109.109.217   <none>        443/TCP                      15d